#azure-devops #azure-pipelines
#azure-devops #azure-конвейеры
Вопрос:
Моя текущая структура проекта состоит из двух папок, каждая из которых имеет свои собственные package.xml
и индивидуальные сценарии развертывания.
src
src1 (added Newley)
Название ветки: разработка
Текущая политика: запускает проверку SRC при событии повышения PR
Заявление о проблеме: теперь, когда я добавил SRC1, я хочу иметь политику PR, такую, чтобы:
-
Всякий раз, когда возникает PR, если PR содержит изменения только в src1, он должен запускать проверку SRC1
-
Всякий раз, когда возникает PR, если PR содержит изменения только в Src, тогда он должен запускать проверку src
-
Всякий раз, когда возникает PR, если PR содержит изменения в обоих, тогда должны быть запущены оба конвейера.
Есть ли способ реализовать этот вариант использования в инструменте Azure DevOps / VSTS?
Ответ №1:
Самый простой способ — создать 2 сборки:
- Запустите проверку src
- Запустите проверку src1
Создайте политику проверки сборки в PR и отфильтруйте сборки с помощью path filter
:
Чем выше его fir src, добавьте еще один с соответствующим фильтром.
Смотрите здесь больше информации.
Комментарии:
1. Я думаю, это сработает при событии слияния PR. Меня интересует событие повышения PR, и PR не должно быть разрешено объединять, если не соблюдены политики проверки PR. Пожалуйста, дайте мне знать, если это неправильное понимание. Спасибо, что уделили этому время.
2. Привет @ B. ТАнанд, это именно то, что вам нужно, это в событии повышения PR — в политике проверки сборки слияние не произойдет, если сборка завершилась неудачно (build failed == политики проверки не выполнены).
3. Привет @Shayki, давайте рассмотрим сценарий, в котором был изменен только src. Несмотря на прохождение проверки src, мы не сможем объединить PR, так как в политиках мы добавили 2 других конвейера (src1 / оба), верно?
4. Нет, мы могли бы объединиться, потому что мы добавили «фильтры путей» к каждому конвейеру.
5. хорошо, спасибо вам. Позвольте мне попробовать это сделать. Проголосуем за правильный ответ, если он сработает. Спасибо вам за то, что уделили этому время
Ответ №2:
Вы можете создать единый конвейер проверки сборки с несколькими заданиями. В этом конвейере вы можете запустить git diff --name-only HEAD HEAD~1
задачу сценария, чтобы получить измененные папки. А затем используйте зависимости и условия для нескольких заданий.
Смотрите пример ниже: В нижеприведенном конвейере yaml есть три задания.
Первое задание GetFolder выполнит команды git для получения измененных папок. Затем установите переменную SCR1Folder
true
равной, если папка SCR1 будет изменена, и установите переменную SCR2Folder
true
равной, если папка SCR2 будет изменена. Дополнительные сведения о наборе выходных переменных в сценариях см. здесь.
Второе задание SRC1 зависит от задания GetFolder. И оно будет выполнено после задания GetFolder и при условии SCR1Folder
, что переменная true
eq(dependencies.GetFolder.outputs['Flag.SCR1Folder'], 'true')
Третье задание SRC2 зависит от задания GetFolder и задания «SRC1». Он будет выполнен при условии, если переменная SCR2Folder
равна true
eq(dependencies.GetFolder.outputs['Flag.SCR2Folder'], 'true')
, и он будет выполняться после задания GetFolder и задания «SRC1».
trigger: none
pool:
vmImage: windows-latest
jobs:
- job: GetFolder
steps:
- powershell: |
$folders= git diff --name-only HEAD HEAD~1
$folders
if($folders -cmatch ".*/*SCR1/.*"){
echo "##vso[task.setvariable variable=SCR1Folder;isOutput=true]true"
}
if($folders -cmatch ".*/*SCR2/.*"){
echo "##vso[task.setvariable variable=SCR2Folder;isOutput=true]true"
}
name: Flag
- job: SRC1
dependsOn: GetFolder
condition: and(succeeded(), eq(dependencies.GetFolder.outputs['Flag.SCR1Folder'], 'true'))
steps:
- powershell: echo "run src1 validation"
- job: SRC2
dependsOn:
- GetFolder
- SRC1
condition: and(succeeded('GetFolder'),eq(dependencies.GetFolder.outputs['Flag.SCR2Folder'], 'true'))
steps:
- powershell: echo "run src2 validation"
Я тестировал выше конвейера yaml. Если изменена только папка src1. Тогда будут запущены job GetFolder и job SRC1, а задание SRC2 будет пропущено.
Если, если изменяется только папка src2. Тогда будут запущены job GetFolder и job SRC2, а задание SRC1 будет пропущено.
Если обе папки изменены, задание SRC2 будет запущено после задания SRC1.
Комментарии:
1. Это работает как шарм. Хотя есть наблюдение, что в случае, если мы запускаем оба src src1, он проверяет репозиторий 3 раза. Один раз для Get folder, во-вторых, для Src, в-третьих, для src1. Можем ли мы оптимизировать этот скрипт так, чтобы клонировать только один раз во время конвейера? Как и в случае с текущей настройкой, это занимает примерно в три раза больше фактического времени клонирования. Заранее спасибо.
2. Если вы используете облачные агенты. каждое задание будет использовать новую виртуальную машину . Если для задания src и src1 требуется исходный код. Вам придется клонировать репозиторий три раза. Если src и src1 не нуждаются в исходном коде. Вы можете добавить шаг проверки , чтобы пропустить клонирование репозитория.