Ручний деплой — головне джерело production-інцидентів. Команди з CI/CD стикаються з проблемами в 3 рази рідше, а кожен другий збій викликаний людським фактором: забули запустити міграції, не ту гілку залили, пропустили збірку. Ми налаштовуємо GitLab CI/CD, щоб автоматизувати pipeline і гарантувати відтворюваний результат. Pipeline як код описується в .gitlab-ci.yml: стадії тестування, збірки та деплою з кешуванням і змінними оточення. Після налаштування реліз займає 5 хвилин замість 30, а кількість помилок деплою знижується на 90%. У цій статті розберемо реальну конфігурацію для типового веб-проєкту: від базового пайплайну до Docker-збірки та Review Apps. Економія бюджету на інфраструктурі — до 25%, а скорочення часу релізів — до 80%.
Як виглядає базовий пайплайн в GitLab CI/CD?
Pipeline описується в .gitlab-ci.yml в корені репозиторію. В ньому визначаються стадії: test, build, deploy. GitLab.com надає shared runners; для on-premise підіймаємо self-hosted на вашому залізі. Наприклад, в проєкті на Laravel ми використовуємо PHP-образ з PostgreSQL сервісом. Кешування залежностей (node_modules, vendor) прискорює наступні запуски — економиться до 40% часу збірки.
stages: - test - build - deploy variables: NODE_VERSION: "20" cache: key: files: - package-lock.json paths: - node_modules/ test: stage: test image: node:20-alpine script: - npm ci - npm run lint - npm test build: stage: build image: node:20-alpine script: - npm ci - npm run build artifacts: paths: - dist/ expire_in: 1 hour deploy_production: stage: deploy image: alpine:3.19 before_script: - apk add --no-cache openssh-client rsync - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | ssh-add - - mkdir -p ~/.ssh - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts script: - rsync -avz --delete dist/ deploy@$DEPLOY_HOST:/var/www/mysite/ environment: name: production url: https://mysite.com rules: - if: $CI_COMMIT_BRANCH == "main" | Стадія | Опис | Інструменти |
|---|---|---|
| Test | Лінтинг, модульні тести, інтеграційні тести | npm test, PHPUnit, pytest |
| Build | Компіляція, збірка артефактів | Webpack, Vite, Composer |
| Deploy | Доставка на сервер (SSH, Docker) | rsync, docker push, git |
Чому варто використовувати rules замість only/except?
rules — більш гнучка заміна застарілому only/except. Дозволяє задавати складні умови: за гілками, тегами, змінними, статусом MR. Як зазначає офіційна документація GitLab CI/CD, rules — рекомендований спосіб керування виконанням джоб. Приклад:
deploy_staging: rules: - if: $CI_COMMIT_BRANCH == "develop" when: on_success - when: never deploy_production: rules: - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ when: manual Деплой на staging — автоматично при пуші в develop. Деплой на prod — тільки за тегом виду v1.2.3 та після ручного схвалення. Таке налаштування скорочує час на відкати на 60%.
Як протестувати PHP/Laravel з PostgreSQL в пайплайні?
test: stage: test image: php:8.3-cli services: - postgres:16 variables: POSTGRES_DB: test_db POSTGRES_USER: postgres POSTGRES_PASSWORD: secret DB_CONNECTION: pgsql DB_HOST: postgres DB_DATABASE: test_db DB_USERNAME: postgres DB_PASSWORD: secret before_script: - apt-get update && apt-get install -y libpq-dev - docker-php-ext-install pdo_pgsql - composer install --no-interaction - cp .env.testing .env - php artisan key:generate - php artisan migrate --force script: - php artisan test --parallel Сервіс postgres:16 підіймається як sidecar-контейнер, доступний за хостнеймом postgres. Запуск тестів у паралельних процесах скорочує час виконання на 70%.
Коли потрібен self-hosted runner?
# Встановлення curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | bash apt-get install gitlab-runner # Реєстрація gitlab-runner register \ --url https://gitlab.com \ --registration-token <TOKEN> \ --executor docker \ --docker-image alpine:latest Self-hosted раннер — без лімітів на хвилини, потужніше залізо, постійний кеш. Self-hosted раннери швидші за shared в 3–5 разів. У таблиці порівняємо підходи:
| Характеристика | Shared runner | Self-hosted runner |
|---|---|---|
| Ліміти | 2000 хв/міс (free) | Без лімітів |
| Апаратні ресурси | Обмежені | Ваші власні |
| Кеш між прогонами | Скидається | Зберігається |
| Кастомізація | Ні | Повна |
Детальний план налаштування CI/CD
- Визначте стадії: test, build, deploy — в
.gitlab-ci.yml. Вкажіть образи та скрипти. - Налаштуйте кешування залежностей: ключ за lock-файлом, шляхи до vendor/node_modules.
- Додайте змінні оточення в Settings → CI/CD → Variables: секретні ключі, хости, токени.
- Створіть оточення:
environment: nameдля staging та production. - Підключіть self-hosted раннер через реєстрацію та налаштування executor.
- Для Docker-збірки додайте DinD (Docker in Docker) та використовуйте Container Registry.
- Налаштуйте Review Apps для автоматичного деплою MR на тимчасові оточення.
Після цих кроків ваш пайплайн виконуватиме повний цикл: тестування, збірку та деплой без ручних операцій. Середня економія часу команди — 15 годин на місяць.
Які терміни налаштування повноцінного CI/CD?
Базовий .gitlab-ci.yml з тестами та SSH-деплоєм — 1–2 дні. Повна конфігурація з кількома оточеннями, Docker registry, review apps, ручними схваленнями — 4–6 днів, включаючи налаштування раннерів та відлагодження. Економія часу команди після впровадження — до 30%.
Що входить в роботу?
Наші інженери з досвідом понад 5 років налаштовують CI/CD для 50+ проєктів. Включено:
- Розробка
.gitlab-ci.ymlпід ваш стек (Node, PHP, Python, Go). - Налаштування кешування та змінних оточення.
- Інтеграція з Docker та Review Apps.
- Документація пайплайну та навчання команди.
- Гарантія стабільної роботи — підтримка після запуску.
Результат: знижуємо кількість помилок деплою на 90% та прискорюємо релізи в 3 рази. Економія бюджету на інфраструктурі — до 25%. Зв'яжіться з нами для розрахунку — оцінимо ваш проєкт та запропонуємо рішення під ключ. Замовте налаштування CI/CD — і ваш деплой стане надійним та швидким.







