NPV-AM

Опубликовано: 20 июля 2026
GitLab CI/CD

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

Практические советы

# Оптимизация: прерывание старых пайплайнов
build:
  interruptible: true
  stage: build
  script: docker build .

# Эксклюзивный деплой
deploy:
  resource_group: production
  script: ./deploy.sh

Заключение

GitLab CI/CD предлагает гибкие инструменты для построения эффективных пайплайнов. Используйте модульность через include, кэширование для скорости и rules для гибкости. Child pipelines помогают масштабировать конфигурацию для крупных проектов.

← Назад к списку статей