check / check (push) Canceled after 0s
The script/ builds pass a new CACHEBUST build argument on every run in place of --no-cache, which also emptied Go's build cache mount. Every Dockerfile stage declares ARG CACHEBUST first, so every RUN step still reruns on an unchanged tree. The canonical Go Dockerfile mounts only Go's build cache, on the steps that compile, so compiled packages survive between check builds; both go test runs carry -count=1, so no test result is reused. golangci-lint's own cache and the module cache are not kept. A repository re-vendors the scripts and adds the ARG lines in one commit: a stage without the line is served from cache with no warning. Unverified: not yet tried on the shared CI runner. Model: opus-5-5
66 lines
2.0 KiB
Docker
66 lines
2.0 KiB
Docker
# Lint phase. The linter is invoked directly rather than through `make
|
|
# lint` or `script/lint`, which are themselves a docker build and would
|
|
# recurse into a daemon that does not exist in a build step.
|
|
#
|
|
# Every stage declares ARG CACHEBUST first: script/ passes a new value on
|
|
# every build, which reruns every RUN step after it.
|
|
#
|
|
# node 22-alpine, 2026-02-22
|
|
FROM node@sha256:e4bf2a82ad0a4037d28035ae71529873c069b13eb0455466ae0bc13363826e34 AS lint
|
|
ARG CACHEBUST
|
|
|
|
WORKDIR /app
|
|
|
|
COPY script/ script/
|
|
COPY package.json yarn.lock ./
|
|
RUN script/bootstrap
|
|
|
|
COPY . .
|
|
|
|
RUN yarn run prettier --check '**/*.md' --tab-width 4 --prose-wrap always
|
|
|
|
# Test phase, same shape and for the same reason.
|
|
#
|
|
# node 22-alpine, 2026-02-22
|
|
FROM node@sha256:e4bf2a82ad0a4037d28035ae71529873c069b13eb0455466ae0bc13363826e34 AS test
|
|
ARG CACHEBUST
|
|
|
|
WORKDIR /app
|
|
|
|
COPY script/ script/
|
|
COPY package.json yarn.lock ./
|
|
RUN script/bootstrap
|
|
|
|
COPY . .
|
|
|
|
RUN echo "No tests defined."
|
|
|
|
# Development environment, and the last stage: a plain `docker build .`
|
|
# names no target and so builds this one. Nothing is wanted from the two
|
|
# phases above; the copies are what make BuildKit build them first, so
|
|
# this image cannot be produced unless lint and test passed. A stage
|
|
# appended after this one would drop all three out of a plain build.
|
|
#
|
|
# node 22-alpine, 2026-02-22
|
|
FROM node@sha256:e4bf2a82ad0a4037d28035ae71529873c069b13eb0455466ae0bc13363826e34
|
|
ARG CACHEBUST
|
|
|
|
WORKDIR /app
|
|
|
|
COPY --from=lint /app/package.json /dev/null
|
|
COPY --from=test /app/package.json /dev/null
|
|
|
|
# script/bootstrap installs all prerequisites. Manifests are copied
|
|
# first so that layer stays cached until dependencies change.
|
|
COPY script/ script/
|
|
COPY package.json yarn.lock ./
|
|
RUN script/bootstrap
|
|
|
|
COPY . .
|
|
|
|
# Nothing here is compiled and a LABEL cannot run git, so the version is
|
|
# the VERSION build argument that script/docker and script/cibuild pass;
|
|
# a plain `docker build .` leaves it empty.
|
|
ARG VERSION
|
|
LABEL org.opencontainers.image.version="${VERSION}"
|