У меня есть 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 :.