Как был устроен CI/CD на последнем проекте?

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

Ответ

На последнем проекте мы построили GitOps-ориентированный CI/CD пайплайн на базе GitLab CI и Argo CD для Kubernetes.

Архитектура и принципы:

  • Инфраструктура как код (IaC): Вся инфраструктура (K8s кластер, сети, БД) описывалась в Terraform, конфигурации приложений — в Helm-чартах.
  • GitOps: Argo CD автоматически синхронизировал состояние кластера с декларативными манифестами в Git-репозитории. Изменение в main ветке = триггер на обновление в кластере.
  • Многоступенчатый пайплайн:

Этапы GitLab CI/CD (.gitlab-ci.yml):

stages:
  - test
  - build
  - security-scan
  - deploy-to-staging
  - integration-test
  - deploy-to-production

# 1. Тестирование
unit-test:
  stage: test
  image: golang:1.19
  script:
    - go test ./... -v

# 2. Сборка и сканирование образа
build-and-scan:
  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
    # Сканирование на уязвимости (Trivy)
    - docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image --exit-code 1 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

# 3. Деплой в staging (через обновление манифестов в Git)
deploy-staging:
  stage: deploy-to-staging
  script:
    # Обновляем версию образа в Helm-чарте для staging
    - sed -i "s|tag: .*|tag: $CI_COMMIT_SHA|" ./charts/myapp/values-staging.yaml
    - git add . && git commit -m "Deploy $CI_COMMIT_SHA to staging"
    - git push origin HEAD:main
  only:
    - main
  environment:
    name: staging
    url: https://staging.myapp.com

# 4. Интеграционные тесты в staging
run-integration-tests:
  stage: integration-test
  script:
    - ./scripts/run-integration-tests.sh https://staging.myapp.com

# 5. Промоушен в prod (ручное подтверждение + canary)
deploy-production:
  stage: deploy-to-production
  script:
    - echo "Promoting $CI_COMMIT_SHA to production via Argo CD Rollout"
  when: manual  # Требует ручного подтверждения
  environment:
    name: production
    url: https://myapp.com

Роль Argo CD: После пуша в main Argo CD автоматически подхватывал изменения в Helm-чартах и применял их к кластеру. Для production мы использовали Argo Rollouts с canary-стратегией: сначала 10% трафика шло на новую версию, и после успешных проверок по метрикам (Prometheus) происходил полный rollout.