setup-node never consults `node` on PATH; its only fast path is a probe of /opt/hostedtoolcache, which the ephemeral act_runner job containers always miss, so every job paid a ~50 MB Node download. docker/Dockerfile extends the runner's default catthehacker/act image with the Node distribution overlaid at the exact tool-cache layout, so setup-node finds 26.8.2 and skips the fetch while node-version-file, cache: npm and registry-url keep working unchanged. Image layers dedupe against the base the host already pulled and prune via normal docker hygiene — the cleanup story a host bind of /opt/hostedtoolcache lacks. To make the bake deterministic, .node-version is pinned to the exact 26.8.2 the image carries; scripts/runner-image.sh guards that coupling and builds/pushes the tag the three node jobs now reference via container.image. Ops follow-up (outside the repo): build once with `npm run build:runner-image -- --push` on a machine with registry creds. If the package is private, the runner needs container registry credentials in its config.
34 lines
1.3 KiB
Bash
Executable File
34 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Build (and optionally push) the CI job image from docker/Dockerfile.
|
|
# Run wherever docker + registry credentials live (the runner host, or any
|
|
# machine that can reach the registry). The registry/repo below MUST match
|
|
# the `container.image` references in .gitea/workflows/ci.yml — the runner
|
|
# pulls the image by name.
|
|
#
|
|
# Usage: scripts/runner-image.sh [--push]
|
|
|
|
IMAGE_REPO="gitea.e1nsnull.de/tmu/act-ci"
|
|
|
|
NODE_VERSION="$(tr -d '[:space:]' < .node-version)"
|
|
if [[ ! "${NODE_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "error: .node-version must be pinned to an exact x.y.z, got '${NODE_VERSION}'." >&2
|
|
echo " setup-node resolves floats like '26' to the latest patch at runtime," >&2
|
|
echo " which silently busts the tool-cache entry baked into the image." >&2
|
|
exit 1
|
|
fi
|
|
|
|
IMAGE="${IMAGE_REPO}:${NODE_VERSION}"
|
|
|
|
# --pull: refresh the act base layer so the derivative does not float on an
|
|
# aging default image forever (layer dedup keeps this cheap).
|
|
docker build --pull --build-arg "NODE_VERSION=${NODE_VERSION}" -t "${IMAGE}" -f docker/Dockerfile .
|
|
|
|
if [[ "${1:-}" == "--push" ]]; then
|
|
docker push "${IMAGE}"
|
|
fi
|
|
|
|
echo "built ${IMAGE}"
|
|
echo "reminder: bump container.image in .gitea/workflows/ci.yml to this tag"
|