# Відрепетирувала CI‑хук на боці форжу й знайшла два дефекти, недосяжні читанням файлу: запасний варіант, який клав нерозв'язний аргумент на вхід хука, і власну змінну середовища git, яка йшла за воротами у checkout і робила 19 тестів червоними.

серпень 2026

**Ситуація.** Самостійно розміщена git‑форджа приймає пуші й може виконати хук на боці сервера, аби відхилити роботу, що не проходить перевірку. Хук на боці сервера є тим єдиним шматком автоматизації, який не можна випробувати, запустивши його локально: він виконується в голому репозиторії, без робочого дерева, у середовищі, яке задає форджа, читаючи запушені посилання зі свого стандартного входу. Прочитати скрипт і виснувати, що він правильний, — це здогад.

**Завдання.** Хук треба було відрепетирувати проти справжнього голого репозиторію та справжнього пушу, перш ніж йому довіряти, а не розгорнути й дізнатися.

**Дія.** Репетиція створює голий репозиторій, встановлює хук, клонує його, комітить, пушить і стверджує і на шляху прийняття, і на шляху відхилення. Вона знайшла два дефекти, жоден із яких не був видимий у файлі. Першим був запасний варіант в обробці аргументів: коли хук не міг визначити посилання, він підставляв заповнювач, що не був розв'язуваним об'єктом, і оскільки значення приходить на стандартний вхід хука, а не як параметр, відмова спливала як неспоріднена помилка значно нижче. Другий вартий запам'ятовування. Git експортує змінну середовища, що називає каталог репозиторію, коли викликає хук, і цю змінну успадковує все, що хук запускає. Перевірка вивантажує запушену ревізію й виконує в ній набір тестів, а набір тестів успадкував вказівник на голий репозиторій — тож дев'ятнадцять тестів, що торкаються git, розв'язувалися проти хибного репозиторію й почервоніли на коді, що був правильним. Середовище треба очищати на межі, і ця межа невидима, доки річ насправді не запустять.

**Результат.** Хук працює на обох шляхах, і обидва дефекти знайдено раніше, ніж їх зустрів справжній пуш. Обмеження в тому, що репетиція все одно є симуляцією: вона доводить, що хук переживає одну форму пушу, а форджа в роботі бачить пуші, яких ця репетиція не конструює, зокрема примусові оновлення та видалення гілок.

---

- Роль: Python‑інженер
- Категорії: [DevOps](https://engineer.company/uk/categories/devops/), [Інфраструктура](https://engineer.company/uk/categories/infrastructure/), [Автоматизація та CI/CD](https://engineer.company/uk/categories/automation/), [Linux та сервери](https://engineer.company/uk/categories/linux/), [Тестування та QA](https://engineer.company/uk/categories/testing/), [Python](https://engineer.company/uk/categories/python/)
- Послуги: [Infrastructure as Code](https://engineer.company/uk/services/infrastructure-as-code/), [DevOps та автоматизація CI/CD](https://engineer.company/uk/services/devops-cicd/), [Системне адміністрування](https://engineer.company/uk/services/system-administration/)

<https://engineer.company/uk/portfolio/rehearsed-the-forge-side-ci-hook-151/>
