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







