У меня есть конвейер Azure, и я хочу, чтобы он запускал первый этап при создании запроса на включение и второй этап, когда запрос на включение завершен и объединен.
Меня устраивает, что при слиянии снова запускается первый этап. Я не хочу создавать два разных триггера: один для запуска этапа проверки, а другой для запуска развертывания. Я бы предпочел, чтобы это были этапы, если это возможно, но буду делать это, если придется.
Мой репозиторий находится в Azure, и ветки, с которых я начинаю, — это просто ветка функций и ветка разработки.
trigger:
batch: true
branches:
include:
- feature
- dev
pool:
vmImage: ubuntu-latest
stages:
- stage: Validate
{Rest of validate stage}
- stage: Deploy
dependsOn: Validate
condition: {Condition that makes it where this deploy stage runs only when merge happens}
{Rest of deploy stage}
До сих пор я пробовал использовать предопределенные переменные, такие как Build.Reason
, Build.SourceBranch
, System.PullRequest
и т. д., и мне не удавалось заставить это работать. Любая помощь приветствуется!
Контекст не позволяет этого сделать в одной сборке, если я его хорошо знаю.
Я хочу, чтобы он запускал первый этап при создании запроса на включение и второй этап, когда запрос на включение завершен и объединен. Меня устраивает, что при слиянии снова запускается первый этап.
Другими словами, вы хотите запускать второй этап только тогда, когда запрос на включение завершен и объединен. Когда PR будет объединен, в истории коммитов появится сообщение о фиксации, например Merged PR xx: The pull request title
.
На основе этого сообщения мы можем создать условия, чтобы второй этап запускался только тогда, когда сообщение о фиксации $(Build.SourceVersionMessage)
содержит ключевое слово Merged PR
.
Однако в моем тесте переменная $(Build.SourceVersionMessage)
может быть недоступна во время оценки условия на втором этапе.
В качестве обходного пути мы можем определить, содержит ли $(Build.SourceVersionMessage)
ключевое слово Merged PR
на этапе 1. Если содержит, установите выходную переменную для использования на втором этапе.
Вот мой образец yaml:
trigger:
batch: true
branches:
include:
- feature
- dev
pool:
vmImage: ubuntu-latest
stages:
- stage: Validate
jobs:
- job: A1
steps:
- powershell: |
Write-Host $(Build.SourceVersionMessage)
if ('$(Build.SourceVersionMessage)' -like '*Merged PR*') {
Write-Host "##vso[task.setvariable variable=isMergedPR;isOutput=true]true"
}
name: SetIsMergedPR
- stage: Deploy
dependsOn: Validate
jobs:
- job: B1
condition: eq(variables['MergedPR'], 'true')
variables:
MergedPR: $[stageDependencies.Validate.A1.outputs['SetIsMergedPR.isMergedPR']]
steps:
- powershell: Write-Host "$(MergedPR)"
Результат испытаний:
Задание на втором этапе будет выполнено, если $(Build.SourceVersionMessage)
содержит ключевое слово Merged PR
, и будет пропущено, если ключевое слово Merged PR
отсутствует.
Рад помочь вам. Кроме того, вот примечание с решением: если вы хотите настроить сообщение о фиксации слияния, сохраните ключевое слово Merged PR
.
I want it to run the first stage when the pull request is created and the second stage when the pull request is completed and merged
- Не думаю, что это возможно в одной сборке.