В чем разница между Continuous Delivery и Continuous Deployment в CI/CD?

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

Ответ

Continuous Delivery (Непрерывная поставка) — это практика, при которой код автоматически проходит весь цикл сборки, тестирования и подготовки к релизу, но развертывание в production выполняется вручную (например, по нажатию кнопки). Основная цель — гарантировать, что в любой момент времени существует готовый к релизу артефакт.

Continuous Deployment (Непрерывное развертывание) — это следующий шаг, при котором каждое успешное изменение, прошедшее пайплайн, автоматически развертывается в production без какого-либо ручного вмешательства. Это требует исключительно надежного и всеобъемлющего процесса тестирования.

Проще говоря:

  • Continuous Delivery: «Мы можем выпустить новую версию в любой момент одним кликом.»
  • Continuous Deployment: «Каждая успешная сборка автоматически становится новой версией для пользователей.»

Практическая реализация в пайплайне (на примере GitLab CI):

# Общие стадии для обоих подходов
stages:
  - build
  - test
  - deploy-staging
  # Ключевое отличие в стадии deploy-production

# Continuous Delivery: ручной триггер для продакшена
deploy_prod_manual:
  stage: deploy-production
  script:
    - echo "Deploying to production..."
    - ./deploy.sh production
  environment: production
  when: manual # <-- Ручной запуск! Это Continuous Delivery.
  only:
    - main

# Continuous Deployment: автоматический деплой
deploy_prod_auto:
  stage: deploy-production
  script:
    - echo "Automatically deploying to production..."
    - ./deploy.sh production
  environment: production
  when: on_success # <-- Автоматически после успеха предыдущих стадий! Это Continuous Deployment.
  only:
    - main

Из моего опыта: В большинстве корпоративных сред начинают с Continuous Delivery, так как это дает командам уверенность и контроль над моментом релиза, особенно когда требуются согласования или синхронизация с другими сервисами. Continuous Deployment — это идеал, к которому стремятся, и он отлично работает в проектах с сильной культурой тестирования (обилие unit, интеграционных, e2e-тестов) и возможностью быстрого отката (например, через feature flags или blue-green deployments).