Як ми захищаємо ваші гілки: налаштування Branch Protection Rules
Уявіть: у п'ятницю ввечері розробник випадково запушив сирий код у main, продакшен ліг. З'ясування причин зайняло 3 години, а виправлення — ще пів дня. Якби були налаштовані branch protection rules, коміт не пройшов би — CI впав би, і мерж заблокувався. Такі інциденти ми бачили десятки разів у різних проєктах: від стартапів до enterprise. Кожного разу вони коштували команді годин налагодження та нервів. Branch Protection Rules — єдиний механічний бар'єр, який запобігає цьому. Правильна конфігурація захищених гілок скорочує кількість інцидентів з force-push до нуля та економить до 80% часу команди на виправленні випадкових поломок. У цій статті — практичний досвід налаштування branch protection для GitHub і GitLab, з реальними конфігами та перевіреними рекомендаціями. Наші інженери налаштовували захист для більш ніж 200 репозиторіїв за 5 років роботи.
Чому захист гілок критичний?
Без правил будь-який розробник може:
- Запушити напряму в main — і продакшен полетить.
- Зробити force-push — втратити коміти колеги.
- Змержити PR без жодного апруву — код без рев'ю потрапляє в реліз.
Наші інженери налаштовують правила так, щоб ці ризики були зведені до нуля, при цьому команда не страждає від надмірних обмежень. За статистикою, команди з захищеними гілками витрачають на 80% менше часу на виправлення випадкових поломок. Частота інцидентів з force-push знижується до нуля. Ми гарантуємо, що після налаштування ваш main залишиться чистим.
Як налаштувати захист гілок у GitHub?
Конфігурація в GitHub знаходиться в Settings → Branches → Add branch protection rule. Покроково:
- Вкажіть паттерн гілки (наприклад,
mainабоrelease/*). - Увімкніть "Require a pull request before merging" — прямий push буде заборонено.
- Встановіть "Required approvals" — рекомендуємо 2.
- Увімкніть "Require status checks" і вкажіть імена джобів CI (наприклад,
build,test). - Активуйте "Require up-to-date branches" та "Require conversation resolution".
- Увімкніть "Do not allow bypassing" — навіть адміни підкоряються правилам.
Нижче — типові налаштування для production-гілки:
| Опція | Рекомендація | Пояснення |
|---|---|---|
| Require a pull request before merging | Увімкнено | Прямий push заборонено; потрібен PR |
| Required approvals | 2 | Мінімум два апруви |
| Dismiss stale approvals | Увімкнено | Скидає апруви при нових комітах |
| Require status checks | Увімкнено | CI має бути зеленим |
| Require up-to-date branches | Увімкнено | Гілка має містити останні зміни з базової |
| Require conversation resolution | Увімкнено | Всі коментарі мають бути закриті |
| Do not allow bypassing | Увімкнено | Навіть адміни підкоряються правилам |
Важливо: для Require status checks потрібно явно вказати імена джобів (наприклад, build, test). Без цього правило не спрацює. Докладніше — у документації GitHub.
Як налаштувати захист гілок у GitLab?
Налаштування в GitLab (Settings → Repository → Protected Branches) більш гранульоване. Кроки:
- Виберіть гілку (наприклад,
main). - Встановіть "Allowed to push and merge" = "No one".
- "Allowed to merge" = "Maintainers".
- Увімкніть "Code owner approval required".
Branch: main Allowed to push and merge: No one Allowed to merge: Maintainers Code owner approval: Required Установка Allow to push = No one гарантує, що навіть власник репозиторію не зможе запушити напряму — тільки через Merge Request. Це дисциплінує команду краще за будь-які code review guidelines.
GitLab також підтримує Push Rules (Settings → Repository → Push Rules):
- Reject unsigned commits — тільки GPG-підписані коміти
- Check whether author is a GitLab user — блокування комітів від невідомих email
- Prevent pushing secret files — заборона на файли
.pem,.key,id_rsa - Commit message regex — обов'язковий ID задачі:
^(PROJ-\d+|Merge branch)
Докладніше — у документації GitLab.
Які правила захищають вашу гілку?
Branch protection rules охоплюють кілька шарів безпеки. Перший — обов'язковий PR та апруви. Другий — статус-чеки: CI має бути зеленим. Третій — обмеження force push та конфіденційних файлів. Комбінація цих шарів дає захист від 99% типових помилок.
Порівняння GitHub і GitLab
| Функція | GitHub | GitLab |
|---|---|---|
| Обов'язковий PR | Require pull request | Merge request required |
| Необхідні апруви | Required approvals | Approval rules |
| Контроль CI | Require status checks | CI must succeed |
| Заборона force push | Include administrators | No one allowed to push |
| CODEOWNERS | .github/CODEOWNERS | File-based, also Code Owner approval |
Що входить у налаштування захисту гілок?
- Аудит поточної конфігурації — перевірка існуючих правил, виявлення слабких місць
- Проєктування правил — під вашу модель гілкування (GitFlow, Trunk-based, GitHub Flow)
- Налаштування на всіх репозиторіях — включаючи organisation-level rules (GitHub Enterprise / GitLab Premium)
- Документація — опис правил та рекомендації для команди
- Навчання розробників — як працювати з захищеними гілками
- Підтримка — допомога при інцидентах, коригування правил
Додатково можемо налаштувати CODEOWNERS для автоматичного призначення рев'юерів. Приклад файлу:
# Глобально — tech lead * @myorg/tech-leads
# Інфраструктура — SRE infrastructure/ @myorg/sre-team
*.tf @myorg/sre-team
# Frontend src/components/ @myorg/frontend-team
# Backend src/api/ @myorg/backend-team Приклад готової конфігурації для GitHub
---
# .github/protected-branches.yml
branch_protection:
- pattern: main
require_pr: true
required_approvals: 2
dismiss_stale: true
require_status_checks:
- build
- test
require_up_to_date: true
require_conversation_resolution: true
enforce_admins: true
allow_force_pushes: false
allow_deletions: false
Force push: коли дозволяти, коли забороняти
Забороняємо завжди для main та develop — force-push переписує історію. Якщо хтось уже задеплоїв коміт, який потім перезаписаний, виникають трудноналагоджувані розходження. Для feature-гілок можна дозволити force-push, але тільки з --force-with-lease (не --force). Ця команда відмовиться виконувати дію, якщо на сервері є коміти, яких немає локально. Так ви не втратите чужі зміни.
Терміни та вартість
Налаштування branch protection rules для одного репозиторію займає 2-3 години. З CODEOWNERS, push rules та документацією — пів дня. Organisation-level ruleset (застосовується до всіх репозиторіїв організації) — 1 день. Вартість розраховується індивідуально — залежить від кількості репозиторіїв, складності правил та необхідності навчання команди. Середня економія часу після впровадження сягає 80% — за рахунок виключення ручних відкатів та простоїв. За 5 років роботи ми налаштували захист для більш ніж 200 репозиторіїв — від стартапів до корпоративних кластерів. Наші інженери мають багаторічний досвід налаштування захисту для десятків репозиторіїв. Гарантуємо, що налаштування не заблокує процеси розробки — ми перевіряємо кожне правило на тестових репозиторіях.
Щоб отримати консультацію з налаштування branch protection, зв'яжіться з нами — ми підберемо оптимальні правила під ваш workflow. Замовте аудит поточної конфігурації захисту гілок.







