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

«В чем разница между Continuous Delivery и Continuous Deployment?» — вопрос из категории DevOps, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Continuous Delivery (Непрерывная поставка) и Continuous Deployment (Непрерывное развертывание) — это этапы автоматизации pipeline, отличающиеся степенью автоматизации релиза.

Определения:

  • Continuous Delivery: Код автоматически проходит сборку, тестирование и упаковку, после чего готов к ручному развертыванию в production. Решение о релизе принимает человек.
  • Continuous Deployment: Полная автоматизация. После успешного прохождения всех этапов pipeline код автоматически развертывается в production без ручного вмешательства.

Ключевое отличие: Наличие ручного шлюза (manual gate) перед production.

Визуализация процесса:

Develop -> CI (Build/Test) -> Staging Environment
                                    │
           Continuous Delivery ─────┤ (Ручное одобрение)
                                    ↓
                           Production Environment
                                    │
           Continuous Deployment ───┘ (Автоматически)

Пример настройки в GitHub Actions:

name: CI/CD Pipeline
on: [push]

jobs:
  test-and-build:
    runs-on: macOS-latest
    steps:
      - name: Run Tests
        run: xcodebuild test -scheme MyApp

  # Continuous Delivery Stage (ручной триггер)
  deliver-to-testflight:
    needs: test-and-build
    if: github.ref == 'refs/heads/main'
    runs-on: macOS-latest
    steps:
      - name: Upload to TestFlight
        run: fastlane pilot upload # Требует ручного подтверждения в App Store Connect

  # Continuous Deployment Stage (автоматический)
  deploy-to-enterprise:
    needs: test-and-build
    if: github.ref == 'refs/heads/auto-release'
    runs-on: macOS-latest
    steps:
      - name: Deploy to Enterprise Distribution
        run: fastlane deploy # Автоматически распространяет билд

Выбор стратегии:

  • Delivery подходит для приложений, где требуется контроль над временем релиза (например, мобильные приложения в магазинах).
  • Deployment используется для сервисов, веб-приложений или внутренних инструментов, где важна скорость обновлений.