GitLab CI/CD: практические паттерны
GitLab CI/CD — мощный инструмент автоматизации сборки, тестирования и деплоя. В этой статье разберём реальные паттерны, которые делают пайплайны быстрыми и поддерживаемыми.
Базовая структура .gitlab-ci.yml
stages:
- build
- test
- deploy
variables:
DOCKER_TLS_CERTDIR: "/certs"
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
only:
- main
- merge_requests
test:
stage: test
image: python:3.11
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .cache/pip
script:
- pip install -r requirements.txt
- pytest --cov=src tests/
deploy:
stage: deploy
script:
- ./deploy.sh production
environment:
name: production
only:
- main
Кэширование зависимостей
Правильное кэширование значительно ускоряет пайплайны:
# Кэш pip (Python)
cache:
key: pip-${CI_COMMIT_REF_SLUG}
paths:
- .cache/pip
policy: pull-push
# Кэш npm (Node.js)
cache:
key: npm-${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
# Разные кэши для разных веток
cache:
key:
files:
- package-lock.json
paths:
- node_modules/
Используйте key: ${CI_COMMIT_REF_SLUG} для раздельного кэширования веток, чтобы избежать конфликтов при одновременной работе.
Include: модульность конфигурации
Для монорепозиториев или повторного использования конфигурации используйте include:
include:
# Из того же проекта
- local: '/ci/templates/deploy.yml'
# Из другого проекта
- project: 'devops/ci-templates'
ref: main
file: '/templates/docker-build.yml'
# Из GitHub
- remote: 'https://example.com/ci/template.yml'
# Шаблон GitLab
- template: Security/SAST.gitlab-ci.yml
stages:
- build
- test
- security
- deploy
Child Pipelines
Для параллельного выполнения независимых задач используйте child pipelines:
# Основной .gitlab-ci.yml
include:
- local: ci/backend.yml
- local: ci/frontend.yml
- local: ci/mobile.yml
trigger:
include:
- local: ci/backend.yml
- local: ci/frontend.yml
strategy: depend
Rules вместо only/except
rules — более гибкий подход, чем only/except:
deploy:
stage: deploy
script: ./deploy.sh
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: on_success
- if: $CI_MERGE_REQUEST_IID
when: manual
allow_failure: true
- when: never
Работа с артефактами
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 week
reports:
junit: test-results.xml
coverage_report:
coverage_format: cobertura
path: coverage/cobertura.xml
Динамические матрицы
Для тестирования на нескольких версиях/платформах:
test:
stage: test
parallel:
matrix:
- PYTHON_VERSION: ["3.9", "3.10", "3.11"]
DATABASE: ["postgres14", "postgres15"]
image: python:$PYTHON_VERSION
services:
- name: $DATABASE
script:
- pytest
Практические советы
- Используйте
needsдля DAG вместо последовательного выполнения - Настраивайте
interruptible: trueдля отмены устаревших пайплайнов - Используйте
resource_groupдля эксклюзивного деплоя - Пробрасывайте секреты через
variablesсmasked: true - Используйте
environmentдля отслеживания деплоев
# Оптимизация: прерывание старых пайплайнов
build:
interruptible: true
stage: build
script: docker build .
# Эксклюзивный деплой
deploy:
resource_group: production
script: ./deploy.sh
Заключение
GitLab CI/CD предлагает гибкие инструменты для построения эффективных пайплайнов. Используйте модульность через include, кэширование для скорости и rules для гибкости. Child pipelines помогают масштабировать конфигурацию для крупных проектов.