Поезда слияния
Функционал доступен в Enterprise версии
Функционал поездов слияния является логическим продолжением функции конвейера результата слияния (КРС). КРС - особый тип конвейеров доступный в запросах на слияние, позволяет оценить итоговое состояние проекта до выполнения слияния, но это состоянии актуально только в момент создания КРС.
Пример не актуального состояния проекта в КРС
Пользователь A создает запрос на слияние из своей ветки branch-a в master. После создания запроса начинает выполнение КРС. Данный конвейер будет создан на коммите, в котором будет такое состояние проекта, если бы запрос на слияние был выполнен. Далее Пользователь B выполняет свой запрос, который сливает изменения из ветки branch-b в ветку master. Из-за новых изменений в master ветке, КРС, созданный в первом запросе, будет уже не актуален.
Поезд слияния — это последовательность КРС для группы запросов, гарантирующая актуальность изменений перед слиянием и позволяющая избежать гонок с проверкой актуального состояния проекта перед слиянием ветки.
Описание работы
Поезда слияния влияют на процесс выполнения запросов на слияние и работают следующим образом:
-
После выполнения слияния, запрос попадает в отдельную очередь. В этой очереди для каждого запроса будет создан особый конвейер - поезд слияния.
-
Поезд слияния по своей сути является конвейером результата слияния, но с тем отличием, что он выполняется последовательно для группы запросов из очереди.
-
Пока конвейер поезда слияния не завершится с одним из статусов - Успех или Ошибка:
- Запрос на слияние будет иметь статус Открыт
- Кнопка для выполнения слияния будет заблокирована
- На главной странице запроса будет отображаться конвейер поезда слияния
-
Если конвейер завершается со статусом Успех:
- Запрос будет выполнен, как обычно, с учетом примененных правил слияния.
-
Если конвейер завершается со статусом Ошибка:
- Запрос исключается из очереди.
- Следующие за ним запросы перестраиваются, в соответствии с новым состоянием очереди.
- Запрос на слияние, чей поезд слияния был завершен с ошибкой, нужно выполнить повторно, чтобы запустить новый конвейер.
Выполнение запроса с потенциальными конфликтами
При попытке отправить в очередь несколько запросов на слияние может произойти ситуации, когда из-за запроса, выполненного раньше возникнут конфликты в запросе, который выполнится позже. Такие потенциальные конфликты могут влиять на результат нажатия кнопки Слить в запросе. Поэтому, если после нажатия на указанную кнопку не происходит создание нового поезда, то следует дождаться выполнение всех уже созданных поездов - после их выполнения в данном запросе будут отображены конфликтующие файлы.
Польза от данной функции особенно заметна при работе в большом коллективе, когда над одним проектом может работать большое количество разработчиков.
Пример работы
Существуют четыре запроса на слияние - A, B, C, D. Запросы были поставлены в очередь поезда слияния с веткой master. До момента слияния каждая из веток прошла КРС с веткой master в рамках своего запроса. При успешном прохождении поезда слияния A и master, запрос на слияние B будет проходить КРС с коммитом после слияния A и master. В случае ошибки в КРС запрос на слияние останется в статусе Открыт для решения проблем, а очередь C, D будет переопределена. Следующий КРС C будет проходить с коммитом после слияния A и master по ранее описанному принципу. При успешном слиянии веток, связанные запросы на слияния получают статус "Слит", как если бы они были слиты вручную.
Настройка поездов слияния
Для включения функции необходимо в настройках проекта в разделе Настройка CI/CD активировать опции Запуск конвейера результата слияния и Запуск поездов слияния.


