Пошук уроків, статей та іншого контенту
Що насправді означають ці абревіатури та навіщо потрібен автоматизований конвеєр доставки коду.
CI/CD — це набір практик, які допомагають автоматично перевіряти, збирати та доставляти програмний код.
Абревіатура складається з двох частин:
CI — Continuous Integration, або безперервна інтеграція;
CD — Continuous Delivery або Continuous Deployment, тобто безперервна доставка чи розгортання.
Головна ідея проста: замість того щоб вручну перевіряти й переносити код на сервер після кожної зміни, команда створює автоматизований конвеєр.
Такий конвеєр може:
отримати нові зміни з репозиторію;
встановити залежності;
запустити перевірки та тести;
зібрати застосунок;
створити артефакт для доставки;
розгорнути його на тестовому або бойовому середовищі.
CI/CD не є конкретним інструментом. Це підхід, який можна реалізувати за допомогою GitHub Actions, GitLab CI/CD, Jenkins, CircleCI, Azure Pipelines та інших платформ.
Без автоматизації процес часто виглядає так:
розробник змінює код;
передає його іншій людині на перевірку;
хтось вручну запускає тести;
файли копіюють на сервер;
виникає помилка;
незрозуміло, яка саме зміна її спричинила.
CI/CD робить ці кроки передбачуваними й повторюваними.
Швидкий зворотний зв’язок. Розробник дізнається про помилку одразу після надсилання змін.
Менше ручної роботи. Не потрібно щоразу вручну запускати однакові команди.
Стабільніший процес релізу. Усі зміни проходять однакові перевірки.
Менші та безпечніші зміни. Код інтегрується часто, тому проблеми легше знайти.
Прозорість. Команда бачить, який етап пройдено, а який завершився помилкою.
Швидший реліз. Готову версію можна доставити користувачам за кілька хвилин.
Автоматизація не гарантує відсутності помилок. Вона допомагає виявляти їх раніше та зменшує кількість випадкових дій.
Continuous Integration — це безперервна інтеграція змін у спільну кодову базу.
Розробники регулярно надсилають зміни до репозиторію. Після цього автоматично запускаються перевірки:
встановлення залежностей;
форматування коду;
статичний аналіз;
модульні тести;
інтеграційні тести;
перевірка збирання застосунку.
Якщо перевірки не пройдено, команда отримує сигнал про проблему. Зміни можна виправити, поки вони ще невеликі й пов’язані з конкретним комітом або pull request.
Уявімо, що розробник додав нову функцію:
Розробник створює коміт
↓
Зміни надсилаються до репозиторію
↓
CI встановлює залежності
↓
Запускаються перевірки та тести
↓
Команда отримує результатЯкщо тест завершився помилкою, зміна не повинна потрапити до наступного етапу без виправлення.
Чим довше гілка розробника живе окремо, тим більше змін накопичується. Після об’єднання можуть виникнути:
конфлікти файлів;
несумісність модулів;
зламані контракти між сервісами;
тести, які складно пов’язати з конкретною зміною.
Часті інтеграції роблять проблеми меншими та зрозумілішими.
У скороченні CD можуть мати на увазі два різні процеси.
Безперервна доставка означає, що кожна зміна автоматично готується до релізу.
Після успішних тестів система може:
зібрати застосунок;
створити пакет або контейнер;
зберегти артефакт;
підготувати розгортання;
передати версію на тестове середовище.
Останній крок — розгортання у production — може вимагати ручного підтвердження.
Тобто програмне забезпечення завжди готове до випуску, але команда сама вирішує, коли саме його опублікувати.
Безперервне розгортання йде далі: кожна зміна, яка успішно пройшла всі перевірки, автоматично потрапляє у production.
Схема може виглядати так:
Зміна коду
↓
Перевірки
↓
Збирання
↓
Тестове середовище
↓
Автоматичне розгортання у productionContinuous Deployment потребує високого рівня довіри до автоматичних тестів, моніторингу та механізмів відкату.
Continuous Delivery: система готує зміни, але реліз може запускатися вручну.
Continuous Deployment: система сама розгортає всі зміни, які пройшли перевірки.
У розмовах абревіатуру CD часто використовують для обох понять, тому завжди варто уточнювати, який саме процес мається на увазі.
Pipeline, або конвеєр, — це послідовність автоматизованих кроків.
Наприклад:
Код → Перевірки → Тести → Збирання → Доставка → РозгортанняКожен крок може називатися:
stage — етап;
job — завдання;
step — окрема команда або дія.
Точні назви залежать від інструмента, але логіка зазвичай однакова.
name: Перевірка застосунку
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Отримати код
uses: actions/checkout@v4
- name: Встановити Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- name: Встановити залежності
run: npm ci
- name: Перевірити форматування
run: npm run lint
- name: Запустити тести
run: npm test
- name: Зібрати застосунок
run: npm run buildУ цьому прикладі pipeline запускається:
після надсилання змін у гілку main;
під час створення або оновлення pull request.
Спочатку система отримує код, потім встановлює Node.js і залежності, запускає перевірки, тести та збирання. Якщо будь-який крок завершується з помилкою, pipeline зупиняється.
Назви команд залежать від конкретного проєкту. Наприклад, не кожен застосунок має команду npm run build, а для іншої мови програмування використовуватимуться інші інструменти.
Pipeline потрібно запустити у відповідь на певну подію:
push до репозиторію;
створення pull request;
створення тега;
розклад;
ручний запуск;
завершення іншого pipeline.
Наприклад, перевірки можна запускати для кожного pull request, а production-реліз — лише після створення версійного тега.
На цьому етапі можуть запускатися:
форматер;
linter;
перевірка типів;
аналіз залежностей;
перевірка секретів у коді;
перевірка правил проєкту.
Ці перевірки не замінюють тести, але допомагають швидко знаходити прості проблеми.
Залежно від проєкту pipeline може запускати:
модульні тести;
інтеграційні тести;
end-to-end тести;
тести продуктивності;
перевірки сумісності API.
Не всі тести потрібно запускати на кожній зміні. Частину довгих або дорогих перевірок можна виконувати за розкладом чи перед релізом.
Збирання перетворює вихідний код на результат, який можна запустити або доставити.
Це може бути:
скомпільований застосунок;
архів;
пакет;
Docker-образ;
набір статичних файлів;
пакет для мобільного застосунку.
Результат збирання називають артефактом.
Артефакт зберігається у сховищі, звідки його можна отримати для розгортання. Це важливо, оскільки середовище має запускати саме перевірений результат збирання, а не збирати код заново непередбачуваним способом.
Артефакт встановлюється на певне середовище:
development;
testing;
staging;
production.
У простих проєктах це може бути запуск команди на сервері. У складніших системах розгортання може включати оновлення контейнерів, інфраструктури, конфігурації та міграцій бази даних.
Після релізу корисно перевірити, чи працює застосунок у новому середовищі:
виконати smoke-тести;
перевірити доступність основних endpoint;
перевірити метрики;
переглянути журнали;
переконатися, що критичні функції доступні.
Зазвичай код не розгортають одразу на production. Спочатку він проходить через одне або кілька середовищ.
Наприклад:
Pull request
↓
CI-перевірки
↓
Staging
↓
Ручне підтвердження
↓
ProductionСередовище для щоденної роботи розробників. Воно може часто змінюватися й не завжди бути стабільним.
Середовище для автоматичних або ручних перевірок. Тут тестувальники можуть перевіряти нові функції до релізу.
Середовище, максимально схоже на production. Воно допомагає перевірити поведінку системи в умовах, наближених до бойових.
Середовище, яким користуються реальні користувачі. Зміни тут потребують особливої уваги, моніторингу та плану відновлення.
Pipeline працює з кодом, доступами та інфраструктурою, тому його потрібно захищати.
Паролі, токени, ключі та рядки підключення не можна зберігати у відкритому вигляді в репозиторії.
Замість цього використовують захищене сховище секретів CI/CD-платформи. Також варто:
надавати доступи лише на потрібному етапі;
обмежувати права токенів;
регулярно оновлювати ключі;
не виводити секрети в журнали;
не передавати секрети неперевіреним скриптам.
Pipeline може перевіряти залежності на відомі вразливості. Це не усуває всі ризики, але допомагає швидше виявляти застарілі або небезпечні пакети.
Сервіс, який розгортає застосунок, не повинен мати більше прав, ніж необхідно. Наприклад, pipeline для тестового середовища не обов’язково має отримувати повний доступ до production.
Навіть добре протестована зміна може спричинити проблему. Тому CI/CD має передбачати відновлення.
Корисні механізми:
зберігання попередніх артефактів;
версіювання релізів;
швидкий rollback;
blue-green deployment;
canary deployment;
перевірки стану після розгортання;
автоматичне зупинення rollout при погіршенні метрик.
Створюють два середовища:
одне обслуговує поточну версію;
друге отримує нову версію.
Після перевірки трафік перемикають на нове середовище. Якщо виникає проблема, трафік можна повернути назад.
Нову версію спочатку отримує невелика частина користувачів. Команда спостерігає за помилками та метриками, а потім поступово збільшує частку трафіку.
Організація гілок впливає на складність pipeline.
Поширений варіант:
кожна функція розробляється в окремій гілці;
pull request запускає CI;
після перевірки зміни об’єднуються в основну гілку;
зміни з основної гілки автоматично потрапляють на staging;
production-реліз запускається після підтвердження або створення тега.
Важливо не просто обрати модель гілок, а домовитися про зрозумілі правила:
які перевірки є обов’язковими;
хто може схвалити зміни;
коли запускається реліз;
що робити з невдалим pipeline;
як виконувати відкат.
Не обов’язково одразу автоматизувати весь процес. Краще рухатися поступово.
Опишіть, як зараз відбувається реліз:
які команди запускаються;
у якому порядку;
які файли потрібні;
які дії виконуються вручну;
де найчастіше виникають помилки.
Почніть із коротких і важливих перевірок:
встановлення залежностей;
форматування;
статичний аналіз;
основні тести;
збирання.
Це не дозволить об’єднати зміни, які не пройшли обов’язкові перевірки.
Однаковий код має давати однаковий або передбачуваний результат. Для цього фіксують версії залежностей, інструментів і середовища виконання.
Після успішного CI розгортайте застосунок у середовище, де його можна перевірити до production.
Коли процес стане зрозумілим і стабільним, можна додати автоматичне або ручне розгортання у production.
Автоматичний реліз без спостереження за системою може лише швидше доставляти проблеми користувачам.
Якщо ручний реліз незрозумілий, його автоматизація просто перетворить хаос на складний скрипт.
Спочатку варто описати процес і прибрати зайві кроки.
Зелений статус одного тесту не означає, що застосунок повністю справний. Перевірки мають відповідати реальним ризикам системи.
Якщо базові перевірки тривають годину, розробники можуть почати їх обходити. Швидкі перевірки варто запускати першими, а довгі — паралельно або на окремих етапах.
Секрет, випадково доданий у Git, потрібно вважати скомпрометованим навіть після видалення файлу. Його слід відкликати та замінити.
Якщо для staging і production виконуються різні збирання, результати можуть відрізнятися. Надійніший підхід — перевірити конкретний артефакт і просувати саме його між середовищами, якщо це відповідає архітектурі проєкту.
Помилка в production рано чи пізно трапиться. Команда має заздалегідь знати, як повернути попередню версію.
Автоматичні перевірки аналізують лише те, що для них налаштовано. Вони не замінюють обговорення архітектури, вимог і підтримуваності коду.
Зайві дозволи збільшують наслідки компрометації. Кожен етап має отримувати мінімально необхідний доступ.
На якість процесу вказують не кількість етапів і не складність конфігурації, а практичні результати:
зміни інтегруються часто;
помилки знаходять до production;
pipeline має зрозумілий результат;
невдалий реліз можна швидко відкотити;
час від коміту до доставки передбачуваний;
команда не боїться виконувати реліз;
доступи та секрети захищені;
після розгортання є моніторинг.
Корисно також вимірювати:
частоту релізів;
час від зміни до розгортання;
частоту невдалих змін;
середній час відновлення після проблеми.
Ці показники допомагають оцінити процес на основі фактів, а не вражень.
CI/CD — це спосіб організувати шлях коду від зміни до користувача.
CI автоматично інтегрує зміни та перевіряє їх.
Continuous Delivery готує кожну успішну зміну до релізу.
Continuous Deployment автоматично розгортає перевірені зміни у production.
Pipeline описує послідовність кроків: перевірки, тести, збирання, доставка та розгортання.
Надійний CI/CD потребує не лише автоматизації, а й безпеки, моніторингу та плану відкату.
Найкраще починати з малого: автоматизувати тести й збирання, додати перевірки для pull request, а потім поступово автоматизувати доставку та production-релізи.