I can’t speak toward “best”, but there are a couple tools that I’ve seen used or used myself. One such solution that has been adopted by Spring Cloud, Ubuntu, and a number of other products is Calendar Versioning (CalVer)
Calendar Versioning works like this:
- The 4 digit year is the major version
- All other version markers are for a whole release
- This version is used collectively for a larger product, and individual components can have an independent version number
I’ve used Release Train numbering. We break up our deliveries into consistently sized release trains, so internally we use
RT25 to version the collective microservices. When we deliver to our customer, we simply alias the RT number with the customer’s version number–who uses Semantic Versioning (SemVer), but with their own semantics of how to increment the numbers. We do that because we’ve had cases where we thought the customer’s semantics would apply for a different number, but they surprised us.
That said, our individual libraries and microservices have their independent version numbering, and the RT version (or CalVer) applies to the collective for a particular release.