确定如何从 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 步骤中调用它。
在 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 步骤中调用它。