PR-триггер без перестройки, тестирования, повторного развертывания всех служб в конвейере в монорепо

#git #azure #azure-devops #azure-pipelines

#git #azure #azure-devops #azure-конвейеры

Вопрос:

Мой monorepo — это структура как таковая, где подкаталоги являются либо «микросервисами», либо ресурсами:

 /app
  /admin
  /admin-v2
  /api
  /api-v2
  /client
  /k8s
  /postgres
  /scripts
  azure-pipelines.yaml
  skaffold.yaml
 

У меня есть одна часть головоломки. Я знаю, что следующая команда сообщит мне, на какие «микросервисы» повлияла фиксация, связанная с этим PR:

 $ git diff --name-only $COMMIT_ID | awk -F'/' 'NF!=1{print $1}' | sort -u
admin-v2
api-v2
client
postgres
 

Я знаю, что каждый этап в моем конвейере будет соответствовать одному из этих «микросервисов», и мне понадобится предыдущая команда на каждом этапе, чтобы увидеть, присутствует ли этот этап. Если это так, его необходимо запустить. Если нет, этап может быть проигнорирован.

Моя конечная цель — заставить разработчика нажать на удаленный с их недолговечной веткой, открыть PR для слияния в магистраль, когда PR открыт, он запускает конвейер CI для создания «микросервиса», запуска модульных и интеграционных тестов, только на «микросервисах», которые находятся в их PRвместо того, чтобы перестраивать все, каждый раз.

Хотел бы сделать это из одного azure-pipelines.yaml . Альтернативой было бы иметь по одному в каждом подкаталоге и отдельные конвейеры для каждого, что может вызвать проблемы.

Предложения о том, как это реализовать?

Ответ №1:

PR-триггер без перестройки, тестирования, повторного развертывания всех служб в конвейере в монорепо

Триггер PR — это не то же самое, что триггер CI в репозиториях Azure Git. Это потому , что:

В репозиториях Azure Git эта функциональность реализована с использованием политик ветвления. Чтобы включить проверку запросов на извлечение в репозиториях Azure Git, перейдите к политикам ветвей для нужной ветви и настройте политику проверки сборки для этой ветви. Для получения дополнительной информации см. раздел Настройка политик ветвей.

Итак, триггеры PR в YAML по-прежнему не поддерживаются в Azure DevOps, мы не могли использовать условие напрямую для сборки, тестирования, развертывания, например:

 condition: contains(variables['Build.SourceBranch'], 'refs/heads/staging')
 

Мы должны добавить задачу powershell в сборку, тестирование, развертывание, чтобы определить, какие «микросервисы» были затронуты фиксацией, связанной с PR, например:

 $editedFiles = git diff HEAD HEAD~ --name-only
echo "$($editedFiles.Length) files modified:"
$editedFiles | ForEach-Object {
   echo $_
    Switch -Wildcard ($_ ) {
        'app/admin-v2/*' { 
              # If the admin-v2 is updated, we need to generate the variable Enable_Admin-v2
              Write-Output "##vso[task.setvariable variable=Enable_Admin-v2]True" 
         }        
        'app/api-v2/*' { Write-Output "##vso[task.setvariable variable=api-v2]True"  }
        # The rest of your path filters
    }
}
 

Этот скрипт устанавливает переменные, на которые затем ссылаются в пользовательских условиях на следующем шаге конвейера сборки, тестирования и развертывания:

 and(succeeded(), eq(variables['Enable_Admin-v2'], 'True'))