Skip to content

ci: Replace release-please with a custom version that handles our dev -> prod flow - #305

Merged
finalerock44 merged 2 commits into
devfrom
ci/one-pr-stable-release
Nov 9, 2026
Merged

finalerock44 merged 2 commits into
devfrom
ci/one-pr-stable-release

Conversation

@finalerock44

@finalerock44 finalerock44 commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

What & why

Type of change

  • fix — bug fix
  • feat — new feature
  • perf — performance improvement
  • refactor — code change that's neither a fix nor a feature
  • docs — documentation only
  • chore / ci / build / test — tooling, no user-facing change
  • Breaking change (title has ! or PR notes a BREAKING CHANGE:)

Checklist

  • PR title follows the Conventional Commits format (see comment above)
  • pnpm lint passes
  • pnpm typecheck passes
  • pnpm build passes
  • I have not bumped the version or edited CHANGELOG.md (release-please handles this)
  • I have signed the CLA (the bot will prompt on first contribution)
  • Docs / README.md / STYLE_GUIDE.md updated if behaviour or output changed

How to test

A stable release used to take a hand-built promotion branch (dev, a merge
of production, and an empty Release-As pin commit), a promotion PR, then
release-please's own Release PR, then the back-merge PR.

A new "Promote to stable" workflow (promote.yml) now builds the release
branch: dev, with production merged in, plus one commit that sets the
version in package.json and server.json and adds the CHANGELOG.md
section. It opens that as the only PR into production. Merging it is the
release: the Release workflow tags the untagged version, creates the
GitHub Release from the changelog section, and publishes npm, the
binaries and the back-merge as before.

scripts/stable-release.mjs derives the version from the Conventional
Commit PR titles since the last release, as release-please did, but
never derives a major: a breaking marker stops the run until the version
is given explicitly. Its changelog lists each PR once, using the full
title when GitHub cut it short, where release-please listed such PRs
twice.

Production is merged in on every run because dev only allows squash
merges, so the back-merge can never make production an ancestor of dev.

release-please, its config and manifest, and the Release-As
promotion-pin check are removed. A release-check job verifies every PR
into production instead. Release PRs skip claude-review, like back-merge
PRs, because the review action rejects bot actors. The Release workflow
keeps the release-please.yml filename, because npm's trusted publisher
is registered against it.
Promote to stable now also runs on every push to dev. It rebuilds one
fixed branch, promote/cli-next, and opens the release PR into production
or updates the open one, so the PR always carries all of dev with the
version and changelog to match. Nothing ships until someone merges it.

- A push with nothing releasable since the last release (docs, the
  back-merge) does nothing.
- A version set by hand is kept on later runs (plan --keep) whenever it
  is above the derived one, so a major has to be given only once, and a
  breaking marker still never derives one.
- If production moved during the run, nothing is pushed; the back-merge
  push rebuilds the PR. The force-push is leased against the branch tip
  the run saw, and skipped when the content is unchanged.
- A PR into production from any other branch is left alone: push runs
  warn and stop.
@finalerock44 finalerock44 self-assigned this Nov 9, 2026
@finalerock44
finalerock44 merged commit 6bebbef into dev Nov 9, 2026
10 checks passed
@finalerock44
finalerock44 deleted the ci/one-pr-stable-release branch November 9, 2026 15:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant