ADS 2019 - Как передавать переменные между заданиями сборки - PullRequest
0 голосов
/ 17 апреля 2020

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

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

Begin Job - это в основном тестирует несколько переменных и обновляет buildnumber

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Update2: Использование YAML должно быть самым простым решением. Если вы настаиваете на представлении Classi c. Вы можете попытаться выполнить sh, сохранив значения в файле (json, xml, yaml, что у вас есть), вы можете прочитать файл в задании, либо напрямую использовать, либо заново установить переменную ,

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


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

Однако согласно это , using outputs in a different job равно не поддерживается в Classi c UI Format .

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

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

enter image description here

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

$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 переменная успешно обновлена:

enter image description here

Таким образом, вы можете запустить скрипт 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.

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

enter image description here

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

enter image description here

0 голосов
/ 17 апреля 2020

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

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
...