Adds container/: a rootless Podman + systemd (Quadlet) setup for running
per-project Gitea Actions runners on a single host, as an alternative to one
VM per project.
Uses the host executor with a purpose-built image that bakes in the Rust
toolchain and all build dependencies (opus, alsa, soapysdr, clang), so CI runs
skip the per-run install and the cold soapysdr-sys build that dominated the
initial pipeline.
trx-rs-runner.container / project2-runner.container — Quadlet units, one
per project. Separate names/volumes/tokens; shared label; registration scope
keeps their jobs apart. Resource caps included.
README.md — build, registration, tuning, and the one required workflow
change.
Note
The host executor cannot run Docker-based actions, so the reuse job (which
uses fsfe/reuse-action@v5) must be switched to run: reuse lint when using
these runners — reuse is baked into the image. Details and the snippet are in
the README. The lint and test jobs are unchanged (their install/rustup
steps become fast no-ops on the baked image).
All files carry inline SPDX headers, so the REUSE check stays green.
## Summary
Adds `container/`: a rootless Podman + systemd (Quadlet) setup for running
per-project Gitea Actions runners on a single host, as an alternative to one
VM per project.
Uses the **host executor** with a purpose-built image that bakes in the Rust
toolchain and all build dependencies (opus, alsa, soapysdr, clang), so CI runs
skip the per-run install and the cold `soapysdr-sys` build that dominated the
initial pipeline.
## Contents
- `Containerfile` — Debian image: build deps + clang + Rust (fmt/clippy) + Node
+ `reuse` + `sudo` + the `act_runner` binary.
- `entrypoint.sh` — registers on first boot (if no `.runner` exists), seeds the
config into the data volume, then runs the daemon.
- `config.yaml` — act_runner config template; label `ubuntu-latest:host`.
- `trx-rs-runner.container` / `project2-runner.container` — Quadlet units, one
per project. Separate names/volumes/tokens; shared label; registration scope
keeps their jobs apart. Resource caps included.
- `README.md` — build, registration, tuning, and the one required workflow
change.
## Note
The host executor cannot run Docker-based actions, so the `reuse` job (which
uses `fsfe/reuse-action@v5`) must be switched to `run: reuse lint` when using
these runners — `reuse` is baked into the image. Details and the snippet are in
the README. The `lint` and `test` jobs are unchanged (their install/rustup
steps become fast no-ops on the baked image).
All files carry inline SPDX headers, so the REUSE check stays green.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01NFpGtGTWUEYXLwZeZs2RAV
Add container/: a rootless Podman + systemd (Quadlet) setup to run
per-project Gitea Actions runners on one host instead of VMs. Uses the
host executor with a purpose-built image that bakes in the Rust toolchain
and all build dependencies (opus, alsa, soapysdr, clang), so CI runs skip
the per-run install and cold soapysdr-sys build.
Includes the runner Containerfile, first-boot registration entrypoint,
act_runner config template, two Quadlet units (trx-rs + a second project),
and a README covering build, registration, the required host-executor
workflow tweak, and tuning.
Assisted-By: Claude Code (claude-opus-4)
Claude-Session: https://claude.ai/code/session_01NFpGtGTWUEYXLwZeZs2RAV
Signed-off-by: Stan Grams <sjg@haxx.space>
sjg
merged commit 406a8f86b1 into main2026-07-18 13:15:07 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Adds
container/: a rootless Podman + systemd (Quadlet) setup for runningper-project Gitea Actions runners on a single host, as an alternative to one
VM per project.
Uses the host executor with a purpose-built image that bakes in the Rust
toolchain and all build dependencies (opus, alsa, soapysdr, clang), so CI runs
skip the per-run install and the cold
soapysdr-sysbuild that dominated theinitial pipeline.
Contents
Containerfile— Debian image: build deps + clang + Rust (fmt/clippy) + Nodereuse+sudo+ theact_runnerbinary.entrypoint.sh— registers on first boot (if no.runnerexists), seeds theconfig into the data volume, then runs the daemon.
config.yaml— act_runner config template; labelubuntu-latest:host.trx-rs-runner.container/project2-runner.container— Quadlet units, oneper project. Separate names/volumes/tokens; shared label; registration scope
keeps their jobs apart. Resource caps included.
README.md— build, registration, tuning, and the one required workflowchange.
Note
The host executor cannot run Docker-based actions, so the
reusejob (whichuses
fsfe/reuse-action@v5) must be switched torun: reuse lintwhen usingthese runners —
reuseis baked into the image. Details and the snippet are inthe README. The
lintandtestjobs are unchanged (their install/rustupsteps become fast no-ops on the baked image).
All files carry inline SPDX headers, so the REUSE check stays green.
🤖 Generated with Claude Code
https://claude.ai/code/session_01NFpGtGTWUEYXLwZeZs2RAV