Как быстро найти причину бага между двумя релизами с большим количеством коммитов
Что проверяют
Знаете ли вы git bisect и умеете ли искать регрессию системно, а не чтением сотен диффов. Следом обычно спрашивают, как автоматизировать поиск и что делать с коммитами, которые не собираются.
Как отвечать
Основной инструмент это бинарный поиск по истории. Между релизами 1000 коммитов, значит, хватит примерно десяти проверок: каждая отсекает половину диапазона.
- старт:
git bisect start, затемgit bisect bad v2.5иgit bisect good v2.4. Git переключает рабочую копию на середину; - шаг: собираете, воспроизводите баг, отмечаете
git bisect goodилиgit bisect bad, и так до первого плохого коммита. В концеgit bisect reset; - автоматизация:
git bisect run ./check.sh, где скрипт собирает проект и гоняет тест. Код выхода 0 значит «хороший», 125 значит «пропустить», прочие коды до 127 значат «плохой». Для iOS внутри обычноxcodebuild testс-only-testing:на один тест, воспроизводящий баг, и симулятором в-destination; - несобираемые коммиты:
git bisect skipили код 125 из скрипта; - только слияния: если в основную ветку всё попадает merge-коммитами,
git bisect start --first-parentсразу укажет на виноватый пул-реквест.
Сборка iOS-проекта на каждом шаге занимает минуты, поэтому бисект иногда удобнее вести по готовым сборкам из CI, если они хранятся по коммитам. Сузить диапазон заранее помогают стектрейс из Crashlytics или Xcode Organizer и git log v2.4..v2.5 -- Sources/Payments, когда понятно, какой модуль сломан.
Где спотыкаются
Не проверяют, что «хороший» релиз хороший и сейчас. Если баг вызван бэкендом, фиче-флагом или новой версией iOS, старая сборка тоже его покажет, и бисект найдёт невиновный коммит.
Ищут плавающий баг одной попыткой на шаг. Одна ошибочная отметка уводит поиск не в ту половину, поэтому нестабильный сценарий прогоняют внутри скрипта несколько раз.
Отбрасывают найденный коммит, потому что «код там не менялся», а поменялись только Package.resolved или Podfile.lock. Регрессию часто приносит именно обновление зависимости, и бисект показал её честно.