CI & Self-Hosted Runners πΒΆ
How Infinito.Nexus runs its tests, and how to add your own hardware to the CI pool.
The CI gateΒΆ
Every push runs the same gate you can run locally:
make test # lint + unit + integration + external
On GitHub Actions this is followed by the deploy-test matrix β real app deploys across Debian/Ubuntu/Arch/Fedora in throwaway containers, with Playwright/CLI end-to-end checks (.github/workflows/call-test-deploy.yml). This is the heavy part and the reason self-hosted runners exist.
Self-hosted runners (opt-in overflow)ΒΆ
By default all jobs run on GitHub-hosted runners β no configuration needed. You can add your own machine to run a proportional share of the deploy matrix, controlled by a single repository variable, CI_SELF_HOSTED_RUNNER_COUNT:
0/ unset β everything GitHub-hosted (default).Nβ route a share of deploy jobs to your[self-hosted, linux]runners.
Provision and activateΒΆ
# 1. Provision N runner instances on a host (from your control machine)
RUNNER_API_TOKEN=ghp_... make runner-ci-deploy HOST=runner.example.com DISTRO=ubuntu [OWNER=youruser]
# 2. Activate routing (also sets INFINITO_TIMEOUT_MULTIPLIER for slow hardware)
make runner-ci-enable COUNT=2 [OWNER=youruser]
# Kill switch β route everything back to GitHub-hosted
make runner-ci-disable [OWNER=youruser]
Full role reference, CLI parameters, and the end-to-end guide: roles/svc-runner/README.md.
How a runner job is isolatedΒΆ
Each runner instance is provisioned as an ephemeral container using DooD (Docker-out-of-Docker β it mounts the host docker.sock). Isolation is keyed on the instance number, so parallel jobs never collide:
Per instance |
Value |
|---|---|
Subnet |
|
Compose project |
|
Docker volume dir |
|
Registration |
ephemeral, re-registers per job |
The actual app deploy runs inside a sealed throwaway Docker daemon and is torn down on exit, so the hostβs own stack is never touched. Several runners can share one host (or coexist with other workloads) safely.
Runtime self-detectionΒΆ
CI behavior is driven by runtime detection, not hand-set flags:
RUNTIME(dev/act/github) selects which test stages run.DOCKER_IN_CONTAINER(systemd-detect-virt) toggles DinD behavior.CI=truedisables the package cache (flaky in nested containers).
See alsoΒΆ
Installation Guide β local CLI / dev setup
Deploy Guide β inventory creation and deploys
roles/svc-runner/README.mdβ the runner role in full