Release Workflow¶
This project uses a dual-channel release strategy with two independent release tracks.
Release Channels¶
Alpha Channel (main branch)¶
- Branch:
main - Release format: v0.x.0-alpha
- Trigger: Release-please PR merged to
main - Deployment target: dev environment
- Use case: Continuous development, testing new features
Stable Channel (release branch)¶
- Branch:
release - Release format: v0.x.0 (no alpha suffix)
- Trigger:
v*tag pushed toreleasebranch (manually, see Step 3) - Deployment target: prod environment
- Use case: Production releases after alpha testing
Release Process¶
Step 1: Alpha Release (Automatic)¶
- Make commits to
mainbranch using conventional commits (feat:,fix:, etc.) - Release-please detects version-bumping commits and opens a release PR automatically
- Merge the release-please PR → creates
v0.x.0-alphatag and GitHub release deploy-release.ymltriggers on the tag → deploys to dev environment
Step 2: Test on Dev¶
- Verify smoke tests pass on dev
- Validate features work as expected
- Review deployment logs for issues
Step 3: Stable Release (Manual — 5 steps)¶
IMPORTANT: Release-please does NOT manage the stable release automatically. The release branch
does not receive conventional commits (only merge commits), so release-please cannot compute a version
bump. The stable release must be done manually:
-
Open PR from
main→release. Expect conflicts inCHANGELOG.md,package.json, and.release-please-manifest.json— resolve all three by takingmain's version string. -
Merge the PR (requires admin override — branch protection is on).
-
Fix the manifest on the
releasebranch — set.release-please-manifest.jsonto the last stable version (e.g.0.20.0), NOT the alpha version. Commit and push directly torelease. This step is needed because the PR brought over the alpha manifest, and without this correction release-please would propose the wrong next version if ever triggered. -
Create and push the stable tag manually:
git checkout release && git pull origin release
git tag -a v0.21.0 -m "Version 0.21.0"
git push origin v0.21.0
This triggers deploy-release.yml → prod deploy, and deploy-infrastructure.yml → prod infra.
- Create the GitHub release:
- Update manifest to the new stable version and push:
# Set .release-please-manifest.json to "0.21.0"
git add .release-please-manifest.json && git commit -m "chore: update manifest to 0.21.0 after stable release"
git push origin release
Why Release-Please Doesn't Auto-Create Stable Releases¶
Release-please requires conventional commits (feat:, fix:) on the target branch to compute a
version bump. When main is merged into release, the resulting commit is chore: promote ... —
which release-please ignores. The feature/fix commits are squashed into the merge and not visible
to release-please on the release branch.
Do not attempt to trigger release-please via workflow_dispatch on the release branch — it
will either do nothing or propose the wrong version if the manifest is not correct.
Merge Conflict Resolution (main → release)¶
Conflicts always occur in these three files. Resolution:
| File | Resolution |
|---|---|
.release-please-manifest.json |
Take main's value (the alpha version) |
package.json |
Take main's version string |
CHANGELOG.md |
Keep main's new entries at the top, retain release's existing content below |
Release-Please Configuration¶
Defined in release-please-config.json. Two release-please branch configs exist:
main→ alpha releases (automated via release-please PRs)release→ stable releases (effectively unused; stable releases are manual)
Commit Message Convention¶
Release-please uses conventional commits on main:
feat:→ Minor version bump (v0.x.0)fix:→ Patch version bump (v0.x.1)feat!:→ Major version bump (v1.0.0)
Emergency Hotfixes¶
For urgent prod fixes:
- Create hotfix branch from
release(e.g.hotfix/bug-xyz) - Make fix and test
- PR to
releasebranch - Manually tag and release (same as Step 3 above, but patch version:
v0.21.1) - Cherry-pick or PR the fix back to
mainto keep branches in sync