В конвейере выпуска Azure DevOps как развернуть на нескольких виртуальных машинах группу развертывания с разными целевыми папками

Я начал с настройки конвейера выпуска в Azure DevOps для развертывания службы Windows в группе развертывания, в которой была только одна виртуальная машина с настроенным агентом. У меня есть переменная, установленная в конвейере для папки развертывания.

Теперь я пытаюсь расширить это, чтобы развернуть до 2 серверов. Я добавил второй сервер в группу развертывания, и регистрация прошла успешно. На этом сервере развертывание необходимо выполнить на другом диске.

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

Я пробовал гуглить и копаться в пользовательском интерфейсе, но пока ничего не нашел. Мне интересно, подходят ли вообще переменные?


person Twisted    schedule 24.08.2020    source источник
comment
В группе развертывания вы можете устанавливать только теги, что на самом деле бесполезно. Но на вкладке возможностей много информации. Может быть, вы можете установить переменную среды на целевой машине, которую можно как-то прочитать?   -  person Martin A    schedule 25.08.2020


Ответы (3)


Я собираюсь ответить на свой вопрос, поскольку решение на самом деле представляет собой комбинацию ответов, любезно предоставленных @Martin A, @Tomasz Kaniewski и @Vito Liu-MSFT с изрядным количеством проб и ошибок. Надеюсь, это поможет другим.

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

Вы должны перезапустить службу Windows агента Azure Pipelines на каждой виртуальной машине, прежде чем будут приняты изменения в переменных среды !!

Я обнаружил, что поддержка переменных среды довольно несовместима между различными задачами - они, похоже, хорошо работают в задачах сценария, но не так хорошо в других, таких как CopyFiles.

Самый надежный подход заключался в том, чтобы скопировать переменную среды в переменную конвейера (deployment.root), которую я настроил на вкладке переменных следующим образом

Снимок экрана переменных

А затем установите переменную из скрипта, как предложено Томасом и Вито.

steps:
- script: |
   @echo ##vso[task.setvariable variable=deployment.root]%AutomationDeploymentRoot%
   
  displayName: 'Set Deployment Folder'

когда это запускается, c: \ temp \ deploy заменяется правильной папкой для целевой машины, и все становится зеленым!

person Twisted    schedule 25.08.2020
comment
Привет, Twisted, Вы могли бы принять свой ответ. В этом случае другие могут напрямую найти полезное решение. Спасибо. - person Vito Liu; 26.08.2020

Вы можете установить переменную из скрипта: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cpowershell#set-переменныевскриптах

Напишите сценарий, который сможет определить, на какой машине он запущен, и присвоить переменной правильное значение.

person Tomasz Kaniewski    schedule 24.08.2020

Согласен с Томашем.

Мы можем установить переменную с помощью сценария питания Write-Host ##vso[task.setvariable variable={variable name}]{variable value}, затем мы можем вызвать переменную в другой задаче.

Дополнительные сведения см. В этом ответе.

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

а. Откройте конвейер выпуска и добавьте новую переменную test и предоставьте учетной записи test Build Service (xxx) разрешение «Редактировать конвейер выпуска». (откройте конвейер выпуска - ›... -› Безопасность - ›Изменить конвейер выпуска, установленный на Разрешить).

б. Откройте конвейер, включите функцию Разрешить сценариям доступ к токену OAuth (щелкните Имя задания агента = ›Дополнительные параметры), добавьте задачу PowerShell и введите сценарий ниже, чтобы обновить значение теста переменной выпуска.

$url = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/definitions/{release definition ID}?api-version=6.0-preview.4"
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 named test to its new value 
$pipeline.variables.test.value= {new variable 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 'test' is updated to" $updatedef.variables.test.value
write-host "=========================================================="
person Vito Liu    schedule 25.08.2020