I am a big fan of automating builds. Even for simple and small projects, the builds should be fully automated. This makes sure that the software is built on a different machine than it is developed on. A great side effect is that the unit tests are really ran (because how many developers actually run the unit tests before checking in the code?). I am also a big fan of GitFlow. I won’t go into details, but I like that fact that you can always release a hotfix on the master branch while keeping a separate development branch.
After reading this blog post, you can automatically determine the version of software that follow GitFlow or GitHubFlow:
Stop versioning the software yourself
One issue though is that you have to manage the versioning in the Continuous Integration (CI) software. Managing the versions of all software projects I contribute to is almost a daytime job. Then I came along an awesome project called GitVersion. It can automatically determine the version of your software based on your repository. This means you no longer have to manage any states of the software, but you can simply ask GitVersion to determine the version for you following the GitFlow / GitHubFlow:
Copyright notice: image originally comes from the GitVersion website
To determine the version of a repository, use the following command line:
GitVersion.exe /url https://github.com/Orcomp/Orc.FilterBuilder.git /b develop
This will result in this version for the 8th commit in the develop branch:
Version not in cache. Calculating version.
"LongVersion":"1.3.0-unstable8 Branch:'develop' Sha:'31b1a6cb78801b3137c477d35
Integration in your favorite CI software
The CI software I prefer to use is Continua CI. The reason I like it is that it is very easy to understand but in the same time it is really, really powerful. Another great advantage is their support: they implement features / fix bugs within a week which is nice compared to other companies where you have to wait until the next major release to hopefully find your feature request implemented.
To integrate GitVersion into Continua CI, use the steps below.
1) Add GitVersion.exe to your repository
Add GitVersion.exe to your repository (or put it on the build server, whatever you prefer). I like to put it in the tools directory of my repository:
2) Define version variables in the Continua CI configuration
Note that you can use all versions that GitVersion exposes in the example above. The naming convention must be GitVersion_[VariableName]. Below is an example of versions that I find useful during builds:
3) Call GitVersion.exe at the start of the build
In Continua CI, add the Execute Program action to a stage and use the settings below:
Don’t forget the set the arguments as well:
/url $Source.YourRepository.Url$ /b $Source.YourRepository.BranchName$ /output buildserver
4) Update the AssemblyInfo
I prefer to put the version of a solution in a centralized SolutionAssemblyInfo which is shared over all the projects that are part of a solution. After calling GitVersion.exe, you can update the version in the AssemblyInfo of your project: