Что такое CI/CD и как это работает?

Ответ

CI/CD — это методология и набор практик в разработке ПО, направленные на автоматизацию сборки, тестирования и развертывания приложений. Это позволяет командам выпускать качественный софт быстрее и надёжнее.

CI (Continuous Integration — Непрерывная интеграция)

Это практика частой автоматической интеграции кода от разных разработчиков в общую кодовую базу.

  • Цель: Раннее обнаружение конфликтов слияния, ошибок компиляции и багов в тестах.
  • Процесс:
    1. Разработчик отправляет (push) изменения в свою ветку.
    2. Создает Pull/Merge Request в основную ветку (main или develop).
    3. Система CI автоматически запускает сборку проекта, прогоняет линтеры и юнит-тесты.
    4. Если все проверки пройдены, код можно безопасно вливать.

CD (Continuous Delivery / Deployment — Непрерывная доставка / развертывание)

Это следующий шаг после CI, который автоматизирует выпуск готового продукта.

  • Цель: Сделать процесс релиза быстрым, надёжным и предсказуемым.

  • Процесс:

    1. После успешного прохождения CI создаётся артефакт (например, бинарный файл Go или Docker-образ).
    2. Этот артефакт автоматически развертывается на тестовое (staging) окружение для дальнейшего тестирования (интеграционного, E2E).
  • Continuous Delivery (Непрерывная доставка): После всех тестов релиз в production требует ручного подтверждения (нажатия кнопки).

  • Continuous Deployment (Непрерывная развертывание): Релиз в production происходит полностью автоматически без вмешательства человека, если все этапы пройдены успешно.

Пример простого CI-пайплайна для Go в .github/workflows/ci.yml:

name: Go CI

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 1. Получаем исходный код
      - uses: actions/checkout@v4

      # 2. Устанавливаем нужную версию Go
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21'

      # 3. Запускаем тесты
      - name: Test
        run: go test -v ./...

      # 4. Собираем приложение
      - name: Build
        run: go build -v -o myapp ./cmd/server

Ответ 18+ 🔞

Давай я тебе на пальцах объясню, что это за зверь такой — CI/CD. Представь, что ты пишешь код, а потом тебе надо его куда-то засунуть, чтобы он работал. Без CI/CD это выглядит как поход в лес срать: долго, неудобно, и можно наступить в говно.

CI (Continuous Integration — Непрерывная интеграция)

Это когда твои потуги в коде постоянно и автоматически проверяются, чтобы не вышло как в том анекдоте: «Один чувак написал, второй переписал, а третий пришёл — нихуя не работает, все друг друга обвиняют».

  • Суть: Ты отправил код в общую кучу (репозиторий), а система тут же, как злая училка, начинает его проверять: компилируется ли? Тесты проходят? Другим код не сломала? Если всё ок — можно сливать. Если нет — получаешь по шапке сразу, а не через месяц на проде.
  • Процесс, ёпта:
    1. Ты запилил фичу и толкаешь её в свою ветку.
    2. Создаёшь пулл-реквест, типа «эй, народ, гляньте, какую хуйню я написал».
    3. Система CI автоматом собирает проект, прогоняет тесты и линтеры.
    4. Если зелёная галочка — можно вливать, не стесняясь. Если красный крест — сиди, мудак, исправляй.

CD (Continuous Delivery / Deployment — Непрерывная доставка / развёртывание)

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

  • Цель: Чтобы релиз был не как полёт в космос с молитвами, а как поход в туалет — быстро и без сюрпризов.
  • Процесс:
    1. После CI у тебя есть готовый артефакт — собранная программа или Docker-образ.
    2. Этот артефакт автоматом выкатывается на тестовое окружение (staging), где его ещё потыкают палкой.
  • Вот тут тонкость, блядь:
    • Continuous Delivery (Доставка): Всё автоматически докатилось до самого края — до кнопки «Выпустить в продакшен». Но чтобы нажать эту кнопку, нужен человек. Для трусов.
    • Continuous Deployment (Развёртывание): А вот это для отбитых. Если все тесты прошли — система, не спросив ни у кого разрешения, сама выкатывает твой код на боевые сервера. Проснулся утром — а твой код уже работает. Или не работает. Но это уже твои проблемы, чувак.

Пример простейшего CI-пайплайна для Go (файл .github/workflows/ci.yml):

Смотри, как это выглядит под капотом. Код не трогаю, он святой.

name: Go CI

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 1. Выкачиваем код из гита
      - uses: actions/checkout@v4

      # 2. Ставим Go нужной версии
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.21'

      # 3. Гоняем тесты. Если упадут — всё, пиши пропало.
      - name: Test
        run: go test -v ./...

      # 4. Собираем бинарь на всякий случай
      - name: Build
        run: go build -v -o myapp ./cmd/server

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