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

0 commit comments

Comments
 (0)