Как получить значение переменной в 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)

Затем все, что необходимо, — связать группу переменных с конвейером выпуска, и переменная будет помещена в этот конвейер.

Другие вопросы по тегам