Stable Release Workflow
stable-releases.yml
in FOGProject/fog-workflows is the pipeline that turns whatever’s currently
on dev-branch into a tagged, published stable release. It runs monthly
(11 11 11 * * — the 11th at 11:11 UTC) or on demand via
workflow_dispatch. See Version Sync Automation
for how the version number itself gets computed; this page covers what
happens once a release is actually cut.
The flow
create-release-pull-requestreadsFOG_VERSIONstraight out ofdev-branch’ssystem.class.phpand compares it to the tag name of the latest published GitHub release. If they match, there’s nothing new to release — the run stops here (no-release-neededposts a “nothing to release” note to Discord and exits). If they differ, it opens adev-branch → stablePR titledStable Release PR For {version} - {date}.run-install-teststriggersFOGProject/fogproject-install-validation’srun_all_distros.yml— the full matrix of supported distros.check-all-tests-completed-successfullypolls that run until it reportssuccessorfailure, and fails the job if the distro tests failed.- On success,
merge-after-all-tests-passedmerges the PR (dev-branchintostable). On failure,close-pr-if-tests-failcloses the PR instead and posts a failure notice to Discord — nothing gets released. tag-and-release(only after a successful merge) builds the release:- Generates base notes via GitHub’s
releases/generate-notesAPI. - Appends a
## Commitssection built fromgit log, filtering out merge commits, prior “Stable Release” PR commits, andchore: fix stale FOG_VERSION/FOG_CHANNELfixup commits (see Version Sync Automation) — those stay in git history, they’re just excluded from the rendered changelog so a run of near-identical bot commits doesn’t spam the notes. - Appends issues closed since the previous release, and any new/updated
GitHub security advisories — for the latter, it also PATCHes the
advisory itself, appending this release’s tag to
patched_versions. - Publishes the GitHub release (
gh release create) tagged and titled with the version, marked--latest.
- Generates base notes via GitHub’s
sync-branchesopens and merges astable → dev-branchPR, so the release commit (and its tag-adjacent history) flows back intodev-branchrather than the two branches silently diverging.discord-successposts the release announcement with a link to the GitHub release notes.
Why it’s structured this way
- Reading the version instead of computing it: this workflow only ever
reads
FOG_VERSIONto decide whether there’s something new to release — it never recomputes it.stable’s version is entirely the one already computed ondev-branchby the mechanisms in Version Sync Automation; this workflow just decides when to promote it. That’s also why the version-sync daily sweep runs at 10:10 UTC, just over an hour before this workflow’s 11:11 UTC slot — a release day always reads a version that’s current. - Tests gate the merge, not the version: nothing here is a
pull_request-triggered CI check. The install-validation suite runs after the release PR is opened, and only a passing run causes the merge to happen — a failing run closes the PR instead of leaving it open indefinitely. - The sync-back PR exists so
stableanddev-branchnever drift apart after a release — without it, the release/tag commit created directly onstablewould only ever exist there.
Related
- Version Sync Automation — how
FOG_VERSION/FOG_CHANNELare kept correct on every branch, includingdev-branchbefore this workflow ever reads it. - Fog Release — the manual side of a release (kernel, init, and iPXE binary updates) that typically happens before this workflow is triggered.