Isolate CI/release builds from the prod host (dedicated/community build runner) #90
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
dark/nether-voicebridge#90
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The prod bridge runs on the
mautrixincus container and CI runs on theforgejo-runnercontainer — both on the samecubuntuhost, sharing cores. A heavy CI/release build (release image, ~16 min, cargo at full parallelism) pegs the host and starves the prod bridge's real-time audio pipeline → live users get audio glitches during builds.Confirmed 2026-07-11: the alpha.18/19 releases coincided with staging e2e audio scenarios failing (silent/uncorrelated audio, mean_ncc~0) while LiveKit was healthy and its host (nether-red) idle — i.e. the media endpoints on cubuntu were CPU-starved. Not Discord rate-limits, not LiveKit.
Two contention sources:
forgejo-runner(cross-container, shared cubuntu cores).build-d1.shstaging builds run theirdocker runinsidemautrix— the same container as prod.Stopgap already applied (2026-07-11)
incus config set forgejo-runner limits.cpu.allowance=800ms/100ms— hard-cap CI to 8 of the 12 cores (prod always has ~4 free);limits.cpu.priority=0(cpu.weight 90 — yields under contention). Verified viacpu.max = 800000 100000.build-d1.shnow--cpus=4+nice -n 19+CARGO_BUILD_JOBS=4.These protect prod, but builds still run on the prod host.
Proposed fix: offload builds to a dedicated / community build runner
Physical isolation beats cgroup capping — if builds run on a separate box, they never touch the prod host. Forgejo supports this natively via additional runners.
act_runnerwith a distinct label; route heavy jobs to it viaruns-on.ci.yml: build + clippy + test) — the bulk of the CPU, needs no credentials → safe on third-party hardware.docker.yml— holdsRELEASE_TOKEN, pushes the prod image) and the live e2e/nightly (e2e.yml— holds live Discord/Matrix bot tokens; also wants proximity to LiveKit/staging). ⚠️ Runners see whatever secrets a job uses, so prod/release/e2e secrets must not land on hardware we don't control.Notes
Jason L (shadowdrake) intends to file a related issue — combine when it lands. Filed separately so the analysis + stopgap aren't lost in the meantime.