确定如何从Msbuild内部启动TFS 2015生成

确定如何从Msbuild内部启动TFS 2015生成,msbuild,tfsbuild,tfs-2015,azure-pipelines,Msbuild,Tfsbuild,Tfs 2015,Azure Pipelines,TFS2015上的MSBuild(非XAML生成)中是否有任何属性等可让我确定特定生成是手动启动还是通过CI触发器启动的 我试图避免使用两个构建定义,这两个定义的区别仅在于当前作为属性传入的真/假值,例如 /p:Manual=true 然后我在我的项目中使用它作为 $(Manual) 如果没有这一点,我似乎需要两个定义—一个是通过CI触发的,并在该属性中传递为False,另一个是传递为True的手动定义。如果我有办法找到它,构建是签入的结果,那么我可以不需要两个 2016年4月21日编辑 只

TFS2015上的MSBuild(XAML生成)中是否有任何属性等可让我确定特定生成是手动启动还是通过CI触发器启动的

我试图避免使用两个构建定义,这两个定义的区别仅在于当前作为属性传入的真/假值,例如

/p:Manual=true
然后我在我的项目中使用它作为

$(Manual)
如果没有这一点,我似乎需要两个定义—一个是通过CI触发的,并在该属性中传递为False,另一个是传递为True的手动定义。如果我有办法找到它,构建是签入的结果,那么我可以不需要两个

2016年4月21日编辑 只是为了澄清一下,我知道构建定义中没有属性,我正在实际的MSBuild进程中(当它运行时)寻找一些允许我确定这一点的内容


在这一点上,即使获得计划构建的用户的登录Id也可以——如果是触发的构建,我猜这将是运行TFS的服务帐户,否则它是人工的。

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

当您手动将构建排队时,必须更改变量值


自动化此操作的一种方法是在msbuild之前运行powershell,在该方法中,您可以使用rest api获取当前正在执行的生成的原因,如文档所示

将rest api调用的返回值传递给变量,并在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.
 ---------------------------------------------------------------------------
因此,在msbuild文件中,
Build.RequestedFor
成为
$(Build\u RequestedFor)


关于构建是CI、Gates、夜间还是批处理,还没有定论,但它确实区分了手动排队的构建和触发的构建,这似乎是您所追求的。

要扩展Dhruv的答案,以下是记录TFS 2015构建原因的相关Powershell代码:

#通过RESTAPI调用检索生成原因并设置为TFS'build.BuildReason'变量
$url=“$($env:SYSTEM\u TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM\u TEAMPROJECT/\u api/build/builds/$env:build\u BUILDNUMBER`?api版本=2.0”
$header=@{“Authorization”=“Bearer$env:SYSTEM_ACCESSTOKEN”}
$response=Invoke RestMethod$url-Headers$header
$reason=$response.reason
写入主机“##vso[task.setvariable=Build.BuildReason;]$reason”

在需要引用生成原因的任何步骤之前,在Powershell步骤中调用它。

这就是我现在得到的,只是一个属性。有趣。我得试一试。在接下来的几天里,我会让你知道这对我有什么好处。谢谢