Files
SilverMetal/linux/build/runner
SysAdmin f66585e0b1
Some checks failed
Build SilverMetal Linux ISO (reproducibility-gated) / builder-image (push) Failing after 0s
Build SilverMetal Linux ISO (reproducibility-gated) / build-and-verify (push) Has been skipped
fix(linux/build): wire config.yaml into act_runner via CONFIG_FILE env
The runner config.yaml on disk was decorative — never read. The upstream
gitea/act_runner image's run.sh only adds `--config <file>` when the
CONFIG_FILE env var is set, and our compose set neither CONFIG_FILE nor
mounted config.yaml into the container. So `timeout: 240m`,
`container.options`, `valid_volumes` etc. were silently ignored and the
runner ran on built-in defaults.

This is also why iter17's `-v /root/.docker:/root/.docker:ro` addition
to config.yaml had no effect on run #4264: the runner never read it.
The push still failed with "no basic auth credentials".

Fix: bind-mount ./config.yaml into the runner container at
/etc/act_runner/config.yaml and set CONFIG_FILE to that path. After a
`docker compose up -d --force-recreate`, the runner picks up everything
in config.yaml — including the per-job-container /root/.docker bind.

Per-job timeouts in build-iso-linux.yaml are set via `timeout-minutes:
240` at the job level, which overrides the daemon default anyway, so
nothing was visibly broken before. But silently-ignored config is a
trap for the next thing we add to config.yaml, so wire it correctly now.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 17:48:07 +01:00
..

silvermetal-builder runner deployment

The Gitea Actions runner that handles runs-on: silvermetal-builder jobs from .gitea/workflows/build-iso-linux.yaml.

Layout

File Purpose
docker-compose.yml act_runner service definition, deployed on SLAB docker host.
Dockerfile.runner Adds docker-cli to the upstream gitea/act_runner image.
config.yaml act_runner runtime config — privileged, 4h timeout, host network.
.env.example Template for the registration-token env file (real .env not commit).

Why privileged

live-build needs loop devices and chroot inside the build container. Without privileged: true, mksquashfs and debootstrap fail. This is the only Gitea runner in the SilverLABS fleet that runs privileged — keep its scope narrow (one repo, one job class).

Deploy

On the SLAB docker host (10.0.0.51):

sudo mkdir -p /opt/silvermetal-builder-runner
cd /opt/silvermetal-builder-runner

# Copy this directory's contents in (e.g. via scp or rsync from a checkout
# of SilverLABS/SilverMetal at linux/build/runner/).
# Then create the .env with a fresh registration token:

GITEA_TOKEN=<admin-token> \
  curl -H "Authorization: token $GITEA_TOKEN" \
       https://git.silverlabs.uk/api/v1/admin/runners/registration-token

cp .env.example .env
$EDITOR .env  # paste the token

# Log in to the registry on the *host* — config.yaml mounts the resulting
# /root/.docker/config.json into both the act_runner container and every
# job container it spawns, so the builder-image job in build-iso-linux.yaml
# can `docker push` without its own login step.
docker login docker-registry.silverlabs.uk

# Pre-pull the builder image so the first job isn't a cold start. (Skip
# this on the very first deploy: the :latest tag won't exist until CI
# runs once. After that it's pushed by the builder-image job.)
docker pull docker-registry.silverlabs.uk/silvermetal-builder:latest || true

docker compose up -d
docker compose logs -f --tail 50   # watch for "Runner registered"

Check the runner shows up under git.silverlabs.uk/-/admin/actions/runners with label silvermetal-builder.

Bump the runner image / config

cd /opt/silvermetal-builder-runner
git pull   # if you keep this dir as a checkout
docker compose up -d --build

Tear down

docker compose down -v   # -v drops runner-data volume; runner has to re-register

The runner-data volume holds the registered runner identity — keep it across image bumps so we don't pollute the Gitea runners list with dead entries.