Обновление Azure DevOps Release Конвейерная переменная во время выпуска - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть classi c Release Pipeline, в котором есть несколько пользовательских переменных, которые периодически используются на протяжении всего выпуска.

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

Теперь, когда идет релиз, если я переключусь на вкладку Переменные, я вижу, что переменная никогда не обновлялась. Это все еще установлено в значении от предыдущего выпуска. Для меня это серьезная проблема, потому что примерно на половине пути к выпуску у меня есть шаг «Копировать файлы», где он копирует файлы в путь к папке, созданной из этих переменных. Поскольку переменные взяты из предыдущего выпуска, они помещаются в неверно названный путь к папке.

После завершения и успешного завершения конвейера деблокирования переменные конвейера корректно обновляются на вкладке Переменные.

Есть ли способ обновить эти переменные во время выпуска, а не обновлять их после завершения выпуска? Я бы предпочел обновить их должным образом в моих сценариях PowerShell или в качестве параметра в конвейере.

Вот как выглядят мои сценарии:

$url = "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)$env:SYSTEM_TEAMPROJECTID/_apis/Release/definitions/$($env:RELEASE_DEFINITIONID)?api-version=5.0-preview.3"

$pipeline = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"

$buildNumber = $env:BUILD_BUILDNUMBER
$pipeline.variables.ReleaseVersion.value = $buildNumber

####****************** 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 ReleaseVersion updated to " $updatedef.variables.ReleaseVersion.value
write-host "================================="

Моя переменная (ReleaseVersion в приведенном выше сценарии) установлена ​​на вкладке Переменные, ее область действия - «Выпуск» и «Настраиваемый» во время выпуска »проверяется. Я также пытался использовать Write-Host '##vso[task.setvariable variable=ReleaseVersion]$(Build.BuildNumber)' для установки моей переменной, но я получаю тот же результат.

ОБНОВЛЕНИЕ ДОБАВЛЕНИЕ НОВОГО СКРИПТА И ОПИСАНИЯ ЛОГА

Так что я просто протолкнул новый код через свой конвейер. Сборка была пронумерована v2.1.0.16 (что правильно). У меня есть номер сборки, установленный на имя ветви, плюс переменная (:.rev) в конце.

Первый скрипт в конвейере устанавливает настраиваемую переменную конвейера с именем ReleaseVersion. Он установлен на номер сборки. Это скрипт:

 $url = "https://vsrm.dev.azure.com/{organization}/$env:SYSTEM_TEAMPROJECTID/_apis/Release/definitions/$($env:RELEASE_DEFINITIONID)?api-version=5.0-preview.3"

$pipeline = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"

$buildNumber = $env:BUILD_BUILDNUMBER
$pipeline.variables.ReleaseVersion.value = $buildNumber

####****************** 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 ReleaseVersion updated to " $updatedef.variables.ReleaseVersion.value
write-host "================================="

и мой вывод:

2020-05-11T03:02:21.5631557Z     "id":  #,
2020-05-11T03:02:21.5632209Z     "name":  "#",
2020-05-11T03:02:21.5632816Z     "path":  "#",
2020-05-11T03:02:21.5633410Z     "projectReference":  null,
2020-05-11T03:02:21.5634223Z     "url":  "https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/definitions/{definitionId}",
2020-05-11T03:02:21.5635058Z     "_links":  {
2020-05-11T03:02:21.5635643Z                    "self":  {
2020-05-11T03:02:21.5636500Z                                 "href":  "https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/definitions/{definitionId}"
2020-05-11T03:02:21.5637445Z                             },
2020-05-11T03:02:21.5641618Z                    "web":  {
2020-05-11T03:02:21.5643197Z                                "href":  "https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/definitions/{definitionId}"
2020-05-11T03:02:21.5644085Z                            }
2020-05-11T03:02:21.5647518Z                }
2020-05-11T03:02:21.5648322Z }
2020-05-11T03:02:22.4291104Z =================================
2020-05-11T03:02:22.4456531Z The value of ReleaseVersion updated to  v2.1.0.15
2020-05-11T03:02:22.4483349Z =================================
2020-05-11T03:02:23.0643676Z ##[section]Finishing: Update Release Version

