Налаштування CI/CD конвеєра в GitLab: від моноліту до модулів

Монолітний конвеєр гальмує релізи: збірка тягне за собою весь проєкт, а дрібне виправлення перетворюється на ручну роботу. Ми налаштовуємо GitLab CI/CD під ключ — переводимо збірку на модулі, прибираємо ручні кроки й помітно скорочуємо час випуску версій. Обговоримо ваше завдання й повернемося з планом переходу.
Часті запитання

Налаштування GitLab CI/CD: чому монолітний конвеєр ламається

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

Поступово в ньому десятки стадій, розгалуження за rules, залежності між кроками тримаються на порядку оголошення, а частина викладки виконується вручну з інтерфейсу.

Звідси довгий реліз. Правка в одному модулі запускає повний прогін: перезбираються всі компоненти, заново підтягуються залежності, повторно виконуються перевірки, які не стосуються зміни. Кеш не допомагає, бо ключ спільний на весь сценарій і скидається за першої ж правки.

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

Крихкість проявляється інакше: сценарій перестають змінювати, бо бояться. Правка однієї стадії валить сусідню, крок із allow_failure маскує падіння, і помилка спливає вже на продакшені.

Ручні кроки під час викладки додаються як тимчасове рішення, обростають усними домовленостями й зрештою тримаються на одній людині: порядок дій знає вона, а не конвеєр.

Вузьке місце збірки — це не потужність виконавця, а зв'язність. Поки логіка збірки одна на всі компоненти, будь-яку зміну доводиться перевіряти цілком, а розділити відповідальність між командами неможливо.

Далі розбираємо, як це закривається: винесеними модулями конфігурації, явними контрактами між етапами й передбачуваними точками відкату.

Що дає модульна збірка: швидкість релізів і клас відмов

Модульна збірка в GitLab CI/CD починається з того, що повторювані кроки — встановлення залежностей, прогін тестів, збірка артефакту, публікація образу — виносяться в загальні описи, які підключаються в кожен проєкт.

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

Час відновлення визначається тим, наскільки вузько локалізовано збій. Поки кроки живуть в одному довгому описі, будь-яка правка — це перезапуск усього сценарію з нуля.

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

Частка ручних операцій скорочується до поодиноких точок узгодження. Збірка артефакту, застосування міграцій, розкатка на середовище описуються декларативно й виконуються однаково на стенді та в продуктивному середовищі — інженер не збирає реліз руками й не копіює файли на сервер.

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

Побічний ефект перевикористання кроків — новий сервіс підключається до готової схеми за хвилини, а не потребує власного набору команд, який потім ніхто не підтримує.

Варіанти організації збірки: моноліт, модулі, спільний конвеєр

Монолітна збірка — один файл конфігурації на всі сервіси — перестає масштабуватися, коли над репозиторієм працює більше однієї команди. Правка спільного блоку зачіпає чужі етапи, а скопійовані між проєктами задачі розходяться вже за кілька релізів. Нижче — чотири альтернативи та межі, за якими кожна починає заважати.

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

Варіант Коли підходить Обмеження
Монолітна збірка Один сервіс, одна команда, рідкісні релізи Правка задачі зачіпає чужі етапи, задачі дублюються між проєктами
Модульні шаблони Кілька команд, спільні етапи збірки та перевірок Шаблони потрібно версіонувати, інакше проєкти розходяться за поведінкою
Спільні бібліотеки кроків Багато однотипних сервісів, часті зміни правил перевірок Зміна кроку впливає на всіх споживачів — бібліотеку тестують окремо
Ізольовані середовища Різні стеки, жорсткі вимоги до відтворюваності Більше ресурсів, обов'язкові кеш залежностей і передавання артефактів

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

Як перевести збірку на модулі: етапи інженерної роботи

Переведення збірки з моноліту на модулі — це не правка одного файлу конфігурації, а послідовність робіт, де кожен крок перевіряється на живому релізі.

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

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

  2. Проєктування схеми збірки. Визначаємо межі модулів, правила запуску за зміненими шляхами (rules:changes у GitLab) і те, що перевикористовується: спільні шаблони та підключувані фрагменти конфігурації. Окремо фіксуємо, які кроки йдуть паралельно, а які зобов'язані залишатися послідовними.

  3. Налаштування середовищ. Секрети та змінні виносимо в захищені набори, розділяємо середовища, вирівнюємо виконавців збірки — результат не повинен залежати від того, на якій машині запустився конвеєр, за індивідуальним розрахункомПеревірка на реальних релізах.

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

  4. Передавання та навчання. Віддаємо документацію щодо структури конвеєра, регламент правок і розбір із командою — щоб зміни вносилися за правилами, а не правкою навмання.

