确定如何从Msbuild内部启动TFS 2015生成
TFS2015上的MSBuild(非XAML生成)中是否有任何属性等可让我确定特定生成是手动启动还是通过CI触发器启动的 我试图避免使用两个构建定义,这两个定义的区别仅在于当前作为属性传入的真/假值,例如确定如何从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日编辑 只
/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步骤中调用它。这就是我现在得到的,只是一个属性。有趣。我得试一试。在接下来的几天里,我会让你知道这对我有什么好处。谢谢