Skip to content

Commit

Permalink
Add repository aware caching
Browse files Browse the repository at this point in the history
  • Loading branch information
libmartinito committed Jun 26, 2024
1 parent 64f3ea0 commit abc4401
Show file tree
Hide file tree
Showing 26 changed files with 168 additions and 28 deletions.
8 changes: 6 additions & 2 deletions dockerfiles/bun-1.1.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# syntax=docker/dockerfile:1.7-labs
FROM oven/bun:1.1.4-alpine

RUN apk add --no-cache 'git>=2.40'
Expand All @@ -6,8 +7,8 @@ ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="package.json,bun.lockb"

WORKDIR /app

COPY package.json ./
COPY bun.lockb ./
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# For reproducible builds.
# This will install the exact versions of each package specified in the lockfile.
Expand All @@ -17,3 +18,6 @@ RUN bun install --frozen-lockfile
RUN mkdir -p /app-cached
# If the node_modules directory exists, move it to /app-cached
RUN if [ -d "/app/node_modules" ]; then mv /app/node_modules /app-cached; fi

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/cpp-20.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
# syntax=docker/dockerfile:1.7-labs
FROM gcc:12.2.0-bullseye

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apt-get update && \
apt-get install --no-install-recommends -y cmake=3.18.* && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# TODO: Clean this up when we move to CPP23
RUN printf "cd \${CODECRAFTERS_SUBMISSION_DIR} && cmake . && make && (echo '#!/bin/sh\nexec \${CODECRAFTERS_SUBMISSION_DIR}/server \"\$@\"' > your_git.sh) && chmod +x your_git.sh" > /codecrafters-precompile.sh

# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 6 additions & 2 deletions dockerfiles/dotnet-8.0.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
# syntax=docker/dockerfile:1.7-labs
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine

RUN apk add --no-cache 'git>=2.40'

COPY codecrafters-git.csproj /app/codecrafters-git.csproj
COPY codecrafters-git.sln /app/codecrafters-git.sln

RUN mkdir /app/src
RUN (echo 'System.Console.WriteLine("If you are seeing this, there is something wrong with our caching mechanism! Please contact us at [email protected].");' > /app/src/Program.cs) > /dev/null

WORKDIR /app
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# This saves nuget packages to ~/.nuget
RUN dotnet build --configuration Release .
Expand All @@ -24,3 +25,6 @@ RUN echo "cd \${CODECRAFTERS_SUBMISSION_DIR} && dotnet build --configuration Rel
RUN chmod +x /codecrafters-precompile.sh

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="codecrafters-git.csproj,codecrafters-git.sln"

# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 7 additions & 1 deletion dockerfiles/go-1.13.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# syntax=docker/dockerfile:1.7-labs
FROM golang:1.13-alpine

RUN apk add --no-cache 'git>=2.43'
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.43'
# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/go-1.16.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM golang:1.16-alpine

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 6 additions & 1 deletion dockerfiles/go-1.19.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
# syntax=docker/dockerfile:1.7-labs
FROM golang:1.19-alpine

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="go.mod,go.sum"

WORKDIR /app

COPY go.mod go.sum ./
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN ash -c "set -exo pipefail; go mod graph | awk '{if (\$1 !~ \"@\") {print \$2}}' | xargs -r go get"

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 6 additions & 1 deletion dockerfiles/go-1.21.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# syntax=docker/dockerfile:1.7-labs
FROM golang:1.21-alpine

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="go.mod,go.sum"

WORKDIR /app

COPY go.mod go.sum ./
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# Starting from Go 1.20, the go standard library is no loger compiled
# setting the GODEBUG environment to "installgoroot=all" restores the old behavior
Expand All @@ -13,3 +15,6 @@ RUN GODEBUG="installgoroot=all" go install std
RUN ash -c "set -exo pipefail; go mod graph | awk '{if (\$1 !~ \"@\") {print \$2}}' | xargs -r go get"

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 6 additions & 1 deletion dockerfiles/go-1.22.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# syntax=docker/dockerfile:1.7-labs
FROM golang:1.22-alpine

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="go.mod,go.sum"

WORKDIR /app

COPY go.mod go.sum ./
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# Starting from Go 1.20, the go standard library is no loger compiled
# setting the GODEBUG environment to "installgoroot=all" restores the old behavior
Expand All @@ -13,3 +15,6 @@ RUN GODEBUG="installgoroot=all" go install std
RUN ash -c "set -exo pipefail; go mod graph | awk '{if (\$1 !~ \"@\") {print \$2}}' | xargs -r go get"

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
10 changes: 6 additions & 4 deletions dockerfiles/haskell-9.4.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# syntax=docker/dockerfile:1.7-labs
FROM haskell:9.4.6-buster

WORKDIR /app
Expand All @@ -11,13 +12,11 @@ RUN echo "allow-different-user: true" >> /etc/stack/config.yaml
RUN echo "install-ghc: false" >> /etc/stack/config.yaml
RUN echo "system-ghc: true" >> /etc/stack/config.yaml

COPY stack.yaml package.yaml stack.yaml.lock /app/
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# Dummy static content to circumvent the /app doesn't exist warning
RUN mkdir /app/src
RUN mkdir /app/app
RUN echo 'main :: IO ()' >> /app/app/Main.hs
RUN echo 'main = putStrLn "Hello, World!"' >> /app/app/Main.hs

