Azure Конвейеры условных и постоянных переменных - PullRequest
1 голос
/ 18 февраля 2020

Я пытаюсь настроить конвейер Azure, который автоматически обновляет номера версий в зависимости от того, какая ветка создается. Учитывая ветвь master, ветвь develop и версию в виде {major.minor.patch.build} Я хочу добиться следующего:

Всякий раз, когда конвейер запускается master:

  • patch увеличивается на 1
  • build сбрасывается на 0

Всякий раз, когда конвейер запускается на develop:

  • build увеличивается на 1

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

  • Выполнить 1 на develop: 1.0.0.1
  • Выполнить 2 на develop: 1.0.0.2
  • Выполнить 3 на master: 1.0.1.0
  • Запуск 4 на master: 1.0.2.0
  • Запуск 5 на develop: 1.0.2.1
  • Запуск 6 на develop: 1.0.2.2
  • Запуск 7 на master: 1.0.3.0

Моей первой мыслью было использование счетчика для значений patch и build, но это не так. Кажется, это способ их условного увеличения или сброса счетчика. Моей следующей мыслью было использование нескольких задач сценариев, которые выполняются условно на основе ветви, таких как:

    #Update build
    - powershell: echo "##vso[task.setvariable variable=version.build;isOutput=true]$(version.build + 1)"
      condition: eq(variables['Build.SourceBranch'], 'refs/heads/develop')

    #Reset build number
    - powershell: echo "##vso[task.setvariable variable=version.build;isOutput=true]0"
      condition: eq(variables['Build.SourceBranch'], 'refs/heads/master')

    #Update patch
    - powershell: echo "##vso[task.setvariable variable=version.patch;isOutput=true]$(version.patch + 1)"
      condition: eq(variables['Build.SourceBranch'], 'refs/heads/master')

Однако этот подход не является постоянным при выполнении (не говоря уже о $(version.patch + 1), не работает Я не могу найти информацию о том, как на самом деле увеличить переменную таким образом). Моя последняя идея состояла в том, чтобы иметь файл версии в репозитории и использовать его, но я действительно не хочу, чтобы по этому маршруту пришлось go.

Есть ли способ достичь того, что я ищу используя конвейеры или я лаю не то дерево, пытаясь go рассказать об этом таким образом?

Edit Я должен был упомянуть в вопросе, что на данный момент у меня есть настройка конвейера, которая строит мое приложение, но ничего не делает с версионированием На данный момент я ищу способ динамического обновления нескольких постоянных переменных / значений (в частности, patch и build).

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

У меня есть обходной путь для достижения этого с успокоительным API.

Например, вы хотите добавить вышеуказанный тег версии в сборку. Сначала вы можете получить тег предыдущей сборки с помощью get tag api . Затем вы можете обновить версию с помощью сценариев и обновить ее с помощью обновленного тега. Вы можете обратиться к приведенным ниже сценариям в задаче powershell.

# first get previous build id

$url = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?definitions={pipeline Id}&`$top=2&api-version=5.1"

$result = Invoke-RestMethod -Uri $url -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method get

$builds = $result.value
$bid = $builds[1].id

# get the build tag with get build tag api

$urltag ="$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$bid/tags?api-version=5.1"

$tagResult = Invoke-RestMethod -Uri $urltag -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method get

# get the tag and update it

if($tagResult.value)
{
   $tagarr = [regex]::split($result.value, '\.')
   $patch = $tagarr[2]
   $build = $tagarr[3]
   $tag=""
   if("$(Build.SourceBranch)" -eq "refs/heads/master")
   {
      $patch = [int]$patch + 1
      # update the variables version.patch and version.build with below scripts, so that it can be referenced in the following tasks.
      #echo "##vso[task.setvariable variable=version.patch;isOutput=true]$patch"
      #echo "##vso[task.setvariable variable=version.build;isOutput=true]0"

     $tag = "$(version.major).$(version.minor).$patch.0"    
   }  
   if("$(Build.SourceBranch)" -eq "refs/heads/dev")
   {
      $build= [int]$build+ 1
      #echo "##vso[task.setvariable variable=version.patch;isOutput=true]$patch"
      #echo "##vso[task.setvariable variable=version.build;isOutput=true]$build"
      $tag = "$(version.major).$(version.minor).$patch.$build"  
   }

 #add $tag to current build.
  $urltagupdate = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$(Build.BuildId)/tags/$($tag)?api-version=5.1"

  Invoke-RestMethod -Uri $urltagupdate -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method put

}else 
{
  #if the build is run for the first time and the tag is not exist.
  #you can omit this part by manually creating a initial tag for the build.

  $tag = ""
  if("$(Build.SourceBranchName)" -eq "refs/heads/master")
  {
    $tag = "1.0.1.0"
  }
  if("$(Build.SourceBranchName)" -eq "refs/heads/dev") 
  {
    $tag="1.0.0.1"
  }

 #add $tag to current build.

  $urltagupdate = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds/$(Build.BuildId)/tags/$($tag)?api-version=5.1"

  Invoke-RestMethod -Uri $urltagupdate -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method put

}

Выше приведен пример для тегов сборки. Если вы хотите пометить ветку репо, вы можете использовать refs tag api .

Основная идея - получить предыдущий тег через api и обновить version.patch и version.build в соответствии с build.sourcebranch в задаче powershell.

0 голосов
/ 19 февраля 2020

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

Используя его, я смог частично заставить его работать с тем, что вам нужно.

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

variables:
  major: 1
  minor: 0
  # define b as a counter with the prefix as variable a, and seed as 100.
  #patch: $[counter(variables['major'], 1)]

  ${{ if eq( variables['Build.SourceBranchName'], 'master') }}:
    patch: $[counter(variables['major'], 1)]
    build: 0

  ${{ if eq( variables['Build.SourceBranchName'], 'develop') }}:
    build: $[counter(variables['major'], 1)]
    #patch: ?


name: $(major).$(minor).$(patch).$(build)

steps:
    - bash: echo $(major).$(minor).$(patch).$(build)

Но, насколько я понимаю, нет хорошего способа получить текущую переменную счетчика $ (patch) при запуске сборки. Примечание: мне было бы интересно узнать, как получить при пользовательских значениях счетчика . Скорее всего, вы могли бы использовать API и go получить Buildnumber с последнего запуска, извлечь номер патча и использовать его повторно, но это приводит к тому, что вы задали этот вопрос.

Есть ли способ достичь что я ищу с помощью конвейеров или я лаю не на том дереве, пытаясь go об этом таким образом?

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

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

- task: GitVersion@5
  inputs:
    runtime: 'core'
    configFilePath: 'GitVersion.yml'

Лучше предоставить GitVersion.yml, который является схемой или набором инструкций для того, как сделать управление версиями.

Существует шоколадная упаковка , которую вы можете установить, чтобы поэкспериментировать с ней. Если вы запустите GitVersion init в root вашего репо, он проведет вас через некоторые варианты управления версиями и создаст для вас GitVersion.yml.

mode: Mainline
branches:
  master:
    tag: ''
    regex: master
    increment: minor
  develop:
    tag: ''
    regex: develop
    increment: patch
ignore:
  sha: []
merge-message-formats: {}

В качестве примера Приведенный выше режим основной линии дает мне:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...