На каком этапе CI/CD пайплайна подготавливается инфраструктура для развертывания приложения?

«На каком этапе CI/CD пайплайна подготавливается инфраструктура для развертывания приложения?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Подготовка инфраструктуры (Provisioning) обычно выполняется до основного CI/CD пайплайна приложения или в его отдельной, выделенной стадии, часто называемой infrastructure или deploy-infra. Это делается для разделения ответственности и повышения стабильности: инфраструктура должна быть готова и проверена до попыток деплоя кода.

Типичный подход "Инфраструктура как код" (IaC):

  1. Отдельный пайплайн/репозиторий: Инфраструктура (VPC, сети, кластер Kubernetes, базы данных) описывается в коде (Terraform, CloudFormation) и разворачивается через свой собственный CI/CD пайплайн. Изменения в инфраструктуре проходят свой код-ревью и план применения.
  2. Стадия в основном пайплайне: В некоторых подходах стадия подготовки инфраструктуры (например, создание/обновление временного окружения для тестирования) может быть частью основного пайплайна приложения.

Пример структуры пайплайна GitLab CI для приложения в K8s:

stages:
  - build
  - test
  - deploy-infra  # Стадия подготовки инфраструктуры
  - deploy-app    # Стадия деплоя приложения

# 1. Сборка и тесты приложения
build-and-test:
  stage: build
  script: ...

# 2. ПОДГОТОВКА ИНФРАСТРУКТУРЫ: Развертывание/обновление манифестов K8s
deploy_kubernetes_infra:
  stage: deploy-infra
  script:
    - kubectl apply -f k8s/namespace.yaml
    - kubectl apply -f k8s/configmap.yaml
    - kubectl apply -f k8s/secrets.yaml
  only:
    - main  # Инфраструктура обновляется только при мерже в main

# 3. ДЕПЛОЙ ПРИЛОЖЕНИЯ: Развертывание самого приложения в подготовленную инфраструктуру
deploy_application:
  stage: deploy-app
  script:
    - kubectl set image deployment/my-app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  needs: ["deploy_kubernetes_infra"] # Зависит от успешного выполнения стадии инфраструктуры

Ключевые инструменты: Terraform, Pulumi, AWS CloudFormation, Ansible для provisioning; kubectl, Helm — для настройки ресурсов внутри Kubernetes.