ci(release): production deploys from a pointer branch the pipeline advances - #202
Merged
Conversation
…vances Production was bound to main on Railway, which meant every merge could reach production — the docs claimed "prod on v* tag" but nothing implemented it. Railway has no tag-triggered deploys, so the tag gate becomes a branch the pipeline owns: `production` is a deploy pointer, not an integration branch. No PR targets it, no human commits to it; its only writer is release.yml's final step, which force-pushes the tagged commit after the gate, the image push and the GitHub release have all succeeded. Railway's production service binds to it with auto-deploy — advancing the pointer IS the production deploy, and a tag whose pipeline fails never reaches it. The step runs for stable releases only, the same policy that keeps prereleases off the `latest` image tag. Force-push is deliberate: re-running the workflow via workflow_dispatch on an OLDER tag points production back at it — that is the rollback mechanism, and a rollback is never a fast-forward. The branch is named `production` rather than `release` because release/X.Y is reserved for future maintenance lines, and a branch that answers "what is production running" should say so. `production` was created at v0.3.0 so Railway can be re-bound immediately; docs updated (RELEASING.md pipeline steps + new Production Deploy section + rollback via dispatch, CLAUDE.md branch table).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the deploy model from today's discussion: production binds to a fixed branch that only the release pipeline moves.
The model
productionis a deploy pointer, not an integration branch — no PR targets it, no human commits to it. Its only writer isrelease.yml's final step.productionwith auto-deploy: advancing the pointer IS the deploy.latestimage tag.workflow_dispatchwith the previous tag; the final step pointsproductionback at it and Railway redeploys. (Force-push is deliberate — a rollback is never a fast-forward.)Named
productionrather thanreleasebecauserelease/X.Yis reserved for future maintenance lines (CLAUDE.md), and a branch that answers "what is production running" should say so.Already done outside this PR
productionbranch created at v0.3.0 (b8a18ab) — Railway can be re-bound now, before this merges.Railway steps (manual, one-time)
main/ turn off its auto-deploy (do this first — today every merge to main can reach prod)productionbranch, auto-deploy onFiles
.github/workflows/release.yml— final step: force-push tagged commit torefs/heads/production, stable releases only (contents: writealready present; checkout credentials persist by default)docs/RELEASING.md— pipeline step 8, new "Production Deploy" section, rollback rewritten aroundworkflow_dispatchCLAUDE.md— branch table row forproduction;main's row no longer claims prodNot verified