0% прочитано

Jira + GitLab Merge Requests: як я автоматизувала статуси задач і не зламала процес

У ICanUp я хотіла автоматично рухати Jira-задачу після створення та merge GitLab Merge Request, але не віддавати автоматизації весь життєвий цикл задачі. Розбираю, чому залишила лише два автоматичні переходи, як перевіряю target branch і поточний статус та чому повторний webhook не повинен рухати задачу вдруге.

11 вересня 2026 р. 9 хв читанняCI/CD

Коли я зв'язала GitLab Merge Requests із Jira у ICanUp, ідея спочатку здавалася простою: створився Merge Request - зміни статус задачі, Merge Request об'єднали - пересунь її далі.

Але дуже швидко стало зрозуміло, що така автоматизація може нашкодити, якщо дозволити їй реагувати на кожну подію без контексту.

Мені була потрібна не автоматизація всього процесу, а тільки двох точок, які GitLab справді може підтвердити сам.

У моєму процесі GitLab автоматично підтверджує лише створення Merge Request і успішний merge у development. Початок роботи, тестування і подальші рішення залишаються ручними.
Jira issue status automation driven by GitLab Merge Request created and merged events
GitLab керує тільки двома підтвердженими переходами Jira-задачі, а решта процесу залишається під ручним контролем.

Я не хотіла автоматизувати весь життєвий цикл задачі

Найпростіший варіант - дозволити GitLab рухати задачу від початку роботи до завершення.

Для мене це було неправильним рівнем автоматизації.

GitLab знає, що Merge Request створений або об'єднаний. Але він не знає, чи я вже почала роботу, чи завершила тестування, чи готова задача до production.

Автоматизація повинна приймати рішення тільки там, де в неї є надійний технічний сигнал.

У результаті залишилося тільки два автоматичні переходи

Подія

Початковий статус

Новий статус

Merge Request створений у development

In Progress

Ready for Review

Merge Request успішно merged у development

Ready for Review

Ready to Test

Усе інше залишається ручним.

Я сама переводжу задачу в In Progress, коли реально починаю роботу. Після Ready to Test автоматизація також більше не керує задачею.

Межа автоматизації
Manual:To Do  |  vIn Progress Automatic:In Progress  |  | Merge Request created  vReady for Review  |  | Merge Request merged  vReady to Test Manual after this point:TestingReady to DeployDone

Перша умова - Merge Request має йти саме в development

Створення Merge Request саме по собі ще нічого не означає.

У тому самому репозиторії можуть існувати Merge Requests у development, main або інші гілки.

Автоматичний перехід має відбутися тільки тоді, коли target branch відповідає тому етапу процесу, який ми автоматизуємо.

Перевірка target branch
Event:Merge Request created Required:target branch = development If target branch = main:skip

Це особливо важливо для production Merge Request. Merge у main не повинен повторно змінювати статус Jira-задачі, яка вже пройшла review і тестування.

Друга умова - поточний статус має бути очікуваним

Навіть правильний GitLab event не означає, що Jira-задачу можна пересунути.

Наприклад, Merge Request може бути створений повторно або webhook може прийти тоді, коли задача вже перейшла на наступний етап.

Перед transition я перевіряю не тільки подію, а й поточний статус задачі.

Status guard
MR created: if current status = In Progress    -> Ready for Reviewelse    -> skip  MR merged: if current status = Ready for Review    -> Ready to Testelse    -> skip
Перевірка поточного статусу робить автоматизацію значно безпечнішою: подія може бути правильною, але transition уже не бути актуальним.

Closed і merged - не одна подія

Ще одна важлива межа - закритий Merge Request не дорівнює успішно об'єднаному.

Merge Request можна закрити через зміну рішення, помилкову гілку або тому, що робота більше не потрібна.

У такому випадку Jira не повинна переходити в Ready to Test.

Merged і closed мають різну семантику
Merge Request merged-> transition may run Merge Request closed without merge-> no status change

Ключ Jira-задачі потрібно знайти надійно

Щоб GitLab event можна було пов'язати з Jira-задачею, автоматизації потрібен issue key.

У моєму процесі найбільш надійним місцем є назва source branch. Додатково ключ може бути в назві Merge Request, а commit message використовується лише як запасний варіант.

Де шукати ключ задачі
Priority: 1. source branch2. Merge Request title3. commit message as fallback  Example branch: feature/PROJECT-123-fix-pagination

Я не прив'язую автоматизацію до одного типу branch prefix.

feature/, fix/, chore/ або інша домовленість можуть змінюватися. Важливим залишається сам ключ задачі.

Повторний webhook не повинен повторювати transition

Webhook не варто сприймати як подію, яка гарантовано приходить один раз.

Повторна доставка, повторний запуск automation rule або інша технічна причина не повинні пересунути задачу ще на один статус.

Одна й та сама подія має залишати систему в тому самому правильному стані.

Idempotent behavior
First event: Ready for Review+ MR merged= Ready to Test  Repeated event: Ready to Test+ same MR merged= skip

Саме status guard дає тут простий захист. Після першого успішного transition початковий статус уже не збігається, тому повторна подія нічого не робить.

Дві маленькі automation rules виявилися кращими за одну велику

Спочатку може здаватися зручним зробити одну загальну rule, яка знає весь процес задачі.

Але тоді в ній швидко накопичуються умови для opened, merged, closed, target branch, поточного статусу та винятків.

