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

«Что такое pipeline в CI/CD?» — вопрос из категории CI/CD, который задают на 26% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Pipeline (пайплайн, конвейер) в CI/CD — это автоматизированная последовательность этапов, через которые проходит код от коммита до развертывания в production. Его цель — обеспечить быструю, надежную и повторяемую доставку изменений.

Типичные этапы DevOps-пайплайна:

  1. Сборка (Build): Компиляция кода, сборка артефактов (Docker-образов, jar-файлов).
  2. Статический анализ (Lint/SAST): Проверка кода на соответствие стандартам и поиск уязвимостей (SonarQube, Checkmarx).
  3. Тестирование (Test): Запуск юнит-тестов, интеграционных тестов.
  4. Сборка и публикация артефакта: Помещение стабильного артефакта в реестр (Docker Registry, Nexus).
  5. Развертывание в staging: Автоматическое деплой в тестовое окружение.
  6. Интеграционное/E2E тестирование: Тесты в среде, близкой к production.
  7. Развертывание в production: Часто с стратегиями blue-green или canary.

Пример пайплайна GitLab CI для микросервиса на Go:

stages:
  - test
  - build
  - security_scan
  - deploy

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

unit-test:
  stage: test
  image: golang:1.21
  script:
    - go test ./... -v

build-docker:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE

trivy-scan:
  stage: security_scan
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $DOCKER_IMAGE

deploy-to-staging:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - echo "Deploying $DOCKER_IMAGE to staging"
    - kubectl set image deployment/myapp-deployment app=$DOCKER_IMAGE -n staging
  only:
    - main

Ключевые принципы: идемпотентность, воспроизводимость, быстрая обратная связь при падении любого этапа (fail fast). В моей практике мы использовали пайплайны для реализации GitOps: успешный пайплайн создавал Pull Request в репозиторий с манифестами Kubernetes (Flux/ArgoCD), который затем автоматически применялся в кластере.