DevOps & CI/CD

CI/CD pipeline

Пайплайн — описанная в коде последовательность автоматических стадий, через которые коммит проходит от push до продакшена.

Что такое CI/CD pipeline

CI/CD pipeline (пайплайн, конвейер) — заданная в конфиге последовательность автоматических шагов, через которые проходит каждый коммит: сборка, тесты, публикация артефакта, деплой. Запускается сам по событию в Git-репозитории и либо доходит до конца, либо падает на конкретной стадии с логом.

Аналогия прямая: заводской конвейер. Деталь (коммит) движется по станциям, на каждой с ней что-то делают и проверяют. Брак снимают с ленты сразу, а не находят в готовой машине у клиента.

Слово «пайплайн» в разработке используют шире — так называют любую цепочку обработки, где выход одного шага является входом следующего: pipeline данных в ETL, pipeline в инференсе, pipe в Bash (cat log | grep error | wc -l). В контексте CI/CD под пайплайном понимают именно конвейер сборки и доставки.

Из чего состоит

Стадия Что делает Типичное время
build Компиляция, сборка Docker-образа 1–5 мин
test Unit- и интеграционные тесты, линтеры 2–15 мин
scan Проверка зависимостей и образа на уязвимости 1–3 мин
publish Push образа в registry 1–2 мин
deploy staging Выкатка на тестовый контур 1–2 мин
deploy prod Выкатка в production, часто вручную 1–5 мин

Стадии идут последовательно, задачи внутри одной стадии — параллельно. Провал любой задачи останавливает пайплайн: следующие стадии не запускаются.

Пример пайплайна

.gitlab-ci.yml с параллельными тестами и ручным prod-деплоем:

stages: [build, test, deploy]

variables:
  IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

build:
  stage: build
  image: docker:27
  script:
    - docker build -t $IMAGE .
    - docker push $IMAGE

unit:
  stage: test
  image: $IMAGE
  script: [pytest -q tests/unit]

lint:
  stage: test          # выполняется параллельно с unit
  image: $IMAGE
  script: [ruff check .]

deploy:staging:
  stage: deploy
  script: [kubectl set image deploy/api api=$IMAGE -n staging]
  environment: staging

deploy:prod:
  stage: deploy
  script: [kubectl set image deploy/api api=$IMAGE -n prod]
  environment: production
  when: manual
  only: [main]

Триггеры

  • push в ветку — быстрый прогон: линт и unit-тесты;
  • merge/pull request — полный прогон, результат блокирует слияние;
  • push в main — сборка образа и деплой на staging;
  • тег v* — релизный пайплайн в production;
  • schedule (cron) — ночные тяжёлые прогоны и бенчмарки.

Что делает пайплайн быстрым

Медленный пайплайн перестают ждать, и он теряет смысл. Практические приёмы:

  • Кеш зависимостей между запусками (~/.cache/pip, node_modules) — экономит минуты на каждом прогоне.
  • Fail fast: линтеры и быстрые тесты первой стадией, тяжёлые — дальше.
  • Параллельность: разбить тесты на несколько задач одной стадии.
  • Слои Docker: сначала копировать файл зависимостей, потом код — тогда слой с зависимостями переиспользуется, см. Dockerfile.
  • Быстрые runner'ы: сборка упирается в CPU и диск, поэтому runner держат на VPS с NVMe, а не на самой слабой машине.

Пайплайн для ML

У ML-проектов конвейер длиннее: подготовка датасета → обучение или fine-tuning → проверка метрик на валидации → публикация весов в model registry → выкатка сервинга. Стадия обучения требует GPU, поэтому её отправляют на отдельный runner с картой, а лёгкие стадии оставляют на обычных.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер