Ручной деплой — главный источник 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:latestSelf-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 — и ваш деплой станет надёжным и быстрым.







