Определите, как сборка TFS 2015 была инициирована изнутри Msbuild.

Существуют ли какие-либо свойства и т. д. в MSBuild на TFS2015 (не сборки XAML), которые позволят мне установить, была ли конкретная сборка инициирована вручную или с помощью триггера CI?

Я пытаюсь избежать двух определений сборки, которые отличаются только значением true/false, которое в настоящее время передается как свойство, например. с участием

/p:Manual=true

который я затем использую в своем проекте как

$(Manual)

Без этого мне кажется, что мне нужно два определения: одно, которое запускается через CI и проходит как False в этом свойстве, другое вручную, которое передает True. Если бы у меня был способ узнать, что сборка была результатом проверки, я мог бы обойтись двумя.

Редактировать 21.04.16

Просто чтобы уточнить, я знаю, что в определении сборки нет свойства, я ищу что-то ВНУТРИ фактического процесса MSBuild (по мере его выполнения), что позволило бы мне убедиться в этом.

На данный момент даже получение идентификатора входа пользователя, запланировавшего сборку, подойдет — если это триггерная сборка, я предполагаю, что это будет учетная запись службы, на которой запущена TFS, в противном случае это человек.


person Rachel Ambler    schedule 20.04.2016    source источник


Ответы (4)


Чтобы расширить ответ Друва, вот соответствующий код Powershell для записи причины сборки для TFS 2015:

# 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 перед любыми шагами, которые должны ссылаться на причину сборки.

person S. Faucher    schedule 10.02.2017

Способ автоматизировать это — запустить powershell перед msbuild, в котором вы можете использовать остальные API, чтобы узнать причину текущей выполняемой сборки, как задокументировано здесь.

Передайте возвращаемое значение остаточного вызова API переменной и получите доступ к переменной в msbuild.

Может быть много других способов автоматизировать это. Это способ.

person Dhruv Patel    schedule 23.04.2016

Существует несколько переменных среды, которые устанавливаются агентом сборки при запуске сборки. Вы можете использовать их, чтобы выяснить, была ли сборка запрошена пользователем или идентификатором системы и для кого была запрошена сборка. Из документов:

 | 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_REQUESTEDFOR) внутри вашего msbuild. файлы.

Неизвестно, была ли сборка CI, Gates, Nightly или Batched, но она отличает сборки, поставленные в очередь вручную, от триггерных сборок, что, по-видимому, вам и нужно.

person jessehouwing    schedule 23.04.2016
comment
Интересный. Я должен дать это попробовать. Я дам вам знать в ближайшие пару дней, что это дает для меня. Спасибо! - person Rachel Ambler; 27.04.2016

Вы можете добавить в свою сборку vNext переменную сборки (например, с именем IsManual) со значением по умолчанию, установленным на False, поэтому каждый раз, когда сборка запускается CI, она будет принимать значение по умолчанию.

Когда вы вручную ставите сборку в очередь, вам придется изменить значение переменной.

введите здесь описание изображения

введите здесь описание изображения

person ds19    schedule 21.04.2016
comment
Это своего рода то, что я получил прямо сейчас, просто как собственность. - person Rachel Ambler; 21.04.2016