Skip to content

Commit abc4401

Browse files
committed
Add repository aware caching
1 parent 64f3ea0 commit abc4401

26 files changed

+168
-28
lines changed

dockerfiles/bun-1.1.Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM oven/bun:1.1.4-alpine
23

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

78
WORKDIR /app
89

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

1213
# For reproducible builds.
1314
# This will install the exact versions of each package specified in the lockfile.
@@ -17,3 +18,6 @@ RUN bun install --frozen-lockfile
1718
RUN mkdir -p /app-cached
1819
# If the node_modules directory exists, move it to /app-cached
1920
RUN if [ -d "/app/node_modules" ]; then mv /app/node_modules /app-cached; fi
21+
22+
# Once the heave steps are done, we can copy all files back
23+
COPY . /app

dockerfiles/cpp-20.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM gcc:12.2.0-bullseye
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apt-get update && \
48
apt-get install --no-install-recommends -y cmake=3.18.* && \
59
apt-get clean && \
610
rm -rf /var/lib/apt/lists/*
711

812
# TODO: Clean this up when we move to CPP23
913
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
14+
15+
# Once the heave steps are done, we can copy all files back
16+
COPY . /app

dockerfiles/dotnet-8.0.Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine
23

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

5-
COPY codecrafters-git.csproj /app/codecrafters-git.csproj
6-
COPY codecrafters-git.sln /app/codecrafters-git.sln
76

87
RUN mkdir /app/src
98
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
109

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

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

2627
ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="codecrafters-git.csproj,codecrafters-git.sln"
28+
29+
# Once the heave steps are done, we can copy all files back
30+
COPY . /app

dockerfiles/go-1.13.Dockerfile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM golang:1.13-alpine
23

3-
RUN apk add --no-cache 'git>=2.43'
4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
7+
RUN apk add --no-cache 'git>=2.43'
8+
# Once the heave steps are done, we can copy all files back
9+
COPY . /app

dockerfiles/go-1.16.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM golang:1.16-alpine
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/go-1.19.Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM golang:1.19-alpine
23

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

56
WORKDIR /app
67

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

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

1113
RUN apk add --no-cache 'git>=2.40'
14+
15+
# Once the heave steps are done, we can copy all files back
16+
COPY . /app

dockerfiles/go-1.21.Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM golang:1.21-alpine
23

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

56
WORKDIR /app
67

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

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

1517
RUN apk add --no-cache 'git>=2.40'
18+
19+
# Once the heave steps are done, we can copy all files back
20+
COPY . /app

dockerfiles/go-1.22.Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM golang:1.22-alpine
23

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

56
WORKDIR /app
67

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

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

1517
RUN apk add --no-cache 'git>=2.40'
18+
19+
# Once the heave steps are done, we can copy all files back
20+
COPY . /app

dockerfiles/haskell-9.4.Dockerfile

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM haskell:9.4.6-buster
23

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

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

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

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

3231
ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="stack.yaml,package.yaml,stack.yaml.lock"
32+
33+
# Once the heave steps are done, we can copy all files back
34+
COPY . /app

dockerfiles/java-21.Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM maven:3.9.5-eclipse-temurin-21-alpine
23

3-
COPY pom.xml /app/pom.xml
44

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

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

1416
# Pre-compile steps
1517
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
16-
RUN chmod +x /codecrafters-precompile.sh
18+
RUN chmod +x /codecrafters-precompile.sh
19+
# Once the heave steps are done, we can copy all files back
20+
COPY . /app

dockerfiles/kotlin-1.3.72.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM zenika/kotlin:1.3.72-jdk11-slim
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apt-get update && \
48
apt-get install --no-install-recommends -y git=1:2.* && \
59
apt-get clean && \
610
rm -rf /var/lib/apt/lists/*
11+
12+
# Once the heave steps are done, we can copy all files back
13+
COPY . /app

dockerfiles/kotlin-1.4.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM zenika/kotlin:1.4.20-jdk11-slim
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apt-get update && \
48
apt-get install --no-install-recommends -y git=1:2.* && \
59
apt-get clean && \
610
rm -rf /var/lib/apt/lists/*
11+
12+
# Once the heave steps are done, we can copy all files back
13+
COPY . /app

dockerfiles/nodejs-18.Dockerfile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
FROM node:18.18.0-alpine3.17
1+
# syntax=docker/dockerfile:1.7-labs
2+
FROM node:18.18.0-alpine3.17
3+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
4+
COPY --exclude=.git --exclude=README.md . /app
5+
6+
# Once the heave steps are done, we can copy all files back
7+
COPY . /app

dockerfiles/nodejs-21.Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM node:21.7-alpine3.19
23

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

56
WORKDIR /app
67

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

1011
# 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.
1112
RUN npm ci
1213

1314
RUN mkdir -p /app-cached
1415
# If the node_modules directory exists, move it to /app-cached
1516
RUN if [ -d "/app/node_modules" ]; then mv /app/node_modules /app-cached; fi
17+
18+
# Once the heave steps are done, we can copy all files back
19+
COPY . /app

dockerfiles/python-3.11.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM python:3.11-alpine
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/python-3.12.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM python:3.12-alpine
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/python-3.7.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM jfloff/alpine-python:3.7
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/python-3.8.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM jfloff/alpine-python:3.8
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/ruby-2.7.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM ruby:2.7-alpine
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/ruby-3.2.Dockerfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM ruby:3.2-alpine
23

4+
# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
5+
COPY --exclude=.git --exclude=README.md . /app
6+
37
RUN apk add --no-cache 'git>=2.40'
8+
9+
# Once the heave steps are done, we can copy all files back
10+
COPY . /app

dockerfiles/ruby-3.3.Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM ruby:3.3-alpine
23

34
ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="Gemfile,Gemfile.lock"
45

56
WORKDIR /app
67

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

911
RUN bundle install --verbose
1012

1113
RUN apk add --no-cache 'git>=2.40'
14+
15+
# Once the heave steps are done, we can copy all files back
16+
COPY . /app

dockerfiles/rust-1.62.Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM rust:1.62-buster
23

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

8-
COPY Cargo.toml /app/Cargo.toml
9-
COPY Cargo.lock /app/Cargo.lock
109

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

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

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

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

34+
35+
# Once the heave steps are done, we can copy all files back
36+
COPY . /app

dockerfiles/rust-1.68.Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1+
# syntax=docker/dockerfile:1.7-labs
12
FROM rust:1.68-buster
23

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

8-
COPY Cargo.toml /app/Cargo.toml
9-
COPY Cargo.lock /app/Cargo.lock
109

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

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

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

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

34+
35+
# Once the heave steps are done, we can copy all files back
36+
COPY . /app

0 commit comments

Comments
 (0)