9

我在 Visual Studio Online 中使用新的可编写脚本的构建功能(不是 XAML 构建定义),并且我试图让构建版本号包括使用内部版本号格式的目标存储库的最新 Git 提交 ID。

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

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

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

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

这正确地导致了一个值1.0.1234.refs_heads_master

我一直在使用预定义变量引用,并且 Build.SourceVersion 被列为全局变量。

我做错了什么,我是否遇到了错误,或者这是设计使然,并且在构建排队时不可用?如果这是设计使然,有没有办法在内部版本号格式中自动包含简短的 Git 提交 ID?

这是我在 VSO 中设置内部版本号格式的地方: 这是我在 VSO 中设置内部版本号格式的地方

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

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

4

3 回答 3

4

我能够使用$(Build.SourceVersion),但只有在提交时自动触发构建时(在持续集成中)。只有当我手动排队时,它才被证明是空的:

构建队列截图

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

$(BuildDefinitionName)_$(date:yyyyMMdd)_$(Build.BuildId).$(Build.SourceVersion)$(rev:.r)
于 2016-04-12T19:35:30.587 回答
3

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

VSTS 中的源版本字段

于 2016-08-17T16:52:10.830 回答
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()
于 2015-09-17T10:38:50.883 回答