Что такое CI/CD и в чем разница между Continuous Delivery и Deployment

Ответ

CI/CD (Continuous Integration / Continuous Delivery / Continuous Deployment) — это методология и набор практик для автоматизации этапов разработки, сборки, тестирования и выпуска программного обеспечения. Основная цель — сделать релизы быстрыми, частыми и надежными.

Составляющие CI/CD

  • Continuous Integration (CI, Непрерывная интеграция) Это практика регулярного слияния изменений кода от нескольких разработчиков в единый центральный репозиторий. После каждого слияния автоматически запускается сборка и набор тестов (unit-тесты, интеграционные тесты) для быстрого обнаружения ошибок.

  • Continuous Delivery (CD, Непрерывная доставка) Это расширение CI, при котором код, успешно прошедший все тесты, автоматически готовится к релизу и развертывается в тестовое или staging-окружение. Финальное развертывание на production-сервер требует ручного подтверждения.

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

Ключевое различие

Критерий Continuous Delivery Continuous Deployment
Деплой в Production Требует ручного одобрения Полностью автоматический
Цель Всегда иметь готовую к релизу версию Максимально быстро доставлять изменения пользователям

Пример простого CI-пайплайна (GitHub Actions)

Этот .yml файл описывает шаги для автоматической проверки кода при каждом push в репозиторий.

# .github/workflows/ci.yml
name: Basic CI Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      # 1. Получаем исходный код репозитория
      - name: Checkout code
        uses: actions/checkout@v4

      # 2. Настраиваем окружение Python
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'

      # 3. Устанавливаем зависимости
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      # 4. Запускаем тесты
      - name: Run tests with pytest
        run: |
          pytest