Выполнение условного этапа на PR повышает даже Azure devops

#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 сборки:

  1. Запустите проверку src
  2. Запустите проверку 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 не нуждаются в исходном коде. Вы можете добавить шаг проверки , чтобы пропустить клонирование репозитория.