Build.SourceVersion在VSO vNext Build

时间:2015-09-16 08:46:27

标签: git azure-devops azure-pipelines

我正在使用Visual Studio Online中的新脚本化构建功能(而不是XAML构建定义),我正在尝试使用内部版本号格式将构建版本号包含在目标存储库的最新Git Commit ID中。 / p>

我使用以下内部版本号格式:

$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceVersion)

这会导致生成的版本号为1.0.1234. - 即SourceVersion值为空,这会在排队构建时导致VSO出错。我还尝试通过在Build.前面添加相同的结果来对变量进行限定。为了测试,我已将构建号更改为以下格式:

$(MajorVersion).$(MinorVersion).$(BuildId).$(SourceBranch)

这正确导致值1.0.1234.refs_heads_master

我一直在使用Predefined Variables引用,Build.SourceVersion被列为全局变量。

我做错了什么,我遇到过一个错误,或者这是设计的错误,在构建排队时不可用?如果这是设计,有没有办法自动包含构建号格式的短Git提交ID?

这是我在VSO中设置内部版本号格式的地方: This is where I set the build number format in VSO

这是我在没有明确指定Git CommitId时看到的错误:

  

400:内部版本号格式字符串   $(MajorVersion)。$(MinorVersion)。$(BuildId)。$(SourceVersion)生成   内部版本号0.1.1。其中包含无效字符   长,或以'。'结尾。内部版本号的最大长度为255   字符。不允许的字符包括'“','/',':',   '<','>','\','|','?','@'和'*'。

3 个答案:

答案 0 :(得分:4)

我能够使用$(Build.SourceVersion),但只有在提交时自动触发构建(在持续集成上)。只有当我手动排队时才会显示为空:

Build queue screenshot

我使用以下Build号格式:

$(BuildDefinitionName)_$(date:yyyyMMdd)_$(Build.BuildId).$(Build.SourceVersion)$(rev:.r)

答案 1 :(得分:3)

NeoGarRiGus - 结果是空的,因为当您运行手动构建时,您必须输入源版本字段才能填充它。当开发人员检查时,CI会自动输入该值,但是当您手动对构建进行排队时,弹出窗口中会出现一个空白字段,允许您输入源版本:

Source Version Field in VSTS

答案 2 :(得分:2)

我担心它无法在内部版本号格式中使用$(SourceVersion)。但是,我认为您可以使用PowerShell将内部版本号更改为$(SourceVersion),并且需要在构建过程中包含PowerShell。查看此链接了解详细信息。

您可以将PowerShell定义为类似于:

[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()