Перейти к содержанию

Поезда слияния

Функционал доступен в 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 активировать опции Запуск конвейера результата слияния и Запуск поездов слияния.

Активация в настройках