Skip to content

feat(release): rc prereleases from main, promote to release branch for stable - #36

Merged
andiikaa merged 2 commits into
mainfrom
fix/service-manager-pipeline
Oct 30, 2026
Merged

andiikaa merged 2 commits into
mainfrom
fix/service-manager-pipeline

Conversation

@andiikaa

Copy link
Copy Markdown
Member

Why

semantic-release published each GitHub release right away, and GoReleaser attached the archives several minutes later. Anything that resolved releases/latest in that window (CI pipelines, install_nova.sh) got a release with no assets and failed.

Also, every merge to main went straight to Homebrew/winget/latest without anyone verifying it first.

What

Two channels (details in the new RELEASING.md):

from published to
x.y.z-rc.N every merge to main GitHub prerelease + ghcr…/nova-cli:x.y.z-rc.N
x.y.z fast-forwarding release to a verified rc (new Promote workflow, or git push origin <sha>:release) GitHub release, Homebrew, winget, docker :latest, docs
  • .releaserc.json: release is the stable branch and main is the rc prerelease branch. Releases are created as drafts.
  • .goreleaser.yaml: use_existing_draft. GoReleaser uploads the archives and only then publishes the release. prerelease: auto keeps rc builds as prereleases.
  • release.yml: also runs on release. For rc builds it skips Homebrew, winget, docker :latest and the docs deploy.
  • promote.yml (new): checks the commit is on main and that release can be fast-forwarded to it, pushes it, then dispatches the Release workflow.
  • Docs: RELEASING.md (new), CONTRIBUTING.md, README.md, AGENTS.md.

releases/latest ignores prereleases, so consumers of it only ever get stable, fully uploaded versions.

Before merging

  • Create the release branch at the current stable version. semantic-release fails if a configured release branch doesn't exist:
    git push origin 0.1.0^{commit}:refs/heads/release
  • If release is protected, allow GitHub Actions to push to it (needed by the Promote workflow).

After merging, this PR (feat) should produce 0.2.0-rc.1.

Testing

actionlint and goreleaser check pass. The workflows themselves can't be run before merge. After merge, check that the run produces a prerelease 0.2.0-rc.1 and doesn't touch Homebrew or winget.

…r stable

Merges to main now publish x.y.z-rc.N GitHub prereleases (archives + docker
tag) only. Stable x.y.z releases (Homebrew, winget, docker latest, docs) are
cut by fast-forwarding the new `release` branch to a verified rc via the
Promote workflow.

semantic-release creates releases as drafts; GoReleaser uploads the archives
and publishes them, so releases/latest never points at a release without
assets, and never at an rc.

Documented in RELEASING.md.
@andiikaa
andiikaa merged commit e5830ef into main Oct 30, 2026
16 checks passed
@andiikaa
andiikaa deleted the fix/service-manager-pipeline branch October 30, 2026 10:38
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