💚 Bake Node into the CI job image
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.
This commit is contained in:
1 parent
b9fe21175f
commit
245dfaf198
6 files changed
+88
-5
No files matched your search
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#!/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"
|
||||
Reference in new issue
Block a user