docs(installer): add release orchestration and the bundle manifest #81
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/installer-release-orchestration"
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 & why
Follow-up to #80, which merged while this was still being written — so it lands as its own PR.
The installer needs CI that reacts when a component publishes a release. This adds it as §7, folded into version tracking rather than bolted on separately, because the bundle is the compat matrix — which closes the "where does the compat matrix live" gap §7 originally left open.
--bundle <tag>pins one for a reproducible install. Because the bundle is data, alinkrelease regenerates ~20 lines of JSON and leaves the installer binary untouched: operators don't re-download the installer to pick up a sidecar patch, and the repo doesn't accumulate releases whose code is byte-identical. Two compose-time gates — sidecarPROTOCOL_VERSIONmust equal the overlay manifest's declared version, and every referenced asset's SHA256 must match.POSTs to the installer repo's workflow-dispatch endpoint (link/.gitea/workflows/release.ymlalready declaresworkflow_dispatch: {}and already holds awrite:repositorytoken), plus a nightly cron so a missed or failed dispatch self-heals rather than silently pinning operators to a stale sidecar.repository_dispatchdeliberately avoided — support is uncertain on this Gitea version, while dispatching an existing workflow via the API works today.main, so by the time the installer's CI looks the release normally already exists. Note "updated since" must mean releasable commits: the engine setsRELEASE=falsewhen onlydocs:/chore:has landed, so a docs typo correctly cuts nothing. If main is genuinely ahead with releasable commits, fire that repo's release workflow, don't wait, compose from what exists now, and warn loudly in the job summary; the nightly folds in the result minutes later.The reasoning on that last point, since it's the non-obvious one: dispatching another repo's workflow is fine — it still runs that repo's own gates, and it's all one org. Polling it is the problem. Gitea's dispatch endpoint returns no run handle, so the job would have to guess which run is its own by filtering recent runs, hold a runner idle while another repo builds, and invent timeout behavior. Fire-and-forget plus cron reconciliation gets the same automation with none of that.
Knock-on edits: bundle CI becomes a Phase 0 deliverable (Phase 1 resolves what to install from the bundle),
runicgateway updatenow moves between checked combinations rather than two independently-latest artifacts, §3 notes the bundle is published by the installer repo rather than by any component, and the composition decision joins §1's locked table.How it was tested
Docs-only. Claims about existing CI verified against
link/.gitea/workflows/release.yml— specifically theworkflow_dispatch: {}trigger, theREGISTRY_TOKENwrite:repositoryscope, and theBUMP=none → RELEASE=falsebehavior the "releasable commits" rule depends on.Checklist
AI-assisted contributions (required)
This project requires disclosure of AI tool usage. Please pick one:
Claude Code (Opus 5). I have reviewed and understandevery change, and take responsibility for it. AI-authored commits are
marked with a
Co-Authored-By/Assisted-Bytrailer.License
(GNU GPL v3.0 or later), and I have the right to contribute it.