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

时间:2016-04-20 20:47:27

标签: msbuild tfsbuild tfs2015 azure-pipelines

在TFS2015上的MSBuild中是否存在任何属性等( XAML构建),这将使我能够确定特定构建是手动启动还是通过CI触发器启动?

我正在尝试避免使用两个构建定义,这两个构造定义的区别仅在于当前作为属性传入的true / false值,例如与

/p:Manual=true

然后我在我的项目中使用

$(Manual)

如果没有这个,看起来我需要两个定义 - 一个通过CI触发并在该属性中传递为 False ,另一个传递 True 的手册。如果我有办法找到它,那么构建是签入的结果,那么我可以逃脱需要两个。

编辑4/21/16

只是为了澄清,我知道Build定义中没有属性,我正在寻找实际的MSBuild进程(因为它正在运行),这将使我能够确定这一点。

此时即使获得安排构建的用户的登录ID也会这样做 - 如果它是触发式构建,我的猜测是运行TFS的服务帐户,否则它就是人。

4 个答案:

答案 0 :(得分:2)

自动执行此操作的方法是在msbuild之前运行powershell,在其中您可以使用其余的api来获取当前正在执行的构建的原因here

将rest api调用的返回值传递给变量并访问msbuild中的变量。

还有很多其他方法可以实现自动化。这是一种方式。

答案 1 :(得分:2)

为了扩展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步骤中调用它。

答案 2 :(得分:1)

在触发构建时,构建代理会设置一些环境变量。您可以使用它们来确定用户是请求构建还是系统标识以及是否为其请求构建。来自文档:

 | 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 MsBuildBuild.RequestedFor在您的msbuild文件中变为$(BUILD_REQUESTEDFOR)

它无法确定构建是CI,Gates,Nightly还是Batched,但它确实将手动排队的构建与触发的构建区分开来,这似乎是您所追求的。

答案 3 :(得分:-1)

您可以在vNext构建中添加一个构建变量(例如,称为IsManual),其默认值设置为False,因此每次构建由CI触发时,它将采用默认值。

手动排队时,您必须更改变量值。

enter image description here

enter image description here