Version strategy and release cadence: the future¶
A couple of weeks ago, I got a couple of complaints about the way GoReleaser is being versioned - more precisely, the fact that deprecated options are removed in minor instead of major versions.
Those complaints are valid, and today I'm announcing how I plan to move forward.
History¶
Before we do that, I feel like I should explain how we got in this position first.
GoReleaser was in a 0ver1 scheme for almost 5 years. We had a whopping 468 v0.x.x
releases. Let me repeat: four hundred and sixty eight v zeroes.
In fact, v1
was launched less than 2 years ago, in November, 2022.
Like many other things, the way we handle deprecations was from that time. A time in which GoReleaser never had major releases, because there wasn't one: we would add the deprecation notice to the deprecations page and warn about it in the release's output if you use any of them, and, after roughly 6 months, remove the deprecated option and move on with life.
Breaking changes are allowed in v0, so, there were no broken promises.
On the other hand, v1
is a major version, so it should not introduce breaking changes.
In retrospect, my mistake was never stopping to think about it again after v1
.
Going forward¶
Thankfully, I was nudged in the right direction, so, from now on, we'll do things properly.
The plan is as follows:
- We'll have 1 minor release 1-2 months (when we have some material);
- Bug fixes will still be released as patch releases in the latest minor;
- Deprecations will continue to be added in minor releases (but not removed);
- When we have a good amount of deprecations, we'll launch a new major, removing them completely. I think this will probably happen about once a year.
So, if you lock your CI to get v1.x.x
, you might get new deprecation warnings, but no breaking changes.
You can then better plan when to upgrade your apps to the latest major, without having to lock to a specific minor/patch release.
Supporting old versions¶
I understand GoReleaser has become the de-facto tool to release Go projects. I don't know how many users we have (because we don't track you), but judging by some code searches on GitHub, there are thousands of repositories using it.
GoReleaser is also a big project. Maintaining it could already be a full-time job, but, it isn't. I work on it on my free time, which is limited - just like yours.
All that being said, I understand that big companies and teams rely on GoReleaser, and some don't release as often.
With that in mind, GoReleaser Pro customers will have more time to update: I'll keep launching patch releases of the latest major containing relevant bug fixes and security-related fixes.
If you use the OSS version, you can either pin to the previous major, or update to the new one. You can also get a GoReleaser Pro license, and help fund this project.
I haven't yet developed the exact rules for which bug fixes will get backported or not, but I'm quite confident that it'll be a mix of "fixes for really bad bugs" and "a customer is experiencing it and asked it to be fixed", and, of course, any security-related fixes.
So, when v2?¶
Probably in a couple of months.
Stay tuned! 📰
Early access¶
Since a couple of weeks ago, we're building a new nightly automatically every week.
You can already use nightly as the version in our GitHub Action if you can't wait for a new feature that's already on main
.
This works for both the Pro and OSS distributions.
Summing up¶
The TLDR:
- new major version ~yearly;
- new minor version every ~two months;
- new patch versions whenever its needed, in the latest minor only;
- Pro latest version keep getting security updates and relevant bug fixes;
- nigtlies weekly for both Pro and OSS;
Thank you notes¶
I would like to publicly thank everyone who commented and shared both their pains and their experiences in the discussion that started all this, and specially, @LandonTClipp, who created it.
All of us that do OpenSource know how easy a conversation like this could have gone south. Thankfully, this was not the case here. 💌
Thank you, for real. Thank you for patience, for the contributions, and for pointing out ways I can make GoReleaser better.
See you all soon!
-
yes, I know this is kind of a joke. ↩