You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split the current single release.yml final-release flow into two separate workflows: a publish phase that builds and pushes versioned artifacts, and a promote phase that makes them the official "latest" after manual verification.
Problem Statement
The current release.yml performs all final-release actions in a single workflow run: finalize CHANGELOG, build images, push X.Y.Z and latest tags to GHCR, create a draft GitHub Release, and dispatch smoke tests. This means:
Push images to GHCR as X.Y.Z (per-arch + multi-arch manifest, no latest tag)
Sign and attest (cosign, SBOM, provenance)
Create draft GitHub Release with finalized notes
Dispatch smoke test to downstream
Phase 2 -- Promote (new workflow, e.g. promote-release.yml, triggered by just promote-release or manual dispatch after inspection):
Validate that GHCR X.Y.Z images exist and are signed
Validate that the draft GitHub Release for X.Y.Z exists
Validate that downstream smoke-test passed (pre-release exists for the release tag)
Update GHCR latest tag to point at the X.Y.Z multi-arch manifest
Publish the draft GitHub Release (set non-draft)
Merge the release PR into main (via API merge or auto-merge enablement)
Alternatives Considered
Keep single workflow with a manual approval gate (environment protection rule): Would work but is less flexible -- you can't re-run just the promote step, and the workflow run stays "in progress" during the wait, consuming CI minutes.
Use a GitHub Actions workflow_dispatch input to toggle publish vs promote mode: Possible but overloads the single workflow with too many conditional paths; two separate workflows are easier to reason about and independently retry.
Impact
Operators get a verification window between image publication and promotion to latest
The latest GHCR tag only moves when a human has confirmed the release is good
GitHub Release publication is decoupled from artifact creation
Release branch merge to main is automated as part of the promote phase, reducing manual steps
Backward compatible: the publish phase is a strict subset of the current flow; promote is additive
Additional Context
Related to #455 (TBD bug in release 0.3.1), where the latest tag and GitHub Release were published before anyone could detect that the CHANGELOG date was never set. A two-phase release would have caught this during the inspection window.
Current architecture in .github/workflows/release.yml (lines 1031-1040) unconditionally updates latest during publish for dual-arch final releases. The promote workflow would move this logic into its own job with prerequisite checks.
Description
Split the current single
release.ymlfinal-release flow into two separate workflows: a publish phase that builds and pushes versioned artifacts, and a promote phase that makes them the official "latest" after manual verification.Problem Statement
The current
release.ymlperforms all final-release actions in a single workflow run: finalize CHANGELOG, build images, pushX.Y.Zandlatesttags to GHCR, create a draft GitHub Release, and dispatch smoke tests. This means:latesttag already points to the broken image -- there is no inspection window.mainis fully manual (PR merge) with no automation gate linking it to a successful release.A two-phase approach provides a human checkpoint between "artifacts exist in the registry" and "artifacts are promoted to production."
Proposed Solution
Phase 1 -- Publish (
release.ymlwithrelease-kind=final, triggered byjust finalize-release):X.Y.Z(per-arch + multi-arch manifest, nolatesttag)Phase 2 -- Promote (new workflow, e.g.
promote-release.yml, triggered byjust promote-releaseor manual dispatch after inspection):X.Y.Zimages exist and are signedX.Y.Zexistslatesttag to point at theX.Y.Zmulti-arch manifestmain(via API merge or auto-merge enablement)Alternatives Considered
workflow_dispatchinput to toggle publish vs promote mode: Possible but overloads the single workflow with too many conditional paths; two separate workflows are easier to reason about and independently retry.Impact
latestlatestGHCR tag only moves when a human has confirmed the release is goodmainis automated as part of the promote phase, reducing manual stepsAdditional Context
Related to #455 (TBD bug in release 0.3.1), where the
latesttag and GitHub Release were published before anyone could detect that the CHANGELOG date was never set. A two-phase release would have caught this during the inspection window.Current architecture in
.github/workflows/release.yml(lines 1031-1040) unconditionally updateslatestduring publish for dual-arch final releases. The promote workflow would move this logic into its own job with prerequisite checks.Changelog Category
Changed