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