RUN stack build
RUN stack clean hs-git-clone
Expand All @@ -30,3 +29,6 @@ RUN echo "cd \${CODECRAFTERS_SUBMISSION_DIR} && cp -r /tmp/.stack-work . && stac
RUN chmod +x /codecrafters-precompile.sh

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="stack.yaml,package.yaml,stack.yaml.lock"

# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 6 additions & 2 deletions dockerfiles/java-21.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM maven:3.9.5-eclipse-temurin-21-alpine

COPY pom.xml /app/pom.xml

WORKDIR /app
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# Download the dependencies
RUN mvn -B package -Ddir=/tmp/codecrafters-git-target
Expand All @@ -13,4 +15,6 @@ RUN mv /app/target /app-cached # Is this needed?

# Pre-compile steps
RUN printf "cd \${CODECRAFTERS_SUBMISSION_DIR} && mvn -B package -Ddir=/tmp/codecrafters-git-target && sed -i 's/^\(mvn .*\)/#\1/' ./your_git.sh" > /codecrafters-precompile.sh
RUN chmod +x /codecrafters-precompile.sh
RUN chmod +x /codecrafters-precompile.sh
# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/kotlin-1.3.72.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# syntax=docker/dockerfile:1.7-labs
FROM zenika/kotlin:1.3.72-jdk11-slim

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apt-get update && \
apt-get install --no-install-recommends -y git=1:2.* && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/kotlin-1.4.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
# syntax=docker/dockerfile:1.7-labs
FROM zenika/kotlin:1.4.20-jdk11-slim

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apt-get update && \
apt-get install --no-install-recommends -y git=1:2.* && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 7 additions & 1 deletion dockerfiles/nodejs-18.Dockerfile
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
FROM node:18.18.0-alpine3.17
# syntax=docker/dockerfile:1.7-labs
FROM node:18.18.0-alpine3.17
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 6 additions & 2 deletions dockerfiles/nodejs-21.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
# syntax=docker/dockerfile:1.7-labs
FROM node:21.7-alpine3.19

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="package.json,package-lock.json"

WORKDIR /app

COPY package.json ./
COPY package-lock.json ./
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

# If dependencies in the package lock do not match those in package.json, instead of updating the package lock, npm ci will exit with an error.
RUN npm ci

RUN mkdir -p /app-cached
# If the node_modules directory exists, move it to /app-cached
RUN if [ -d "/app/node_modules" ]; then mv /app/node_modules /app-cached; fi

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/python-3.11.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM python:3.11-alpine

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/python-3.12.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM python:3.12-alpine

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/python-3.7.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM jfloff/alpine-python:3.7

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/python-3.8.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM jfloff/alpine-python:3.8

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/ruby-2.7.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM ruby:2.7-alpine

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 7 additions & 0 deletions dockerfiles/ruby-3.2.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# syntax=docker/dockerfile:1.7-labs
FROM ruby:3.2-alpine

# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
7 changes: 6 additions & 1 deletion dockerfiles/ruby-3.3.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
# syntax=docker/dockerfile:1.7-labs
FROM ruby:3.3-alpine

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="Gemfile,Gemfile.lock"

WORKDIR /app

COPY Gemfile Gemfile.lock ./
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app

RUN bundle install --verbose

RUN apk add --no-cache 'git>=2.40'

# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 6 additions & 2 deletions dockerfiles/rust-1.62.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
# syntax=docker/dockerfile:1.7-labs
FROM rust:1.62-buster

RUN apt-get update && \
apt-get install --no-install-recommends -y git=1:2.* && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

COPY Cargo.toml /app/Cargo.toml
COPY Cargo.lock /app/Cargo.lock

RUN mkdir /app/src
RUN echo 'fn main() { println!("Hello World!"); }' > /app/src/main.rs

WORKDIR /app
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app
RUN cargo build --release --target-dir=/tmp/codecrafters-git-target

RUN rm /tmp/codecrafters-git-target/release/git-starter-rust
Expand All @@ -30,3 +31,6 @@ RUN chmod +x /codecrafters-precompile.sh

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="Cargo.toml,Cargo.lock"


# Once the heave steps are done, we can copy all files back
COPY . /app
8 changes: 6 additions & 2 deletions dockerfiles/rust-1.68.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
# syntax=docker/dockerfile:1.7-labs
FROM rust:1.68-buster

RUN apt-get update && \
apt-get install --no-install-recommends -y git=1:2.* && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

COPY Cargo.toml /app/Cargo.toml
COPY Cargo.lock /app/Cargo.lock

RUN mkdir /app/src
RUN echo 'fn main() { println!("Hello World!"); }' > /app/src/main.rs

WORKDIR /app
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
COPY --exclude=.git --exclude=README.md . /app
RUN cargo build --release --target-dir=/tmp/codecrafters-git-target

RUN rm /tmp/codecrafters-git-target/release/git-starter-rust
Expand All @@ -30,3 +31,6 @@ RUN chmod +x /codecrafters-precompile.sh

ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="Cargo.toml,Cargo.lock"


# Once the heave steps are done, we can copy all files back
COPY . /app
Loading

0 comments on commit abc4401

Please sign in to comment.