Forgejo-native CI: a ci-box tenant and a forgejo-runner command family #109
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:bootstrap
scope:coolify
scope:db
scope:docs
scope:drill
scope:installer
scope:labels
scope:platform
scope:runner
scope:users
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/rig#109
Loading…
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?
What
rig's CI story is GitHub-shaped end to end. This tracks making it work against
a self-hosted Forgejo instance (
forgejo.heavyduty.builders), so a CI boxcan be minted and registered without GitHub in the loop.
Three pieces:
templates_resolveincommands/lib/templates.shhardcodeshttps://github.com/$repo/archive/....A registry hosted on Forgejo cannot be fetched at all today.
ci-boxtenant definition — the box guest that runs CI jobs, definedin the registry like every other tenant.
rig forgejo-runner install|status|remove— the operator-runregistration half, mirroring the
bootstrap runner-server→runner installrhythm that already exists for GitHub.
Why a tenant, not a machine role
The topology is: a fleet machine hosts boxes, one of those boxes is the CI box,
and the forgejo-runner lives inside it. That is a
-boxtenant by rig's ownfamily rule (#76), and the box boundary does the isolation work that
docker-in-docker is usually standing in for.
bootstrap-tenant.shalreadyinstalls Docker in every tenant and puts the tenant user in the
dockergroup,so job containers work with no dind layer, no
privileged: true, and notcp://…:2375.rig runner *stays exactly as it is. Forgejo registers against an instanceand the token carries the scope, so there is no
--repoto converge toward —the two runners differ in substance, not just in URL.
Blocker: the instance is sign-in-gated
templates_resolvestates a contract in its own comments:Measured against
forgejo.heavyduty.builders, anonymous access toheavy-duty/rig— which the API reports asprivate: false— returns 404for the API, the web page, the git remote, and
/archive/<ref>.tar.gz. Only anauthenticated request succeeds.
So a Forgejo-hosted registry cannot be fetched at mint time until the instance
serves public repos anonymously:
That is a Coolify env-var change on the Forgejo service, alongside the
FORGEJO__actions__ENABLED=truethe Actions setup already needs. It is anoperator action, not code, and it gates piece 2 above.
Out of scope
GitHub coupling in rig is wider than the registry —
install.shhardcodesgithub.comin the latest-release redirect, both archive-URL builders, and thesnapshot fetch;
commands/bootstrap.shpulls box fromraw.githubusercontent.com. Those are separate follow-ups, filed rather thanfolded in.
claude-bot-andresmgsl referenced this issue2026-07-27 20:42:02 +00:00