Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>
- Loading branch information
Showing
1 changed file
with
141 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
--- | ||
date: 2023-09-27 | ||
slug: release-cadence | ||
categories: | ||
- announcements | ||
authors: | ||
- caarlos0 | ||
--- | ||
|
||
# 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 [0ver](https://0ver.org)[^joke] scheme for _almost 5 years_. | ||
We had a whopping _468 `v0.x.x` releases_. | ||
Let me repeat: **four hundred and sixty eight v zeroes**. | ||
|
||
[^joke]: yes, I know this is kind of a joke. | ||
|
||
In fact, `v1` was launched less than 2 years ago, in [November, 2022][v1]. | ||
|
||
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][deprecations] 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][semver-si4], 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`. | ||
|
||
[semver-si4]: https://semver.org/#spec-item-4 | ||
|
||
## Going forward | ||
|
||
Thankfully, I was nudged in the right direction, so, from now on, we'll do | ||
things properly. | ||
|
||
The plan is as follows: | ||
|
||
1. We'll have 1 _minor_ release 1-2 months (when we have some material); | ||
1. Bug fixes will still be released as _patch_ releases in the latest _minor_; | ||
1. Deprecations will continue to be added in _minor_ releases (but **not | ||
removed**); | ||
1. 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][gpro] 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][gpro] 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][gha] 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][gpro] 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][dis], | ||
and specially, [@LandonTClipp](https://github.com/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! | ||
|
||
[v1]: ./2021-11-14-goreleaser-v1.md | ||
[deprecations]: ../../deprecations.md | ||
[dis]: https://github.com/orgs/goreleaser/discussions/4169 | ||
[gpro]: ../../pro.md | ||
[gha]: https://github.com/goreleaser/goreleaser-action | ||
[Sponsors]: https://github.com/caarlos0 |