Что такое 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

Ответ 18+ 🔞

А, слушай, смотри, вот эта вся хуйня про CI/CD, которую все так любят впаривать на собесах. Ну, типа, непрерывная интеграция и доставка, блядь. Суть-то простая, как три копейки, но её так заумно обзывают, что народ пугается, аж волнение ебать.

Представь, у тебя команда, как стая мартышлюшек, каждая в свой угол кода хуярит. А потом надо всё это собрать в одну кучу, да так, чтобы не взорвалось. Вот Continuous Integration (CI) — это как раз про то, чтобы постоянно эту кучу собирать и проверять, не накосячил ли кто. Залил код в общую ветку — тут же система его хватает, собирает и тесты гоняет. Если тесты не прошли — сразу всем видно, кто тут, блядь, ломатель. Цель — не доводить до такого, когда через месяц выясняется, что твой код с кодом соседа, как хуй с винтом, не совместимы.

Дальше идёт Continuous Delivery (CD). Это когда твой код, который уже собрался и все тесты прошёл, автоматически закатывается на какой-нибудь тестовый стенд, почти как на боевой. Но! Ключевое слово — почти. Чтобы запулить это всё на реальных пользователей, нужно ручное подтверждение. Типа, начальник или тимлид смотрит и говорит: «Ну ладно, хуй с ним, давай». Это для осторожных, чтобы не выкатить какую-нибудь дичь по пятницам.

А есть ещё Continuous Deployment — это уже для отчаянных, у кого терпения ноль ебать. Тут всё то же самое, но ручного подтверждения нет. Прошёл код все проверки — система сама, без спросу, выкатывает его в продакшн. Прямо пользователям в лоб. Красота, да? Но и ответственность, блядь, овердохуища. Надо чтобы тесты были охренительные, а не так, «ну вроде работает».

Вот смотри, табличка, чтобы совсем мозг не ебал:

Критерий Continuous Delivery Continuous Deployment
Выкатка в продакшн Только после ручного «окей» Автоматом, как по маслу
Зачем Чтобы всегда была готовая версия, но с тормозом Чтобы пользователи получали фичи быстрее, чем успевают соскучиться

Ну и примерчик, как это выглядит в жизни. Допустим, используем GitHub Actions. Создаёшь файлик .github/workflows/ci.yml и пишешь туда инструкцию, что делать системе, когда ты заливаешь код.

# .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

Вот и вся магия. Написал один раз — и потом система сама, как хитрая жопа, за каждым твоим коммитом бегает и проверяет, не обосрался ли ты. Удобно, чё. Главное — тесты писать, а не надеяться на «авось пронесёт».