← Назад к вопросам

Что такое CI/CD?

2.0 Middle🔥 81 комментариев
#Python Core#Soft Skills#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

CI/CD: Непрерывная интеграция и развёртывание

Определение

CI/CD — это методология автоматизации разработки:

  • CI (Continuous Integration) — непрерывная интеграция кода
  • CD (Continuous Delivery/Deployment) — непрерывная доставка или развёртывание

Проблема, которую решает CI/CD

Без CI/CD (старый подход)

Разработчик 1 пишет код      Разработчик 2 пишет код      Разработчик 3 пишет код
         ↓                             ↓                             ↓
    Все файлы слиты вместе (merge) в конце недели
         ↓
    Разбор конфликтов (часами)
         ↓
    Нужно перепроверить ВСЁ
         ↓
    Баги выявляются позже (когда дорого их чинить)

Результат: интеграция — это ад, которого все боятся.

С CI/CD (современный подход)

Разработчик 1 push → автотест → линтер → деплой на staging
Разработчик 2 push → автотест → линтер → деплой на staging
Разработчик 3 push → автотест → линтер → деплой на staging

Всё автоматизировано, конфликты выявляются сразу!

Continuous Integration (CI)

Что происходит при каждом push

Разработчик push на main
        ↓
[Автоматически]
1. Запуск unit-тестов
2. Запуск интеграционных тестов
3. Проверка линтера (стиль кода)
4. Проверка типов (mypy, pyright)
5. Проверка security (bandit)
6. Проверка покрытия (coverage > 80%?)
        ↓
Если всё OK → merge разрешён
Если ОШИБКА → merge запрещён, разработчик должен чинить

Пример CI конфига (GitHub Actions)

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

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      # 1. Checkout кода
      - uses: actions/checkout@v3
      
      # 2. Установить Python
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      
      # 3. Установить зависимости
      - run: pip install -r requirements.txt
      
      # 4. Запустить тесты
      - run: pytest --cov=app --cov-report=xml
      
      # 5. Проверка качества кода
      - run: ruff check .
      - run: mypy app/
      - run: bandit -r app/
      
      # 6. Проверка покрытия
      - run: coverage report --fail-under=80
      
      # 7. Загрузить результаты
      - uses: codecov/codecov-action@v3

Преимущества CI

✓ Баги выявляются сразу, а не в конце ✓ Конфликты merge решаются быстро ✓ Каждый commit имеет гарантию качества ✓ Разработчики не боятся pull request'ов ✓ История проекта чистая и надёжная

Continuous Delivery и Continuous Deployment (CD)

Различие

Continuous Delivery (CD):

Код прошёл CI → автоматически собран → готов к развёртыванию
(но развёртывание на prod — вручную, когда нужно)

Continuous Deployment:

Код прошёл CI → автоматически собран → автоматически развёрнут на prod
(полная автоматизация)

Пример CD конфига (GitHub Actions + Dokku)

# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      # Сборка Docker образа
      - name: Build Docker image
        run: |
          docker build -t myapp:${{ github.sha }} .
      
      # Push на registry
      - name: Push to Docker Registry
        run: |
          docker tag myapp:${{ github.sha }} myregistry/myapp:latest
          docker push myregistry/myapp:latest
      
      # Развёртывание на сервер
      - name: Deploy to production
        run: |
          git push dokku main
        env:
          DOKKU_SSH_KEY: ${{ secrets.DOKKU_SSH_KEY }}

Pipeline развёртывания

Local commit
    ↓
Push на GitHub
    ↓
[GitHub Actions]
1. Запуск тестов
2. Сборка Docker образа
3. Push на Docker Registry
    ↓
[Когда всё OK]
1. Развёртывание на staging
2. Smoke тесты на staging
    ↓
[Когда staging OK]
1. Развёртывание на production
2. Health check production
    ↓
[Если что-то сломалось]
1. Автоматический rollback

Практический пример: Python проект

Структура проекта

my_project/
├── app/
│   ├── __init__.py
│   ├── main.py
│   └── utils.py
├── tests/
│   ├── test_main.py
│   └── test_utils.py
├── .github/workflows/
│   ├── ci.yml
│   └── deploy.yml
├── Dockerfile
├── requirements.txt
├── pytest.ini
├── pyproject.toml
└── README.md

pyproject.toml с конфигом для CI

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "--cov=app --cov-report=term-missing --cov-fail-under=80"

[tool.ruff]
line-length = 100
select = ["E", "F", "W"]

[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_configs = true

Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN pytest --cov=app --cov-fail-under=80

CMD ["python", "-m", "app.main"]

Как работает CI/CD для этого проекта

1. Разработчик push код на GitHub
         ↓
2. GitHub Actions запускает .github/workflows/ci.yml
         ↓
3. Тесты, линтер, mypy, coverage — всё проверяется
         ↓
4a. Если FAIL → PR получает "red X", merge запрещён
4b. Если OK → PR получает "green check"
         ↓
5. После merge на main
         ↓
6. GitHub Actions запускает .github/workflows/deploy.yml
         ↓
7. Docker образ собирается и развёртывается на staging
         ↓
8. Smoke тесты проходят на staging
         ↓
9. После одобрения → развёртывание на production

Инструменты для CI/CD

ИнструментНазначение
GitHub ActionsCI/CD для GitHub репозиториев
GitLab CI/CDCI/CD для GitLab
JenkinsSelf-hosted CI/CD сервер
CircleCICloud-based CI/CD
Travis CICI для GitHub (устаревает)
DockerКонтейнеризация приложения
KubernetesОркестрация контейнеров
DokkuПростой PaaS для деплоя

Best Practices

✓ Тесты должны выполняться за < 5 минут ✓ Коммит = одна атомарная задача ✓ Каждый PR = код review перед merge ✓ Разделяйте CI и CD (тесты и развёртывание) ✓ Всегда есть возможность rollback ✓ Логируйте deployments ✓ Мониторьте production после каждого deploy

Итог

CI/CD — это не просто инструмент, это философия разработки. Она избавляет от ночных деплоев, паники и срочных исправлений. С CI/CD разработчики могут push'ить код часто (даже несколько раз в день) и быть уверены, что всё работает правильно.