Force A Prerelease With Semantic Release

Force A Prerelease With Semantic Release

Recently, I had a project at work running Semantic Release to manage releases. It was currently at v4.5.0 for the main release channel and v4.0.0-next.22 for the next prerelease channel.

Problem

Obviously, the prereleases were behind the main releases and I wanted our next stable release to be v5.0.0 and before that, have the prerelease to v5.0.0-next.1.

I tried pushing the typical feat!: bump commits, without success: Semantic Release just kept incrementing the next part (ex.: v4.0.0-next.23), and refused to increment the major version (to v5.0.0-next.1) like I wanted.

Solution

To tackle this problem, I tried the following these steps:

  • create an empty commit feat: release v5.0.0-next.1

  • create a tag v5.0.0-next.1 to point to that commit

  • create a prerelease on GitHub to point to that tag

But when pushing everything to GitHub, Semantic Release would still fail (the tag v5.0.0-next.1 already existed). And if I deleted the tag again, Semantic Release would revert to its behaviour of increment the next part (v4.0.0-next.23).

The solution to avoid this was to update the notes for Semantic Release accordingly after creating the v5.0.0-next.1 tag:

git notes --ref semantic-release add -f -m '{"channel":["next"]}' v5.0.0-next.1
git push --force origin refs/notes/semantic-release

I found this tip by looking at the docs (though these commands are listed as a solution for a different issue).

This is obviously a dangerous action, but when done correctly, it can get you out of a bind!