确定如何从 Msbuild 内部启动 TFS 2015 构建

Determine how a TFS 2015 build was initiated from inside Msbuild

在 TFS2015 的 MSBuild 中是否有任何属性等(不是 XAML 构建)可以让我确定如果特定构建是手动启动的还是通过 CI 触发器启动的?

我试图避免有两个构建定义,它们仅在当前作为 属性 传入的 true/false 值不同,例如与

/p:Manual=true

然后我在我的项目中使用它作为

$(Manual)

如果没有这个,我似乎需要两个定义 - 一个通过 CI 触发并在 属性 中作为 False 传递,另一个手动通过 True。如果我有办法找出它的构建是签入的结果,那么我就可以摆脱需要两个。

编辑 2016 年 4 月 21 日

澄清一下,我知道构建定义中没有 属性,我正在寻找实际 MSBuild 过程中的内容(因为它是 运行),这将使我能够确定这一点。

在这一点上,即使获得安排构建的用户的登录 ID 也可以 - 如果它是触发构建,我猜那将是服务帐户 运行 TFS,否则它就是一个人。

您可以将默认值设置为 False 的构建变量(例如称为 IsManual)添加到您的 vNext 构建中,这样每次构建被 CI 触发时,它将采用默认值。

当您手动对构建进行排队时,您必须更改变量值。

一种自动执行此操作的方法是 运行 msbuild 之前的 powershell,您可以在其中使用其余部分 api 获取当前执行构建的原因,如记录 here

将其余 api 调用的 return 值传递给一个变量,并在 msbuild 中访问该变量。

可以有许多其他方法来自动执行此操作。这是一种方式。

有几个环境变量是在触发构建时由构建代理设置的。您可以使用这些来确定构建是由用户还是系统身份请求的,以及构建是为谁请求的。来自文档:

 | Build.RequestedFor | BUILD_REQUESTEDFOR | This user the build was requested
 |                    |                    | for. In a CI build this will be
 |                    |                    | the user who performed the check-
 |                    |                    | in that triggered the build.
 ------------------------------------------------------------------------------
 | Build.QueuedBy     | BUILD_QUEUEDBY     | The identity of the user who 
 |                    |                    | queued the build. In the case 
 |                    |                    | of CI and Scheduled this will 
 |                    |                    | simply be the system identity
 |                    |                    | 
 |                    |                    | * For manual this will be the 
 |                    |                    |   identity of the user who queued
 |                    |                    |   the build
 |                    |                    | 
 |                    |                    | * For external triggers it will 
 |                    |                    |   be the identity used to 
 |                    |                    |   authenticate to the service
 ------------------------------------------------------------------------------
 | Build.SourceTfvcShelveset | BUILD_SOURCETFVCSHELVESET  | If you are 
 |                           |                            | running a gated 
 |                           |                            | build or a 
 |                           |                            | shelveset build 
 |                           |                            | Queue a build, 
 |                           |                            | this is set to 
 |                           |                            | the name of the 
 |                           |                            | shelveset you 
 |                           |                            | are building.
 ---------------------------------------------------------------------------

can access these variables inside MsBuild,因此 Build.RequestedFor 在您的 msbuild 文件中变为 $(BUILD_REQUESTEDFOR)

关于构建是 CI、Gates、Nightly 还是 Batched 并不确定,但它确实区分了手动排队的构建和触发的构建,这似乎是您所追求的。

为了扩展 Dhruv 的回答,这里是记录 TFS 2015 构建原因的相关 Powershell 代码:

# Retrieve build reason via REST API call and set as TFS 'Build.BuildReason' variable
$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECT/_apis/build/builds/$env:BUILD_BUILDNUMBER`?api-version=2.0"
$header = @{"Authorization" = "Bearer $env:SYSTEM_ACCESSTOKEN"}
$response = Invoke-RestMethod $url -Headers $header
$reason = $response.reason
Write-Host "##vso[task.setvariable variable=Build.BuildReason;]$reason"

在需要引用构建原因的任何步骤之前的 Powershell 步骤中调用它。