check / check (push) Failing after 3s
script/lint builds Dockerfile.lint only for the exit status, but every run exported the result as an image: seconds spent exporting, and one untagged image left behind each time. It now builds with --output=type=cacheonly, so nothing is exported. CHECK_EPOCH still changes on every run, so the gate steps still run each time; the build cache is kept as before. Model: opus-5-5
35 lines
1.4 KiB
Bash
Executable File
35 lines
1.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# script/lint: run the linter. golangci-lint is never installed on a
|
|
# host: it runs via docker only, one way, everywhere — this builds
|
|
# Dockerfile.lint, which COPYs the repo into the digest-pinned
|
|
# golangci-lint image and lints as a build step, so a successful build
|
|
# is a clean lint. The only prerequisite is a working docker. The gate
|
|
# steps make no network calls of their own, but Dockerfile.lint runs
|
|
# `go mod download` above them, so a cold cache does reach the network
|
|
# (as does pulling the pinned image); that layer stays cached, and once
|
|
# it is warm this runs offline until go.mod or go.sum changes.
|
|
#
|
|
# CHECK_EPOCH is what makes the result mean anything. Without it docker
|
|
# serves the gate layers from cache on an unchanged tree and this exits
|
|
# 0 in well under a second having run no linter. The PID is in the value
|
|
# as well as the epoch because two lint runs land inside the same second
|
|
# easily, and `date +%s` alone would cache the second one.
|
|
#
|
|
# The result is the build's exit status and the image is never used, so
|
|
# --output=type=cacheonly writes none. Without it every run spends
|
|
# seconds exporting an image and leaves it behind untagged.
|
|
set -eu
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd -P)"
|
|
|
|
main() {
|
|
cd "$ROOT"
|
|
docker build \
|
|
--build-arg CHECK_EPOCH="$(date +%s)-$$" \
|
|
--output=type=cacheonly \
|
|
-f Dockerfile.lint \
|
|
.
|
|
}
|
|
|
|
main "$@"
|