5.5 KiB
RUNBOOK — software factory operations
Cookbook for operating the Phyllome OS factory on git.phyllo.me.
Prereqs & inventory
- See server-phyllome-cloudron.md for the box reference and architecture.md for the layout.
- MCP servers (from the
automationrepo) used by an operator:gitea-phyllome(read),gitea-phyllome-write(write),cloudron-phyllome(read),cloudron-phyllome-write(write).
1. Register a runner (one-time)
The runner connects out to git.phyllo.me, so it never needs an inbound
rule. Registration needs a one-time registration token.
Scope gotcha (2026-09-19). Registration tokens are scope-specific and one-time-use. Where you click to create the token determines which repos the runner will serve:
Where you click Scope Serves Settings → Actions → Runners user only that user's repos Org Settings → Actions → Runners org that org's repos Site Administration → Actions → Runners site-wide every repo A user-scope runner will happily register and show online but will never pick up jobs from org repos — jobs sit
queuedwithrunner_id: 0(symptom: Gitea logs show onlyDeclare/Register, noFetchTask). For the factory (org + repo-wide jobs) you must use a site-wide token. Tokens are one-time and admin/owner only — cannot be minted with the API token.
- Get a registration token: Log in to
git.phyllo.me→ Site Administration → Actions → Runners → New runner → copy the token. Leave the window open; the token is one-time-use. - Deploy the runner VM on the phyllome Cloudron host. Two supported
routes:
-
Ansible (existing playbook):
devops/ansible-gitea-runner— setregistration_tokeninroles/runner_setup.yml, pointinventory.iniat the VM, thenansible-playbook main.yml. -
Manual: install
gitea-runnerv3.5.0 on a Fedora 44 VM, then:$ sudo -u act_runner gitea-runner register --no-interactive \ --instance https://git.phyllo.me --token <TOKEN> \ --name fedora-0 --labels fedora:hostThen run
gitea-runner daemonunder systemd (seedevops/ansible-gitea-runner/roles/runner_setup.ymlfor the unit).
-
- Verify: Gitea UI → Site Administration → Actions → Runners shows the
runner online, label
fedora.
Runner label syntax is
name:executor(e.g.fedora:host). The label name isfedora— jobs mustruns-on: fedora. The Fedora version (44) is carried in the container image tag (e.g.fedora-runner-image:44), not in the label (a barefedora:44would be parsed as an invalid executor).The old runner labels
fedora-cloud-42were renamed tofedora(2026-09-15) — all workflows must useruns-on: fedora.
2. Add factory CI to a repo (pattern)
-
Push a workflow to
.gitea/workflows/<name>.yml:name: ci on: push: pull_request: jobs: checks: runs-on: fedora defaults: run: shell: bash container: image: git.phyllo.me/devops/fedora-runner-image:latest steps: - uses: https://git.phyllo.me/devops/checkout@v5 with: fetch-depth: 0 - run: make test -
Use host jobs (no
container:block) only when the job needsmock,livemedia-creator, or the host build cache — see thecreate-isoworkflow for the canonical example.
3. Put a product pipeline under CI
| Repo | Workflow | Trigger |
|---|---|---|
roots/phyllomeos |
ci.yml (lint/test/validate) |
push + PR |
roots/xml-definition-for-domains |
ci.yml (xmllint) |
push + PR |
roots/rpm-sources |
smoke.yml (mock build) |
push + PR (host job) |
devops/create-iso |
existing build-iso.yaml |
tag v*.*.* |
4. Build & release an ISO (create-iso)
Triggered by tagging v*.*.* in devops/create-iso. The build-iso.yaml
workflow: mock --init → install lorax-lmc-novirt + pykickstart +
livecd-tools → livemedia-creator --make-iso → release the ISO via
devops/action-gh-release@v2. Requires a host runner (mock needs real
chroots).
5. Troubleshooting
- Runner never comes online: re-check the registration token (one-time use)
and that
gitea-runner daemonis running (systemctl status act_runner). - Runner online but jobs never start (stuck
queued/waiting for runner,runner_id: 0): registration scope mismatch — a user/org-scope runner can't serve jobs from repos outside that scope. Re-register with a site-wide token (Site Administration → Actions → Runners). See §1. - Job stuck in
queued/waiting for runner, runner_id set: label mismatch — the job'sruns-onmust exactly match a label the runner registers (fedora). - Container job can't pull the image: runner needs network to
git.phyllo.mepackage registry; checkdocker pull git.phyllo.me/devops/fedora-runner-image:lateston the VM; verify the token used for registry login has package write/read scope. - Push to
git.lukasgreve.ch(perso) times out: home Cloudron reachability is flaky from this workstation; retry — it is not a factory failure path (the factory only talks togit.phyllo.me).
6. Admin actions that stay in the Cloudron UI
Restore/clear backups, reboot, domain/user management, runner registration
tokens — the MCP write surface deliberately excludes these (see the
automation README).