номер версии релиза с автоинкрементом на проект - PullRequest
1 голос
/ 18 апреля 2019

Помогите мне получить автоматически увеличенный номер редакции для задачи сборки конвейера в Azure.

Скажем, есть major.minor.patch.revision номер. major.minor.patch устанавливается в файле версии, который хранится в исходном элементе управления. Это позволяет определять версию программного обеспечения сопровождающим исходного кода и не изменять определение задачи сборки (или ее параметр). Я бы хотел избежать обновления значения параметра версии до того, как будет построена новая версия.

Однако я бы хотел, чтобы ревизия увеличивалась автоматически каждый раз при сборке версии. Чтобы можно было major.minor.patch то же самое.

Файл версии представляет собой простой текстовый файл с содержимым major.minor.patch . У меня есть задача сценария powershell в конвейере сборки. Он читает файл версии и сохраняет как переменную сборки, как показано ниже:

$fv = Get-Content versionFile

       $buildNumber = $env:BUILD_BUILDNUMBER
       if ($buildNumber -eq $null)
       {
           $buildIncrementalNumber = 0
       }
       else
       {
           $splitted = $buildNumber.Split('.')
           $buildIncrementalNumber = $splitted[$splitted.Length - 1]
       }

   Write-Host ("##vso[task.setvariable variable=versionFromFile]$fv.$buildIncrementalNumber")
   Write-Host ("from file $fv incremental .$buildIncrementalNumber")
   Write-Host ("##vso[task.setvariable variable=build.updatebuildnumber]$fv.$buildIncrementalNumber")

Как вы можете видеть, он читает из versionFile и принимает .N часть из переменной BUILDNUMBER, чтобы получить значение ревизии. И он сохраняет значение результата в переменной versionFromFile.

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

Я пытался использовать формат номера сборки , однако проблема в том, что $(Rev:.r) сбрасывается при изменении основной части Build number format. Это означает, что для числового формата $(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r) Rev запускается с нуля каждый день.

$(BuildId) - уникальное значение, которое не может быть очищено (начинается с нуля)

Я пытался использовать переменную versionFromFile в строке формата номера сборки, но кажется, что номер сборки рассчитывается при запуске конвейера, и нет никакого способа использовать значение переменной (скрипта) в номере сборки.

Я думаю создать еще один файл, например revisionFile, и сохранить значение ревизии в этом файле. Однако тогда мне нужно будет обновить revisionFile при каждой сборке и фиксации.

Есть ли какая-либо другая опция, позволяющая получить автоматически увеличенный счетчик для проекта? Я встречал пример, как обновить переменную конвейера сборки из скрипта powershell, но он связан с конвейером, поэтому наличие двух конвейеров сборки даст одинаковое значение (возможно) для другой версии.

PS Существует возможность обновить номер сборки путем вывода «## vso [build.updatebuildnumber] 1.2.3.4» в журнал во время сборки , но значение Rev вычисляется до того, как какая-либо задача шанс обновить номер сборки.

Существуют проекты Git и Tfs, поэтому было бы неплохо иметь одно и то же решение для обоих типов управления исходным кодом.

1 Ответ

1 голос
/ 19 апреля 2019

кажется, что ответ уже есть: https://developercommunity.visualstudio.com/content/problem/240373/vsts-build-revision-does-not-increment-after-calli.html

Создайте новую переменную: patch: $[counter('versioncounter',100)] Тогда вместо $(Rev:rrr) вы будете использовать $(patch).

Я определил две тестовые переменные:

test1: $[counter('versioncounter',1)]

test2: $[counter('versioncounter2',100)]

в конвейере сборки

и вот журналы:

сборка 1 журнал агента 1

[раздел] Запуск: подготовка задания Переменные_1:
test1: синтаксический анализ выражения: Evaluationating: counter ('versioncounter', 1) Расширен: 1 Результат: '1'
test2: Анализ выражения: Оценка: counter ('versioncounter2', 100) Расширен: 100 Результат: '100'

Те же значения дляtest1 и test2 создаются для другого агента в этом конвейере сборки

Затем я выполнил конвейер сборки еще раз, и вот журнал

build 2 agent1 log

[раздел] Запуск: подготовка задания Job_1 Переменные:
test1: выражение синтаксического анализа: оценка: counter ('versioncounter', 1) расширенный: 2 результат: '2'
test2: выражение синтаксического анализа: оценка: counter ('versioncounter2', 100) Расширен: 101 Результат: '101'

Я предполагаю, что значение счетчика iсгенерировано для ключа из первого аргумента

[del] Это именно то, что я просил [/ del]

upd1 Я пытался запустить этов реальной жизни

И проблема в том, что $[counter('versioncounter',1)] работает только для инициализации переменной сборки.Я пытался использовать его в сценарии PS, как показано ниже

- powershell: |
   $fv = Get-Content versionFile
   $buildIncrementalNumber = $[counter($fv,1)]

, но не получилось:

$[counter : The term '$[counter' is not recognized as the name of a cmdlet, 
function, script file, or operable program. Check the spelling of the name, or 
if a path was included, verify that the path is correct and try again.
At E:\buildagent\networkProxy\_work\_temp\d22e789f-bed0-465a-b447-60f634d73c38.
ps1:3 char:27
+ $buildIncrementalNumber = $[counter($fv,1)]
+                           ~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: ($[counter:String) [], ParentCon 
   tainsErrorRecordException
    + FullyQualifiedErrorId : CommandNotFoundException

Возможно ли получить доступ к магии $counter из сценария оболочки build build?

upd2 Для чтения версии из файла и получения инкрементного числа с помощью $ counter magic необходимо использовать два задания.Существует ответ moswald в выпуске # 1802 для использования двух заданий.

Итак, я реализовал это, как показано ниже:

jobs:
  - job: versionJob #reads version number from the source file
    steps:
      - powershell: |
          $fv = Get-Content versionFile
          Write-Host ("##vso[task.setvariable variable=versionFromFile;isOutput=true]$fv")
        displayName: 'version from file' 
        name: setVersionStep  


  - job: buildJob # consumes version number, calculates incremental number and set version using assemblyinfo.cs
    dependsOn: versionJob
    variables:
      versionFromFile: $[ dependencies.versionJob.outputs['setVersionStep.versionFromFile'] ] # please note that spaces required between $[ and dependencies
      buildIncrementalNumber: $[ counter(dependencies.versionJob.outputs['setVersionStep.versionFromFile'],1) ] #can't use $versionFromFile here


    steps:
      - powershell: |
          Write-Host ($env:versionFromFile)
          Write-Host ($env:versionFromFile + '.' + $env:buildIncrementalNumber)
        displayName: 'version from file output' 

здесь yaml документация по переменным

PS: нет необходимости объявлять $variableFromFile перед разделом вакансий

...