Docker images reported commit unknown because the build ran git inside the container while .dockerignore excludes .git, and VERSION was never overridden. script/docker and script/cibuild now compute version, commit and date on the host and pass them as build args; the Dockerfile runs no git and falls back to dev and unknown, never empty, on a bare docker build. Profiling a failing command gave a truncated or missing profile: Entry and each command goroutine called os.Exit(1), skipping the deferred profile writers in main. Entry now returns a status that main exits with after its defers run, and command goroutines report failure through one RunOperation helper, which also restores PID-lock release and graceful shutdown on failure. model: claude-opus-4-8 (implementation, review); claude-fable-5-1 (merge) Co-authored-by: clawbot <clawbot@noreply.example.org>
49 lines
2.1 KiB
Bash
Executable File
49 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# script/docker: build the Docker image tagged with the project name.
|
|
# Identical in all repos; the tag comes from script/projectname.
|
|
# Generic: needs no adaptation.
|
|
#
|
|
# This builds the PRODUCT image only, and the product Dockerfile has no
|
|
# lint stage: linting lives in Dockerfile.lint and is run by
|
|
# script/lint. So a green here means `make fmt-check` and `make test`
|
|
# passed and the image built -- it says nothing about lint. The gates
|
|
# are script/check (which runs script/lint) and script/cibuild (which
|
|
# builds both files).
|
|
set -eu
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
|
|
ROOT="$(cd "$SCRIPT_DIR/.." && pwd -P)"
|
|
|
|
main() {
|
|
cd "$ROOT"
|
|
# Same CHECK_EPOCH contract as script/cibuild, for the same reason
|
|
# and with the same bare-assignment and `$$` requirements -- see the
|
|
# comments there. This script is not the CI gate, but a local build
|
|
# is almost always warm, so without this it would report a green the
|
|
# tree had not earned and the two entrypoints would disagree about
|
|
# whether the tree is clean. The Dockerfile now refuses to build
|
|
# without a non-empty value, so this is required, not optional.
|
|
epoch="$(date +%s%N)$$"
|
|
|
|
# Version, commit and build date are computed here on the host,
|
|
# where .git exists, and passed into the build. The build context
|
|
# excludes .git (see .dockerignore), so the container cannot derive
|
|
# them itself -- it used to try and always got "unknown", giving
|
|
# every image a "commit: unknown" it could not be traced from.
|
|
# VERSION comes from script/version, the source of truth shared with
|
|
# the Makefile, so a Docker build reports the same string (tag,
|
|
# dev-<sha>, or a -dirty variant) that a local build of the same
|
|
# tree would.
|
|
version="$("$SCRIPT_DIR/version")"
|
|
commit="$(git rev-parse HEAD 2>/dev/null || echo unknown)"
|
|
commit_date="$(git show -s --format=%cs HEAD 2>/dev/null || echo unknown)"
|
|
|
|
docker build --build-arg CHECK_EPOCH="$epoch" \
|
|
--build-arg VERSION="$version" \
|
|
--build-arg COMMIT="$commit" \
|
|
--build-arg COMMIT_DATE="$commit_date" \
|
|
-t "$("$SCRIPT_DIR/projectname")" .
|
|
}
|
|
|
|
main "$@"
|