I am using the new scriptable build features in Visual Studio Online (not the XAML build definitions), and I am trying to have the build version number include the latest Git Commit ID of the target repository using the Build Number Format.
I am using the following build number format:
$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceVersion)
Which results in a generated version number of 1.0.1234.
- i.e. the SourceVersion value is blank, which causes an error in VSO when queueing a build. I have also tried qualifying the variable by prefixing it with Build.
with the same result. To test, I have changed the build number to the following format:
$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceBranch)
This correctly results in a value of 1.0.1234.refs_heads_master
I have been using the Predefined Variables reference and Build.SourceVersion is listed as a Global Variable.
Am I doing something wrong, have I encountered a bug or is this by design and not available at the time the build is queued? If this is by design, is there any way to automatically include the short Git Commit ID in the Build Number Format?
This is where I set the build number format in VSO:
This is the error I see when I don't explicitly specify a Git CommitId:
400: The build number format string
$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceVersion) generated
a build number 0.1.1. which contains invalid character(s), is too
long, or ends with '.'. The maximum length of a build number is 255
characters. Characters which are not allowed include '"', '/', ':',
'<', '>', '\', '|', '?', '@', and '*'.
I was able to use $(Build.SourceVersion)
, but only when builds were triggered automatically on commit (on Continuous integration). It turns out to be empty only if I queue it manually:
I'm using the following Build number format:
$(BuildDefinitionName)_$(date:yyyyMMdd)_$(Build.BuildId).$(Build.SourceVersion)$(rev:.r)
NeoGarRiGus - it turns out empty because when you run a manual build you have to enter the Source Version field in order for it to populate. The CI inputs that value automatically when a Dev check's in but when you queue a build manually there is a blank field in the pop-up that allows you to enter the Source Version:
Source Version Field in VSTS
I'm afraid it is not able to use $(SourceVersion)
in the build number format. However, I think you can use PowerShell to change build number to be $(SourceVersion)
, and you need to include the PowerShell in your build process. Check this link for the details.
And you can define the PowerShell to be similar to:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.WorkItemTracking.Client")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client")
[System.Reflection.Assembly]::LoadWithPartialName("System.Net")
[String] $CollectionUrl = "https://vsoserver.visualstudio.com/defaultcollection"
[String] $BuildUrl = $env:BUILD_BUILDURI
$netCred = New-Object System.Net.NetworkCredential("username","password")
$basicCred = New-Object Microsoft.TeamFoundation.Client.BasicAuthCredential($netCred)
$tfsCred = New-Object Microsoft.TeamFoundation.Client.TfsClientCredentials($basicCred)
$teamProjectCollection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection($CollectionUrl,$tfsCred)
$buildServer = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.Build.Client.IBuildServer")
$buildDetail = $buildServer.GetBuild([Uri]$BuildUrl)
$buildDetail.BuildNumber = $Env:BUILD_SOURCEVERSION
$buildDetail.KeepForever = $true
$buildDetail.Save()