Как организован процесс непрерывной интеграции и доставки (CI/CD)?

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

Ответ

Я строю CI/CD-пайплайны с акцентом на автоматизацию, скорость и надежность доставки. В основе лежит GitOps-подход и идемпотентность всех этапов.

Стек: GitLab CI/CD, ArgoCD, Kubernetes, Docker.

Процесс CI (Continuous Integration):

  1. Разработчик создает merge request (MR) в main.
  2. Запускается пайплайн CI:

    • Сборка: Создается Docker-образ приложения. Использую многоступенчатую сборку для уменьшения размера финального образа.
      
      # Stage 1: Build
      FROM golang:alpine AS builder
      WORKDIR /app
      COPY . .
      RUN go build -o myapp .

    Stage 2: Runtime

    FROM alpine:latest COPY --from=builder /app/myapp . CMD ["./myapp"]

    
    *   **Статический анализ кода (SAST):** Запускаю `gosec`, `hadolint` (для Dockerfile), `checkov` (для Terraform).
    *   **Тестирование:** Запускаются юнит-тесты и интеграционные тесты в контейнере.
    *   **Сканирование зависимостей:** Использую `trivy` для проверки образа на уязвимости (CVE).
    *   **Публикация артефакта:** Успешно собранный и протестированный образ с тегом, соответствующим хешу коммита, пушится в Container Registry (GitLab Registry, Harbor).

Процесс CD (Continuous Deployment): Я применяю GitOps с помощью ArgoCD. Манифесты Kubernetes (Helm charts или kustomize) хранятся в отдельном Git-репозитории.

  1. После мержа MR в main CI-пайплайн обновляет манифесты в Git-репозитории инфраструктуры, указывая на новый образ (например, меняет tag в values.yaml Helm chart).
  2. ArgoCD, который установлен в кластере Kubernetes, постоянно отслеживает этот репозиторий. Обнаружив расхождение (желаемое состояние в Git vs. текущее состояние в кластере), он автоматически синхронизирует (деплоит) новую версию приложения.
  3. Стратегия деплоя: Использую Canary или Blue-Green развертывание через Argo Rollouts или Service Mesh (Istio). Это позволяет направлять часть трафика на новую версию, проверять метрики (латентность, ошибки) и только затем переключать весь трафик.
  4. Мониторинг деплоя: Пайплайн проверяет health checks (readiness/liveness probes) и ключевые бизнес-метрики после деплоя. В случае проблем автоматически запускается откат (rollback) к предыдущей стабильной версии.

Итог: Полностью автоматизированный путь от кода до продакшена с контролем качества и возможностью мгновенного отката.