Що залишається в репозиторії та документації після передавання

Передавання — це не «налаштували й пішли», а набір файлів, за якими ваша команда вносить правки сама, без листування з нами. Усе лежить у репозиторії поруч із кодом і живе в тій самій історії змін, тому будь-яка правка збірки проходить перевірку як звичайний коміт.

  • Конфігурація збірки: кореневий файл у GitLab і підключувані модулі за стадіями — підготовка, тести, публікація. У кожного блоку коментар: навіщо він і що зламається, якщо його прибрати.
  • Шаблони типових завдань: новий однотипний сервіс підключається зазначенням шляху та змінних, а не копіюванням сотні рядків.
  • Схема середовищ: які гілки публікуються в тестовий і робочий контур, де зберігаються секрети й чим вони відрізняються від звичайних змінних.
  • Регламент випуску: хто ініціює реліз, які перевірки обов'язкові, як відкотитися на попередню версію і коли випуск блокується автоматично.
  • Інструкції для команди: як додати сервіс у збірку, як відтворити падіння локально, як читати журнал завдання, що впало.
  • Політики зберігання: терміни життя артефактів, проміжних даних збірки й тимчасових середовищ — щоб обсяг сховища не зростав сам собою.
  • Матриця доступів: ролі в проєкті, хто має право змінювати конфігурацію, захищені гілки й запускати випуск.

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

Кейс: як прискорили релізи та прибрали ручні кроки збірки

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

Випуск займав 40–60 хвилин, і приблизно кожна четверта правка запускала повторну збірку через нестабільні середовища.

Що змінили

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

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

Метрики до та після

Показник До Після
Час випуску релізу 40–60 хв 9–12 хв
Ручних кроків на викладку 14 2
Частка повторних збірок 24% 4%
Відмови через нестабільну викладку 3–4 за квартал поодинокі

Що зникло за класом відмов: розбіжності між стендом і робочим контуром, «забуті» міграції та повторна збірка після невдалого прогону.

Відкат тепер — повторний запуск попереднього завдання, а не відновлення за інструкцією: повернення до робочого стану скоротилося з 30 хвилин до 2–3.

Що робити, якщо конвеєр у GitLab уже розгорнуто

Ламати робочу схему не потрібно й невигідно: поки вона збирає артефакти, у команди є запас часу на спокійну заміну. Правильний шлях — не переписування з нуля, а поступовий перехід, за якого нова конфігурація співіснує зі старою і в будь-який момент вимикається однією ревізією.

Технічно це паралельний запуск: новий конвеєр описується окремим файлом конфігурації в тому самому репозиторії, а GitLab підключає його за правилами — для частини гілок, тегів або за значенням змінної запуску.

Налаштування GitLab CI/CD у такому режимі зводиться до того, що чинна схема збірки продовжує обслуговувати релізні гілки, поки нова не доведе результат на реальному потоці змін.

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

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

Відкат змін не вимагає ручної повторної збірки: конфігурація версіонується разом із кодом, тому повернення — це відкат одного коміту, а не відновлення схеми з пам'яті.

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

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

Часті технічні сумніви перед переведенням на модулі

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

Де зберігати секрети, якщо конфігурація стала спільною?

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

Як розділити доступи, щоб спільний шаблон не зламали випадково?

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

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

Залежності фіксуємо: проєкт посилається на конкретну версію шаблону, а не на його поточний стан. Тоді оновлення одного сервісу не тягне за собою чужі збірки, а відкат — це зміна посилання на попередню версію. Раз на узгоджений цикл модулі оновлюємо пачкою.

Що залишиться команді після передавання?

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

Обговорімо задачу: розберемо ваш конвеєр і повернемося з планом

Оцінка обсягу робіт будується на фактах, а не на загальних словах: за поточним конвеєром видно, скільки стадій доведеться розбирати на модулі й де сховані ручні кроки. Доступ до робочого контуру та зупинка релізів для цього не потрібні — досить конфігурації та опису процесів.

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

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

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139