Split Dockerfile: pre-built golangci-lint stage for faster CI #39

Open
opened 2026-03-02 08:50:54 +01:00 by clawbot · 0 comments
Collaborator

Goal

Split the Dockerfile into a dedicated lint stage using the pre-built golangci/golangci-lint image, so lint and formatting failures surface much faster without downloading golangci-lint on every build.

Pattern

# Stage 1: Lint (pre-built image, fast)
FROM golangci/golangci-lint@sha256:... AS lint
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN make fmt-check
RUN make lint

# Stage 2: Test + Build
FROM golang@sha256:... AS builder
# Force BuildKit to run lint stage
COPY --from=lint /src/go.sum /dev/null
...
RUN make test
RUN make build

Key details

  • All images pinned by sha256 per REPO_POLICIES
  • COPY --from=lint creates BuildKit stage dependency (without this, lint stage is silently skipped)
  • Reference implementation: sneak/upaas Dockerfile

Tracked from sdlc-manager#6.

## Goal Split the Dockerfile into a dedicated lint stage using the pre-built `golangci/golangci-lint` image, so lint and formatting failures surface much faster without downloading golangci-lint on every build. ## Pattern ```dockerfile # Stage 1: Lint (pre-built image, fast) FROM golangci/golangci-lint@sha256:... AS lint WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . RUN make fmt-check RUN make lint # Stage 2: Test + Build FROM golang@sha256:... AS builder # Force BuildKit to run lint stage COPY --from=lint /src/go.sum /dev/null ... RUN make test RUN make build ``` ## Key details - All images pinned by sha256 per REPO_POLICIES - `COPY --from=lint` creates BuildKit stage dependency (without this, lint stage is silently skipped) - Reference implementation: [sneak/upaas Dockerfile](https://git.eeqj.de/sneak/upaas/src/branch/main/Dockerfile) Tracked from [sdlc-manager#6](https://git.eeqj.de/clawbot/sdlc-manager/issues/6).
Sign in to join this conversation.
No Milestone
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sneak/mfer#39
No description provided.