Self-hosted runner migration (workflow-standards audit)¶
Situation¶
The daily consistency audit
(shakenfist/development audits/workflow-standards.md)
flagged ryll as non-compliant in
shakenfist/ryll#155:
22 unmarked GitHub-hosted runner references across ci.yml,
manual-build.yml, and release.yml. The standard requires
self-hosted runners except for documented exceptions, which must be
marked with an audit-ok: github-hosted-runner comment on (or
immediately above) the line referencing the GitHub-hosted label.
Ryll is a public repository, so GitHub-hosted minutes are free; the migration is about org-wide consistency and queue control rather than cost. The audit spec itself names ryll's macOS/Windows builds as the canonical legitimate exception.
Mission and problem statement¶
Bring ryll into compliance with the workflow-standards audit by:
- Migrating all Linux x86_64 compute jobs to self-hosted runners, with the build wrapped in the devcontainer (the pattern instar uses, and the same Makefile targets developers run locally).
- Moving small orchestration jobs to
[self-hosted, static]. - Marking the remaining GitHub-hosted references (macOS, Windows,
aarch64 Linux — platforms we own no hardware for) with
audit-okexception markers.
Execution¶
Decisions taken (operator-confirmed 2026-07-14):
- Heavy Linux x86_64 jobs → self-hosted now (not deferred):
ci.ymllint / fuzz / Linux build,manual-build.ymlLinux build,release.ymlLinux build andpublish-crates. These run on[self-hosted, vm, debian-12-docker, l]— the docker.io preinstalled image thatsupply-chain.ymlalready uses for cargo-deny, at l size because cargo builds are compute-bound — with cargo wrapped in the devcontainer viamaketargets. - Small orchestration jobs →
[self-hosted, static]:manual-build.ymlresolve-matrix,release.ymlcheck-version, github-release, and update-homebrew. - audit-ok markers for macOS (
macos-latest), Windows (windows-latest,windows-11-arm), and aarch64 Linux (ubuntu-24.04-arm) matrix entries in all three workflows — no self-hosted hardware exists for these platforms. The aarch64 Linux and Windows ARM labels are the public-repo-only free GitHub runners.
Changes made:
.devcontainer/Dockerfile— addedlibopus-dev(parity with what CI previously apt-installed, so cargo-deb recordslibopus0as a runtime dep) andopenssl(fortools/web-smoke.sh --tls); baked incargo-debandcargo-generate-rpm..devcontainer/fuzz/Dockerfile— new image layered onryll-devwith the nightly toolchain (plus rustfmt) andcargo-fuzz.Makefile— factored the repeateddocker runinvocation into a sharedDOCKER_RUNvariable (which also forwardsCARGO_BUILD_JOBSwhen set); new targets:deb,rpm,web-smoke,web-smoke-tls,fuzz-devcontainer,fuzz-fmt-check,fuzz-build-%,fuzz-smoke-%, andpublish-crates.tools/publish-crates.sh— publishes the six workspace crates serially in dependency order; run inside the devcontainer withCARGO_REGISTRY_TOKENforwarded..github/workflows/ci.yml— lint, fuzz, and a newbuild-linuxjob run self-hosted through the Makefile; the build matrix keeps the four no-hardware platforms withaudit-okmarkers;automated_reviewernow also depends onbuild-linux..github/workflows/manual-build.yml— resolve-matrix runs onstaticand emits alinux_x86_64flag consumed by a new self-hostedbuild-linux-x86_64job; the hosted matrix skips when only linux-x86_64 was requested..github/workflows/release.yml— same Linux build split asci.yml(artifacts keep theirrelease-*names so the github-release download pattern is unchanged);publish-cratesrunsmake publish-cratesself-hosted; check-version, github-release, and update-homebrew run onstatic..github/actionlint.yaml— new, matching the house pattern, so actionlint knows the self-hosted labels; also fixed the SC2129 style nit inrelease.yml's check-version step so actionlint runs clean.
Administration and logistics¶
Success criteria¶
scripts/audit-check.py(development repo) reportsself-hosted-runners: passfor ryll — verified locally.actionlintruns clean — verified locally (via therhysd/actionlintcontainer).pre-commit run --all-filespasses — verified locally.- A full CI run on the self-hosted runners goes green — to be verified by pushing this branch and watching the run.
Risks and things to watch on first CI run¶
- Cold-build wall time: the self-hosted runners have no
Swatinem/rust-cache equivalent; each run rebuilds the
devcontainer image and does a cold cargo build. The compile
jobs run on l-size runners for this reason, and timeouts are
set generously (45–120 min). If wall time is still
unacceptable,
xlexists in the fleet, or add image/registry caching. - Disk: a full ryll workspace build plus the devcontainer image is tens of GB; if the VM disk is small this will surface as ENOSPC.
Future work¶
- The audit also newly reports
readme-absolute-links: fail(17 relative links in README.md) — a separate audit, not part of issue #155, and worth its own change. - Consider pushing prebuilt
ryll-dev/ryll-fuzzimages to a registry so CI runs pull instead of rebuilding, if image build time dominates job wall time.