I have been on the hunt for a while for a good versioning scheme that's flexible enough to meet the needs of multiple teams, not be too complex, and also not have enormous numbers right out of the gate (hint hint, like the number 53 - you know who you are).
I really like how the Linux kernel does its general release management, so this is slightly taken from them, as well as Crux Linux package versioning.
That said, versioning schemes are a very opinionated matter, from no versioning, to date built, all the way to just using a build number (which quickly reaches into the thousands if you do CI and CD - a new build and new version per commit effectively).
That said, let's get to the details.
This versioning scheme has three (well, kind of four) digits. It looks like...
X. X. X
major minor hotfix
The first digit, major
, is obviously the major version. It should rarely
increment unless there is a huge change in the software or you decide your
minor version is just too big (how's that for arbitrary).
The second digit, minor
, is the version that should increment for each new
release cycle. Depending on how fast your release cycles are, you will reach
well into the tens on this on before incrementing the major digit.
The last digit, hotfix
, should almost always be 0
. Originally this scheme
was two digits, but that doesn't account for a world where not every unit,
smoke, and integration test is written (which is most teams I think) and
something is missed. It also doesn't account for managers who can't tell
customers to wait for the next cycle. This digit is for those scenarios when
you've done a complete release, to production, but need to do a hotfix release.
If you ever need to go above 1 or 2 on this digit, you're probably doing it
wrong and should see a couselor about your boundary issues.
As mentioned, there is possibly a 4th digit (if you feel the need for it). This digit is not for the software developers, but for the deployment team, so it's quite optional in most cases I think. This should always be 0, unless the deployment team needs to make changes to the deployment process contained within your package (usually configs and whatnot). Arguably though, if you're storing deployment configurations next to your application code, you might be doing it wrong (though that's very subjective).
With that, this is a very optional digit.
X. X. X. X
major minor hotfix package
In application, this should solve all the problems mentioned at the start of
the post. Throw on a -rcX
to the end and you'll have a release candidate
process (much like the Linux kernel) for your higher level testing environments
without needing to change your versioning scheme. You can even create git tags
that match!
Writing this post has been quite the release! (sorry - I had to make the pun)
Written on: 2017-05-08 08:38:20 -0600
Last edited: 2025-03-04 02:45:12 UTC