я хочу создать конвейер, который будет показывать сцену prod
только для tags
. Я отмечаю теги как v1.0
, v1.1
и т. д. Я разработал yaml следующим образом:
resources:
repositories:
- repository: templates
type: git
name: templates
ref: refs/tags/v0.1
trigger:
- main
pr:
- main
stages:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
- ${{ if startsWith( variables['Build.SourceBranch'], 'refs/tags/' ) }}:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
Но, к сожалению, последний этап всегда отсутствует в моем конвейере.
Как построить конвейер yaml в Azure Devops, который будет отображать последний этап только для тегов, начинающихся с буквы v
? Или есть выкройка vX.Y.Z
?
@wenbo не пытался быть честным. Ищу решение своей проблемы
Таким образом, в собственном репозитории конвейера также есть такие теги, как v1.0
; и вы не хотите запускать последний этап в infra-terraform-deploy.yml@templates
, используя код, отличный от таких тегов, верно?
@AlvinZhao-MSFT, да, действительно. В моем основном репозитории у меня есть конвейер, и я хочу запускать последний этап только тогда, когда конвейер запускается из тега с именем v1.0
, поэтому я действительно хочу иметь шаблон, по которому последний этап будет запускаться только для скороговорки vX.Z.Y
, когда я могу установить минорные и мажорные версии (и патчи). Является ли это возможным? Имя ветки может начинаться с release
, но я хочу использовать теги в этом репо вместо ветвей релизов.
Спасибо за подтверждение. Позвольте мне пройти тест и вернуться к вам с тем, что я смогу найти.
В соответствии с дальнейшим обсуждением требования автоматического извлечения version
из имени тега, когда конвейер использует источник при условии startsWith( variables['Build.SourceBranch'], 'refs/tags/v' )
, вы можете протестировать обновленный конвейер YAML ниже.
Сначала он разделит version
вместе с majorVersion
minorVersion
и patchVersion
от Build.SourceBranch
; а затем оценит, является ли patchVersion
пустой строкой, чтобы решить, удалять этап Prod
или нет.
Тем не менее, нам нужно быть осторожными с шаблоном именования при создании новых тегов, так как могут быть случаи, когда оценка будет пройдена, и мы настолько ограничены стандартными выражениями , которые можно использовать только во время компиляции.
resources:
repositories:
- repository: templates
type: git
name: templates
ref: refs/tags/v0.1
trigger:
- main
pr:
- main
variables:
- ${{ if startsWith( variables['Build.SourceBranch'], 'refs/tags/v' ) }}:
- name: arraySplitedSourceBranch
value: ${{ convertToJson(split(variables['Build.SourceBranch'], 'v')) }}
# Extract version from Build.SourceBranch
- name: version
value: ${{ split(variables['Build.SourceBranch'], 'v')[1] }}
- name: majorVersion
value: ${{ split(variables['version'], '.')[0]}}
- name: minorVersion
value: ${{ split(variables['version'], '.')[1]}}
- name: patchVersion
value: ${{ split(variables['version'], '.')[2]}}
stages:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
stageName: Dev
- template: templates/infra-terraform-deploy.yml@templates
parameters:
stageName: QA
- ${{ if and( startsWith( variables['Build.SourceBranch'], 'refs/tags/v' ), ne(variables['patchVersion'], '') ) }}:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
stageName: Prod
Основываясь на вашем описании, вы можете попробовать изменить файл определения YAML конвейера в каждом теге, используя пример содержимого ниже.
resources:
repositories:
- repository: templates
type: git
name: templates
ref: refs/tags/v0.1
trigger:
- main
pr:
- main
parameters:
- name: majorVersion
type: number
default: 1
- name: minorVersion
type: number
default: 0
- name: patchVersion
type: number
default: 0
variables:
- name: tagName
value: ${{ format('refs/tags/v{0}.{1}.{2}', parameters.majorVersion, parameters.minorVersion, parameters.patchVersion) }}
stages:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
stageName: Dev
- template: templates/infra-terraform-deploy.yml@templates
parameters:
stageName: QA
- ${{ if eq( variables['Build.SourceBranch'], variables['tagName'] ) }}:
- template: templates/infra-terraform-deploy.yml@templates
parameters:
stageName: Prod
Причина, по которой нам необходимо убедиться, что файлы определений YAML в каждом теге содержат измененное содержимое, заключается в том, что при выборе тега/ветви для запуска конвейера он также переключается на использование этого .yml
определения в выбранном теге/ветви для запуска конвейера. трубопровод. Например, если файл конвейера .yml
в теге v1.0
остается неизменным или, скажем, содержит ваше выражение ${{ if startsWith( variables['Build.SourceBranch'], 'refs/tags/' ) }}:
, оценка условия пройдет и вставит этап Prod
, чего не ожидается, исходя из ваших требований.
Мне очень нравится ваш подход, есть ли шанс, что pulling
версию можно автоматизировать? Действительно ли нам нужен parameters
поверх имени тега?
О, я понимаю, что ты имеешь в виду. Позвольте мне провести еще один тест.
Привет @michasaucer, Спасибо, что уделил время и поделился. Это заняло у меня некоторое время, так как мои тесты требовали некоторых операций по изменению синтаксиса и добавлению тегов для каждой попытки. Я поделился обновленным образцом для вашей справки и надеюсь, что информация поможет.
- ${{ if startsWith( variables['Build.SourceBranch'], 'refs/tags/vX.Y.Z' ) }}:
это работает?