Azure DevOps - политики веток приводят к запуску нескольких сборок во время запросов на извлечение

В наших репозиториях есть папки, код в папке иногда зависит от кода в других папках, но только в одном направлении. Для объяснения:

C зависит от B

B зависит от A

У нас есть 3 сборки, необходимые для нашей политики Pull Request для мастера:

У нас есть сборка (BuildC), которая собирает ТОЛЬКО папку C

У нас есть сборка (BuildB), которая строит B и C

У нас есть сборка (BuildA), которая строит A, B и C

В политике указано:

Изменения в папке C требуют BuildC

Изменения в папке B требуют BuildB

Изменения в папке A требуют BuildA

Желаемый эффект: в зависимости от случая я хочу, чтобы запрос на включение требовал ТОЛЬКО ОДНОЙ из трех сборок. Вот случаи:

BuildA - должен запускаться, когда есть изменения в папке A (даже если есть изменения в другом месте)

BuildB - должен запускаться, когда есть изменения в B (и / или C), но НЕ В A. Если есть изменения в папке A, эта сборка НЕ ​​должна запускаться

BuildC - должен запускаться, когда единственные изменения находятся в папке C ... если изменения существуют в папке A и / или B в дополнение к C ... эта сборка не должна запускаться.

На самом деле происходит следующее: если вы что-то измените в папке A и C, запустятся две сборки: BuildA и BuildC ... и если изменения в папке C зависят от папки A, то сборка BuildC завершится ошибкой. В любом случае запуск buildC бесполезен.

Есть ли способ, чтобы в очереди Azure DevOps была только 1 сборка ... но самая лучшая. Итак, в нашем примере BuildA будет запускаться, но не BuildC ... но если бы изменения были только в папке C, он бы запустил Build C?


person David Schwartz    schedule 05.01.2021    source источник


Ответы (1)


Невозможно выполнить то, что вы хотите, с помощью триггеров или политик сборки. Когда есть изменения в папке X, нет опции Не строить. Есть несколько вариантов, но они требуют небольшого переосмысления:

Вариант 1. Используйте вакансии и условия

  • Создайте единый конвейер со стадией сборки и 4 заданиями.
  • Первое задание использует инструмент командной строки, чтобы определить, какие проекты необходимо перестроить, и устанавливает выходную переменную.
  • Остальные 3 задания зависят от первого задания, и для них установлено условие, которое запускается только тогда, когда переменная (заданная в первом задании) имеет определенное значение.

Таким образом, вы можете полностью контролировать порядок сборки всех трех проектов.

Вариант 2. Используйте конвейер оркестровки

Вариант 3. Использование артефактов конвейера

Вместо построения A + B + C в сборке C загрузите результаты из A + B, затем выполните сборку C. Это потребует загрузки артефактов конвейера в конце каждого задания и для каждого последующего задания выполнять инкрементную сборку путем загрузки этих артефактов. и тем самым пропуская процесс сборки.

Вы даже можете загрузить последние успешные результаты, если хотите пропустить сборку кода.

Вариант 4: используйте NuGet

Вместо артефактов конвейера используйте пакеты nuget для публикации выходных данных из сборки A и использования их в сборке B. Или даже опубликуйте A в задании A и используйте его из задания B в том же определении сборки.

Вариант 5. Положитесь на инкрементные сборки

Если вы работаете с агентом, размещенным на собственном хостинге, вы можете отключить параметр« Очистить »для своего конвейера, позаботившись о том, чтобы тот же агент создавал вашу сборку раньше, если будет просто повторно использовать сборку вывод предыдущего запуска, если ни один из входных файлов не изменился (и вы не сделали никаких неправильных настроек msbuild). Будет по существу пропустите построение A, если msbuild может вычислить, что ему не нужно строить A.


Преимущество одной сборки с несколькими заданиями заключается в том, что вы можете указать порядок заданий A, B, C и контролировать, что происходит в каждом задании. Большой недостаток заключается в том, что каждое задание добавляет накладные расходы на выборку источников или загрузку артефактов. Вы можете немного оптимизировать это, четко установив подстановочные знаки для тех частей, которые вы хотите публиковать и восстанавливать.

Если вам не нужны исходные коды на последующих этапах (и вы не используете конвейеры YAML), вы можете использовать мой Не синхронизировать источники (даже с Git), чтобы пропустить этап синхронизации, позволяя вам точно контролировать, что происходит в каждом задании.

Многие из этих параметров полагаются на то, что вы выясните, какие проекты содержат файлы, измененные с момента последней успешной сборки. Вы можете использовать утилиты командной строки git или tfvc, чтобы сообщить вам, какие файлы были изменены, но создание идеального сценария может быть немного сложнее, если у вас включена пакетная обработка сборки, и в этом случае несколько изменений вызовут вашу сборку одновременно, поэтому вы можете Не полагайтесь только на последние изменения. В этом случае вам может потребоваться настроить REST API, чтобы запросить у Azure DevOps все идентификаторы фиксации или все номера наборов изменений, связанные с этой сборкой, чтобы выполнить правильное сравнение, чтобы вычислить, какие проекты содержат изменения.

В долгосрочной перспективе, вероятно, будет проще поддерживать одну сборку с несколькими заданиями или пакетами nuget.

person jessehouwing    schedule 06.01.2021
comment
#jesshouwing .... Спасибо. Это очень полезно. Я думаю, что вариант №2 нам подходит ... Он позволит нам всегда требовать одну сборку (конвейер оркестрации, который выберет правильную сборку для сборки. Поскольку я никогда не хочу создавать более одной сборки (мы уже 3 & 4 для обработки зависимых сборок без необходимости перестраивать библиотеки, от которых они зависят), я не получаю от нескольких сборок - person David Schwartz; 06.01.2021
comment
Пожалуйста! - person jessehouwing; 07.01.2021