Я віддала перевагу двом правилам з однією відповідальністю кожне.

Rule

Trigger

Єдина дія

Merge Request created

MR створений у development

In Progress -> Ready for Review

Merge Request merged

MR merged у development

Ready for Review -> Ready to Test

Rule 1 - Merge Request створений

Логіка першого правила
Trigger:GitLab Merge Request created Conditions:- target branch is development- Jira key can be resolved- current Jira status is In Progress- Merge Request is not closed- Merge Request is not already merged Action:Ready for Review

Rule 2 - Merge Request успішно merged

Логіка другого правила
Trigger:GitLab Merge Request merged Conditions:- target branch is development- Jira key can be resolved- current Jira status is Ready for Review Action:Ready to Test

Чому production merge не рухає задачу

Після тестування я можу створити інший Merge Request у main.

Але це вже інший етап доставки.

Якби automation реагувала на будь-який merge, production Merge Request міг би несподівано змінити Jira status вдруге.

Тому target branch є частиною бізнес-правила, а не просто технічною деталлю webhook.

Після Ready to Test рішення знову приймає людина

Автоматизація зупиняється саме там, де GitLab перестає знати достатньо.

Merge Request у development підтверджує, що код увійшов у спільну гілку. Але він не підтверджує, що функціонал протестований або готовий до production.

Тому наступні переходи я залишила ручними.

Після автоматичної частини
Ready to Test  |  | manual  vTesting  |  | manual decision  +--> Ready to Deploy  |  +--> Waiting

Audit Log став частиною перевірки

Для таких правил недостатньо побачити, що задача опинилася в правильному статусі.

Потрібно також розуміти, чому automation спрацювала або чому пропустила event.

Тому Audit Log для мене є частиною діагностики, а не другорядним екраном.

  • Яка GitLab подія запустила правило.
  • Який ключ Jira-задачі було знайдено.
  • Який target branch мав Merge Request.
  • Який статус Jira був до перевірки.
  • Чи було виконано transition.
  • Чому event було пропущено, якщо transition не виконувався.

Що я тестую як сценарії

Сценарій

Очікуваний результат

MR створений у development, status In Progress

Ready for Review

MR merged у development, status Ready for Review

Ready to Test

MR закритий без merge

Без змін

MR створений або merged у main

Без змін

Повторний merged event

Без повторного transition

Неочікуваний початковий status

Без примусової зміни

Ця автоматизація працює не окремо, а поруч із загальним CI/CD процесом ICanUp.

Я вже окремо описувала як побудований мій Laravel CI/CD pipeline у реальному проєкті.

Тут різниця в тому, що pipeline відповідає за перевірку і доставку коду, а Jira automation - тільки за синхронізацію підтверджених етапів роботи.

Назва branch теж стала частиною контракту

Коли issue key шукається в source branch, назва гілки перестає бути просто зручним підписом.

Вона стає частиною інтеграції між Git і Jira.

Саме тому я намагаюся зберігати ключ задачі в branch name навіть тоді, коли сам Git дозволяє назвати гілку як завгодно.

До речі, важливість акуратної роботи з Git history я вже відчула в іншому реальному кейсі - коли потрібно було перенести вже pushed commit у правильну branch без втрати історії.

Що могло піти не так

  • Реагувати на Merge Request у main так само, як на development.
  • Вважати closed Merge Request успішно merged.
  • Не перевіряти поточний Jira status перед transition.
  • Повторно виконувати transition після дубльованого webhook.
  • Шукати ключ задачі тільки в commit message.
  • Автоматично переводити To Do в In Progress без фактичного початку роботи.
  • Автоматично рухати задачу після Ready to Test без результату ручного тестування.
  • Ховати всі умови в одну велику automation rule.
Найнебезпечніша автоматизація не та, яка падає з помилкою, а та, яка успішно виконує неправильний transition і створює хибне уявлення про стан задачі.

Автоматизація має бути консервативною

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

Немає Jira key - пропустити. Неправильний target branch - пропустити. Неочікуваний status - пропустити. Merge Request тільки closed - пропустити.

Для автоматичного transition безпечніше пропустити сумнівну подію, ніж примусово пересунути задачу.

Що я залишила собі на майбутнє

  • Автоматизувати тільки ті переходи, які зовнішня система може підтвердити однозначно.
  • Перевіряти target branch перед кожним transition.
  • Перевіряти поточний Jira status.
  • Розрізняти merged і closed Merge Request.
  • Будувати правила так, щоб повторна подія була безпечною.
  • Використовувати source branch як основне джерело issue key.
  • Тримати невеликі automation rules з однією відповідальністю.
  • Залишати тестування і production-рішення під ручним контролем.
  • Перевіряти Audit Log після зміни automation.

Хороша автоматизація не намагається прийняти всі рішення замість мене. Вона прибирає тільки ті ручні кроки, для яких уже має надійний сигнал.

Висновок

Інтеграція Jira з GitLab стала стабільнішою, коли я перестала дивитися на неї як на спосіб автоматизувати весь процес задачі.

У ICanUp GitLab відповідає тільки за два переходи, які може підтвердити без припущень: Merge Request створений у development і Merge Request успішно merged у development.

Target branch, поточний статус, тип події та повторна доставка webhook перевіряються до зміни задачі. Після Ready to Test керування знову повертається до ручного процесу.

У результаті автоматизація не керує workflow - вона лише синхронізує два факти, які вже відбулися в GitLab.