在 TFS2015 构建名称中使用 SourceVersion 和 rev:r

Using SourceVersion and rev:r in TFS2015 build names

我们有一个使用 XAML 构建的过程,该过程在各个构建的名称中使用了 TFS 更改集编号。我们正在尝试将其中一些构建转换为 TFS 2015 上的新构建系统,运行 将更改设置为构建名称的问题。

如果我们在构建定义的构建编号格式字段中使用 $(Build.SourceVersion)$(Rev:.r),我们会在触发构建时得到 C12345.1 的输出,但是然后 .1 在手动排队的构建上。我们希望看到 C12345.2。许多研究归结为,当构建排队时必须手动输入 $(Build.SourceVersion) 以便在计算构建号时填充它。

好的,所以我们进入 PowerShell 以尝试操纵内部版本号。一旦进入 PowerShell 任务,Build.SourceVersion 就会填充正确的值。我们尝试将定义的内部版本号格式设置为 $(rev:r),这使我们能够在 PowerShell 中获取它,将其与源版本值组合,并使用结果通过日志记录更新内部版本号命令 Write-Host "##vso[build.updatebuildnumber]"$buildVersion。这为我们提供了触发构建和手动构建的 12345.1 输出,但 rev:r 永远不会增加,因为没有构建与计算时在构建编号格式中找到的模式相匹配。因此,手动对构建进行排队最终会得到任意数量的具有完全相同名称的构建。

有没有人有获取构建名称的方法,该名称可靠地包含源版本和修订值,其中对于触发构建和手动构建,所有内容都正确递增?

不,它不能这样做。你需要先了解令牌$(Rev:.r)

What is $(Rev:.rr)?

To ensure that every completed build has a unique name. When a build is completed, if nothing else in the build number has changed, the Rev integer value is incremented by one.

Source:MSDN

在您的场景中,您将版本号格式设置为 $(Build.SourceVersion)$(Rev:.r),如果 $(Build.SourceVersion) 的值发生变化,那么 $(Rev:.r) 的值将不会递增,它会一直保持“1”。只有$(Build.SourceVersion)的值保持不变,然后$(Rev:.r)会递增。

此外,根据我的测试,构建编号格式中的变量$(Build.SourceVersion)仅在commit/checkin(连续一体化)。当你排队构建手动并保持Source Version字段为时无法解决(默认它会得到最新版本). 因此,如果您手动对构建进行排队,则需要在队列构建对话框中指定特定的 Source Version(例如 C458)。

但是,如果您想将构建名称设置为增量名称,您可以使用 REST API:

手动更新构建编号
PATCH http://server:8080/tfs/Collection/Project/_apis/build/builds/{buildId}?api-version=2.0

Content-Type: application/json

{
  "buildNumber": "TEST.20170123.1"
}

因此,经过大量研究和反复试验,这是我们最接近预期输出的结果...

  • 内部版本号格式在配置中设置为$(Build.SourceVersion).$(Build.BuildId)
  • 我们使用 powershell 脚本解析程序集文件、源版本和构建 ID,以 Major.Minor.ChangeSet.BuildId.
  • 的形式得出完整的 4 部分版本号
  • 我们使用 Write-Host "##vso[build.updatebuildnumber]"$buildNumber
  • 将这个新版本号推回我们的内部版本号
  • 我们还使用了 Assembly Info 步骤将这个计算出的版本号推回到实际的构建过程中,这样 DLL 的版本号就与构建时的版本号相同。

这为我们提供了一个版本号,该版本号对于每个构建都是唯一的,并指向源的特定特定状态,这是优先级。我们失去的是随着每次更改而重置的漂亮递增的内部版本号。相反,我们有一个数字,它会随着系统中任何地方发生的每个构建而递增,并且永远不会重置。