Как получить значение переменной в TFS/AzureDevOps от сборки до выпуска конвейера?
Я определил переменную в своем определении сборки TFS/AzureDevops (скажем, это time
) и присвойте значение с помощью задачи PowerShell в моем определении сборки.
Подобно,
Тип: встроенный скрипт.
Встроенный скрипт:
$date=$(Get-Date -Format g);
Write-Host "##vso[task.setvariable variable=time]$date"
Вы можете сослаться на этот похожий пример
Теперь я хочу получить это значение в моем конвейере определения выпуска. Я настроил это определение сборки как непрерывное развертывание в своем определении выпуска.
Мой вопрос
Как я могу получить значение time
в моем определении выпуска, используя другую переменную? Это возможно?
3 ответа
Официальный способ передачи переменных из Build в Release не существует. Единственный способ сделать это - сохранить значения в файле (json, xml, yaml, что у вас есть) и прикрепить его как артефакт сборки. Таким образом, вы можете прочитать файл в выпуске и снова установить переменную.
Мартин Хиншелвуд, похоже, достаточно расстроился из-за этой проблемы и превратил эту функциональность в расширение для Azure DevOps Pipelines.
Задачи включены
- Задача сохранения переменных - во время сборки вы можете сохранить переменные в файле json, хранящемся вместе с другими вашими ресурсами сборки
- Задача загрузки переменных - во время выпуска вы можете загрузить сохраненные переменные и получить к ним доступ.
Я нашел другое решение, которое работает даже без текстовых файлов, просто используя Azure REST API для получения параметров сборки.
В моем конвейере выпуска я сначала выполняю эти задачи Powershell, чтобы извлечь любые параметры конвейера сборки:
function Get-ObjectMember {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True)]
[PSCustomObject]$obj
)
$obj | Get-Member -MemberType NoteProperty | ForEach-Object {
$key = $_.Name
[PSCustomObject]@{Key = $key; Value = $obj."$key"}
}
}
$url = "https://dev.azure.com/$(account)/$(project)/_apis/build/builds/$(Build.BuildId)?api-version=6.0"
$build = Invoke-RestMethod -Uri $url -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
$params = $build.templateParameters
if ($params) {
$params | Get-ObjectMember | foreach {
Write-Host $_.Key : $_.Value
echo "##vso[task.setvariable variable=$($_.Key);]$($_.Value)"
}
}
Мой конвейер сборки содержал параметр:RELEASE_VERSION
и после того, как я выполнил приведенный выше код, я могу использовать$(RELEASE_VERSION)
в других моих задачах выпуска.
Как насчет использования переменной в группе переменных?
Мне удалось установить значение переменной в группе переменных для переменной, поступающей из конвейера сборки, а затем прочитать эту переменную в конвейере выпуска.
Для этого необходимо:
- Чтобы предварительно создать группу переменных и переменную (ее имя определяется
$(variableName)
. Предположим, что его значение будет храниться в$(variableValue)
). - Чтобы найти идентификатор группы переменных (хранящийся в
$(variableGroupId)
), что можно сделать, перейдя в Azure DevOps к этой группе переменных. Идентификатор группы будет тогда в URL. - Токен личного доступа (PAT) с доступом для чтения и записи к групповым переменным (называемым
$(personalAccessToken)
)
конвейер непрерывной интеграции
- powershell: |
az pipelines variable-group variable update --group-id $(variableGroupId) --name $(variableName) --value $(variableValue)
displayName: 'Store the variable in a group variable'
env:
AZURE_DEVOPS_EXT_PAT: $(personalAccessToken)
Затем все, что необходимо, — связать группу переменных с конвейером выпуска, и переменная будет помещена в этот конвейер.