Как я могу вычислить «ревизию сборки», если я не знаю номер сборки до середины задания? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть конвейер сборки, единственная цель которого - взять двоичные файлы, сгенерированные устаревшим процессом сборки, и упаковать их в пакет NuGet. Номер версии пакета NuGet должен соответствовать номеру версии двоичных файлов, и мне бы очень хотелось, чтобы номер серии («имя» YAML) также совпадал, но мне также нужно добавить номер редакции до концакаждая сборка из-за правил уникальности для каналов NuGet.

Я знаю, как получить номер редакции, если я использую номер версии, который известен заранее:

  versionNumber: 4.0.0
  revision: $[counter(variables['versionNumber'], 0)]
  buildVersion: $[ format('{0}.{1}', variables.versionNumber, variables.revision) ]

  name: $(BuildDefinitionName)_$(versionNumber)-rc$(revision)

, но в этомcase я не знаю versionNumber до времени выполнения, потому что я извлекаю его из информации о версии в другой DLL. Итак, я настроил это, чтобы сделать следующее:

  - powershell: |
      $version =  gci -Path $env:BUILD_SOURCESDIRECTORY -Recurse -Filter my.dll | % { $_.versioninfo.ProductVersion }
      Write-Host "##vso[task.setvariable variable=version]$version"

  - powershell: ${{ format('Write-Host "##vso[task.setvariable variable=revision]{0}"', counter(variables['version'], 0) }}

  - powershell: |
      $version = "${env:VERSION}-rc${env:REVISION}"
      Write-Host "##vso[build.updatebuildnumber]${env:BUILDDEFINITIONNAME}_${version}"

Это не работает, я полагаю, потому что вы не можете использовать counter в этом контексте, вы можете использовать его только при определениипеременная. Но если я попытаюсь сделать это ранее в разделе variables, значение переменной version не будет установлено правильно, поэтому я получу неправильный счетчик. Есть ли способ получить этот номер редакции динамически после Я выполнил первые несколько задач, чтобы получить номер версии?

1 Ответ

0 голосов
/ 23 октября 2019

Как вычислить «ревизию сборки», если я не знаю номер сборки до середины задания?

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

Так же, как вы тестируете, независимо от того, поставили ли мы номер версии задачикоторый получает двоичный файл перед или за секцией variable, мы не могли бы получить этот номер ревизии динамически сгенерированным правильно. На данный момент это должно быть ограничение для YAML.

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

  • Создайте классический конвейер редактора и установите versionNumber со значением по умолчанию на вкладке переменных.
  • Добавьте сценарии powershell к номеру версии двоичных файлов.
  • Вызов API REST ( Definitions - Update ) для обновления значения по умолчанию versionNumber на вкладке переменных с новой версией, полученной из предыдущей задачи powershell.

Подробное описание шагов для последней точки:

  1. Перейти к Agent Phase и select Allow Scripts to Access OAuth Token. См. Использование токена OAuth для доступа к REST API.

  2. Предоставить сервису сборки коллекций проектов (xxx) учетную запись разрешения на редактирование конвейера сборки. (Выберите сборку pipeline -> ... -> Security -> Edit release definition set to Allow)

  3. Добавить задачу PowerShell в конвейер сборки

Скрипты poswershell выглядят следующим образом:

$url = "https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.0"

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 TestVar to its new value 2.0.0
$pipeline.variables.versionNumber.value = "<The value you get from previous powershell task>"

####****************** 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 'versionNumber' is updated to" $updatedef.variables.versionNumber.value

Затем мы можем увидеть versionNumber, обновленное до 2.0.0:

enter image description here

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

...