I love Continuous Integration and Deployment for mobile applications and have given several talks on it in the past. It streamlines your entire development process and makes it drop dead simple to simply commit code and have everything you don’t want to do manually be taken care of for you. This means build, test, bump versions, and ship off to testers with integrations like HockeyApp. Notice I mention “bump versions”, which is actually really important. Every build should be assigned a unique number so developers and testers know exactly what is out there. There is nothing worse then seeing 1.0 on every single build and it makes it impossible to ship out to the app store. Today, I will walk you through bumping version numbers on your iOS and Android apps.
If you are looking to get your Xamarin apps setup in VSTS then checkout my blogs for Android and iOS that offer a full walk through. This blog will work with any iOS or Android app regardless of how you build it :)
ALM Build & Release Tools
There unfortunately is no out of the box support from what I have seen to actually bump versions, but we can leverage a marketplace extension from Colin called ALM Build & Release, specifically the “Version Assemblies” step.
Android Version Bumping
In my Android manifest my name and code look like this:
android:versionCode="1" android:versionName="1.0.0"
These are important, as we will use a regex to update them.
We will want to add the “Version Assemblies” task TWICE, once for the version name and once for the version code.
Once added, we will bump the name.
First insert the following (with examples):
- Source Path: src/MobileApps/MyDriving/MyDriving.Android/Properties
- File Pattern: AndroidManifest.xml
- Build Regex Pattern: (?:\d+.\d+.\d+.)(\d+)
Under Advanced:
- Build Regex Group Index: 0
- Regex Replace Pattern: versionName=“\d+.\d+.\d+
- Prefix for Replacements: versionName=”
What this will do is update the version name to the Build number format found under “General”, which mine is set to 1.0.0$(rev:.r)
Now for the next one, which is the version code:
- Source Path: src/MobileApps/MyDriving/MyDriving.Android/Properties
- File Pattern: AndroidManifest.xml
- Build Regex Pattern: (?:\d+.\d+.\d+.)(\d+)
Under Advanced:
- Build Regex Group Index: 1
- Regex Replace Pattern: versionCode=“\d+
- Prefix for Replacements: versionCode\
And just like that you are good to go. This will simply update it with the current version revision :)
iOS Version Bumping
This one is a bit trickier and requires some specific things set in the Info.plist. We will need to ensure that the following are set to these very very specific version numbers in the actual Info.plist:
- CFBundleShortVersionString: 1.0.1
- CFBundleVersion: 1.1.1
Don’t ask me why, just trust me!
Under General I have set my build number format to 1.2.$(rev:.r):
I think we just happened to be on 1.2 which is why it is like this, your mileage may vary here. Now we will add the Version Assemblies task TWICE, just like we did for Android.
Let’s first bump the CFBundleShortVersionString:
- Source Path: src/MobileApps/MyDriving/MyDriving.iOS
- File Pattern: /Info.plist
- Build Regex Pattern: (?:\d+.\d+.)(\d+)
Under Advanced:
- Build Regex Group Index: 1
- Regex Replace Pattern: <string>1.0.\d+
- Prefix for Replacements: <string>1.2.
That will bump it to 1.2.BuildNumber.
Let’s then bump the CFBundleVersion:
- Source Path: src/MobileApps/MyDriving/MyDriving.iOS
- File Pattern: /Info.plist
- Build Regex Pattern: (?:\d+.\d+.)(\d+)
Under Advanced:
- Build Regex Group Index: 1
- Regex Replace Pattern: <string>1.1.\d+
- Prefix for Replacements: <string>1.2.
As you can see I have to execute these in a specific order to not bump versions differently. It is tricky, but so are regex. And there you have it, bumping versions for both iOS and Android inside of Visual Studio Team Services.