Проблема «зелені окремо, червоні разом». PR A і PR B пройшли CI окремо, кожен відносно старого main. Їх злили один за одним - і main зламався: A перейменував метод, а B додав новий виклик старої назви. Конфлікту в Git немає, а код не працює.
Вимога «гілка має бути актуальною» це лікує, але в активному репозиторії перетворюється на гонку: кожне злиття робить усі інші PR застарілими, їх оновлюють, CI перезапускається, і хтось інший знову зливає першим.
Merge queue:
- PR схвалений і зелений - автор додає його в чергу замість натискання Merge;
- GitHub створює тимчасову гілку
gh-readonly-queue/main/...зmain+ усіма PR, що стоять перед ним у черзі, + цим PR; - на цій комбінації запускаються обов'язкові перевірки;
- перевірки пройшли - PR вливається; впали - PR вилучається з черги, а черга за ним перебудовується без нього.
Черга може перевіряти кілька PR групою паралельно - це прискорює потік, коли PR багато.
Що треба налаштувати в CI:
on:
pull_request:
merge_group:
Подія merge_group - окрема від pull_request і push. Якщо її не додати, обов'язкові перевірки для черги не запустяться, і злиття впаде через відсутній статус. Сторонні CI мають реагувати на push у гілки з префіксом gh-readonly-queue/.
Що змінюється для команди:
- спосіб злиття визначає черга, а не автор;
mainзавжди зелений: те, що в нього потрапляє, перевірено саме в такій комбінації;- час до злиття зростає на тривалість CI - тому швидкий CI стає ще важливішим.
Коли не потрібна: невелика команда, кілька злиттів на день - достатньо вимоги актуальності гілки. Merge queue окупається там, де PR вливаються десятками на день і зламаний main блокує всіх.