Он говорит, что значение было обновлено до v2.1.0.15, что на одну ревизию позади текущей сборки. Затем у меня есть скрипт для создания пути к папке на основе вышеуказанной переменной. Он проверяет папку с таким именем (например, v2.1.0.15) и прикрепляет -1, если он уже был найден, и -2, если -1 уже найден, и так далее. Это имя папки задается для пользовательской переменной конвейера с именем RootDirectory. Это скрипт:

$url = "https://vsrm.dev.azure.com/{organization}/$env:SYSTEM_TEAMPROJECTID/_apis/Release/definitions/$($env:RELEASE_DEFINITIONID)?api-version=5.0-preview.3"

$pipeline = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
write-host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"

$rootDirectory = $pipeline.variables.BuildDirectory.value + "\" + $pipeline.variables.ReleaseVersion.value

if (test-path $rootDirectory) {
    $newDirectory=$rootDirectory
    $index=0
    while (test-path $newDirectory) {
        $index += 1
        $newDirectory=$rootDirectory + "-" + $index
    } 
}

$pipeline.variables.RootDirectory.value = $newDirectory

####****************** 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 Root Directory updated to " $updatedef.variables.RootDirectory.value
write-host "================================="

Переменная BuildDirectory является жестко закодированной переменной, которая никогда не изменяется. И это вывод:

2020-05-11T15:32:45.7255688Z     "id":  #,
2020-05-11T15:32:45.7255852Z     "name":  "#",
2020-05-11T15:32:45.7256001Z     "path":  "#",
2020-05-11T15:32:45.7256166Z     "projectReference":  null,
2020-05-11T15:32:45.7256379Z     "url":  "https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/definitions/{definitionId}",
2020-05-11T15:32:45.7256556Z     "_links":  {
2020-05-11T15:32:45.7256698Z                    "self":  {
2020-05-11T15:32:45.7256903Z                                 "href":  "https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/definitions/{definitionId}"
2020-05-11T15:32:45.7257174Z                             },
2020-05-11T15:32:45.7257331Z                    "web":  {
2020-05-11T15:32:45.7257537Z                                "href":  "https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/definitions/{definitionId}"
2020-05-11T15:32:45.7257721Z                            }
2020-05-11T15:32:45.7257862Z                }
2020-05-11T15:32:45.7258016Z }
2020-05-11T15:32:46.6474274Z =================================
2020-05-11T15:32:46.6481861Z The value of Root Directory updated to  
2020-05-11T15:32:46.6491120Z =================================
2020-05-11T15:32:46.7209281Z ##[section]Finishing: Create Root Directory

Обратите внимание, что вывод этого скрипта пуст, он не показывает, для чего переменная была обновлена.

Несколько шагов спустя в моем конвейере, где я на самом деле использую эти переменные. Он находится в конвейерной задаче «Копирование файлов». Целевая папка имеет значение $(RootDirectory)/Debug, но поскольку переменная RootDirectory не обновляется, она просто копирует файлы на диск root c :.

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Обновление Azure Конвейерная переменная выпуска DevOps во время выпуска

Во-первых, причина, по которой команда ведения журнала не работает для вас, заключается в том, что:

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

Итак, мы могли бы использовать переменную set в следующей задаче, но если вы хотите обновить переменную на вкладке Переменные , вы можете использовать REST API ( Definitions - Update ) для обновления значение переменной определения выпуска из конвейера выпуска:

PUT https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/definitions/{definitionId}?api-version=5.0

Затем я проверил ваши сценарии, он близок к правильному ответу. Причина, по которой он не работает для вас, заключается в том, что вы используете переменную $($env:SYSTEM_TEAMFOUNDATIONSERVERURI) в вашем url.

Значение по умолчанию для этой переменной - https://dev.azure.com/YourOrganization/. Однако используемым нами API является то, что https://vsrm.dev.azure.com/{organization}, в URL-адресе отсутствует vsrm.

Вы можете проверить мою предыдущую ветку для получения дополнительной информации.

Надеюсь, это поможет.

0 голосов
/ 01 мая 2020

Когда я использовал код выше с REST API, ReleaseVersion остался прежним. Однако я использовал команду ведения журнала Write-Host '##vso[task.setvariable variable=ReleaseVersion]$(Build.BuildNumber)', и ReleaseVersion был обновлен, но на следующем шаге было доступно новое значение. Таким образом, новое значение должно быть доступно в Copy Files, поскольку это следующий шаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...