Files
privatae-bastion/deploy/build.sh
T
Privatae 8822d5df85
ci / personal-data (push) Successful in 5s
ci / test (push) Successful in 3m51s
ci / fuzz (push) Successful in 2m55s
bastion 0.55.3
2026-10-25 23:16:45 +00:00

48 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Build every release binary into client-go/dist, the same way every time.
#
# deploy/build.sh <version>
#
# publish.sh calls this to make a release, and verify-release.sh calls it to
# rebuild one and compare. They share this file so the two can never build
# differently.
#
# What makes two builds of the same commit byte-identical:
# - the toolchain image is pinned by digest, not by tag. A tag moves when a
# new Go patch release is pushed, and a different compiler writes different
# bytes.
# - GOTOOLCHAIN=local, so go.mod cannot make the build fetch another compiler.
# - -trimpath, so no path from the machine that built it lands in the binary.
# - -buildvcs=false, so no VCS state is stamped in (only client-go is mounted,
# but this says so instead of relying on it).
# - -mod=readonly with go.sum, so every module is the one go.sum names.
# - CGO_ENABLED=0, so no system C library is linked.
# The version is the only thing passed in, and it is the same for everyone who
# builds that release.
set -euo pipefail
HERE="$(cd "$(dirname "$0")/.." && pwd)"
VER="${1:?usage: deploy/build.sh <version>}"
# golang:1.26.10-alpine3.24, the multi-arch index digest below (go1.26.10).
# Move it deliberately, in its own commit, and a release built after that
# commit is rebuilt with the new one.
GO_IMAGE="golang@sha256:27f2d3b83cfc5803c8078f8e730af0f7c431bf067afaec8f60a36fb763187cba"
# The module cache is only a download cache: go.sum checks everything read from
# it. It is kept between runs so a rebuild does not fetch every module again.
MODCACHE="${GOMODCACHE_DIR:-$HOME/go/pkg/mod}"
mkdir -p "$MODCACHE"
# --user: the files in dist/ belong to whoever ran this, not to root, so a
# non-root checkout can clean up after itself.
docker run --rm --user "$(id -u):$(id -g)" -e HOME=/tmp -e GOCACHE=/tmp/gocache \
-v "$HERE/client-go":/src -v "$MODCACHE":/go/pkg/mod -w /src \
-e CGO_ENABLED=0 -e GOTOOLCHAIN=local -e GOFLAGS="-mod=readonly -trimpath -buildvcs=false" \
-e VER="$VER" "$GO_IMAGE" sh -c '
rm -rf /src/dist && mkdir -p /src/dist
for t in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64 windows/arm64; do
os=${t%/*}; arch=${t#*/}; ext=""; [ "$os" = windows ] && ext=".exe"
GOOS=$os GOARCH=$arch go build -ldflags "-X main.clientVersion=$VER" \
-o /src/dist/privatae-bastion-$os-$arch$ext .
done'