ADS 2019 - Как передавать переменные между заданиями сборки

Используя Azure DevOps Server 2019.1, я начинаю работать с несколькими заданиями, чтобы можно было разделить работу между несколькими агентами.

Сам поток работает нормально. У меня это так настроено

Начать работу - это в основном тестирует несколько переменных и обновляет номер сборки.

(Зависит от начала задания) RunTest Job - задание для запуска «мультиконфигурации», которое разделяет список категорий задач, разделенных запятыми.

(Зависит от задания RunTest) End Job - Триггерная задача сборки для новой сборки в цепочке.

Хотя задания зависят от другого задания, это, кажется, влияет только на время их запуска, они не получат доступа к информации, предоставленной заданием, которое выполнялось ранее.

В основном мне нужно значение переменной, которая была установлена ​​(buildNumber) в Begin Job. Мне нужен этот номер версии в RunTest и End Job. Как я могу получить эту информацию? Я читал статьи о том, что это невозможно, но пока не нашел подходящего решения. Есть ли у кого-нибудь достойный обходной путь?


person Nico    schedule 17.04.2020    source источник


Ответы (2)


Вы пробовали выходная переменная для нескольких заданий:

jobs:

# Set an output variable from job A
- job: A
  pool:
    vmImage: 'vs2017-win2016'
  steps:
  - powershell: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the value"
    name: setvarStep
  - script: echo $(setvarStep.myOutputVar)
    name: echovar

# Map the variable into job B
- job: B
  dependsOn: A
  pool:
    vmImage: 'ubuntu-16.04'
  variables:
    myVarFromJobA: $[ dependencies.A.outputs['setvarStep.myOutputVar'] ]  # map in the variable
                                                                          # remember, expressions require single quotes
  steps:
  - script: echo $(myVarFromJobA)
    name: echovar
person Krzysztof Madej    schedule 17.04.2020
comment
Я не сделал этого, если я переключился на документацию 2019 года, в ней говорится, что это Установить переменную вывода для нескольких заданий. Вы не можете передавать переменную из одного задания в другое задание конвейера сборки, если вы не используете YAML. - person Nico; 17.04.2020
comment
Вы уверены? Я перешел на Azure DevopsServer 2019, а также перезагрузил страницу для этих настроек, и они доступны. - person Krzysztof Madej; 17.04.2020
comment
Попробуйте переключиться на классический вид сборки - person Nico; 17.04.2020

Обновление2: самым простым решением должно быть использование YAML. Если вы настаиваете на классическом просмотре сборки. Вы можете попытаться добиться этого, сохранив значения в файле (json, xml, yaml, что у вас есть), вы можете прочитать файл в задании либо напрямую, либо повторно установить переменную.

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


Передача переменных между заданиями на одном этапе требует работы с выходными переменными.

Однако, согласно this, using outputs in a different job не поддерживается в классическом формате пользовательского интерфейса.

В качестве обходного пути в этом сценарии вы можете поделиться переменными через Переменные конвейера (разделяйте переменные между заданиями в одном конвейере).

1. Вы можете установить key переменную в переменных конвейера:

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

2. Добавьте одну встроенную задачу Powershell с приведенным ниже содержанием в свое первое задание:

$url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=5.0"

Write-Host "URL: $url"

$pipeline = Invoke-RestMethod -Uri $url -Headers @{

    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"

}

Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"



# Update an existing variable to its new value

$pipeline.variables.key.value = "value"



####****************** update the modified object **************************

$json = @($pipeline) | ConvertTo-Json -Depth 99



$updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}



write-host "==========================================================" 

Write-host "The value of Varialbe key is updated to" $updatedef.variables.key.value

write-host "=========================================================="

3. Запустите конвейер, и мы обнаружим, что значение переменной key успешно обновлено:

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

Таким образом, вы можете запустить сценарий ps в первом задании, чтобы обновить значение переменной key, тогда все следующие задания могут легко получить доступ к обновленной переменной.

Примечание.

  1. Для самого скрипта вам нужно только изменить строки $pipeline.variables.key.value = "value" (обязательно) и Write-host "The value of Varialbe key is updated to" $updatedef.variables.key.value (необязательно).

Если я хочу установить для переменной с именем MyTest значение MyValue, строки должны быть $pipeline.variables.MyTest.value = "MyValue" и Write-host "The value of Varialbe MyTest is updated to" $updatedef.variables.MyTest.value.

  1. Чтобы убедиться, что задача ps в одном задании имеет доступ к OAuth Token, мы должны Allow Scripts to Access OAuth Token. Щелкните название задания агента и установите флажок:

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

  1. Чтобы включить конвейер имеет разрешение на обновление переменной конвейера (редактировать конвейер сборки), перейдите в режим безопасности конвейера, чтобы установить Edit build pipeline разрешить для пользователя xxx(ProjectName) build service.

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

person PatrickLu-MSFT    schedule 20.04.2020
comment
Спасибо за подробное описание. Но я не думаю, что это делает то, что я хотел. Я все же попробовал. У меня есть сборка с двумя заданиями, начальное задание, которое запускает ваш скрипт, также создало именованные переменные конвейера. Затем добавили еще одно задание, зависящее от 1-го задания. Это запускает Write-Host Key: $ (Key), который оказался в Key: DefaultValue. КОГДА я открываю определение сейчас, ключ имеет значение Value. Я не хочу сохранять это значение в определении, я хочу передать его другому заданию, а не другим сборкам, которые будут запускаться после этого. - person Nico; 20.04.2020
comment
@ Нико Хорошо, поймите свою точку зрения. Вам нужно просто статическое значение. Вы можете попробовать использовать группу переменных. docs.microsoft. ru / en-us / azure / DevOps / pipelines / library / - person PatrickLu-MSFT; 21.04.2020
comment
Нет, мне нужна возможность сгенерировать значение в задании A и передать это задание B, которое начинается после задания A. Я ожидал, что обновление одной из стандартных переменных конвейера в сборке даст этот эффект, но задание B продолжает знать переменные времени очереди - person Nico; 21.04.2020
comment
@Nico Извините за недоразумение. Использование YAML должно быть самым простым решением. Если вы настаиваете на классическом просмотре сборки. Вы можете попытаться добиться этого, сохранив значения в файле (json, xml, yaml, что у вас есть), вы можете прочитать файл в задании либо напрямую, либо повторно установить переменную снова. Когда вы ставите в очередь следующую сборку, это не повлияет на файл в системе управления версиями, и значение по умолчанию не изменится. - person PatrickLu-MSFT; 22.04.2020
comment
Привет, Нико! Есть ли у вас какие-либо другие опасения по поводу этой проблемы? Просто проверяю, была ли предоставленная информация полезной. Вы смогли решить? - person PatrickLu-MSFT; 24.04.2020
comment
Я еще не обновился до YAML, теперь я пытаюсь решить проблему с публикацией артефактов сборки, которые вы можете позже загрузить в другом задании. - person Nico; 24.04.2020