Что такое CI/CD?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 Actions | CI/CD для GitHub репозиториев |
| GitLab CI/CD | CI/CD для GitLab |
| Jenkins | Self-hosted CI/CD сервер |
| CircleCI | Cloud-based CI/CD |
| Travis CI | CI для GitHub (устаревает) |
| Docker | Контейнеризация приложения |
| Kubernetes | Оркестрация контейнеров |
| Dokku | Простой PaaS для деплоя |
Best Practices
✓ Тесты должны выполняться за < 5 минут ✓ Коммит = одна атомарная задача ✓ Каждый PR = код review перед merge ✓ Разделяйте CI и CD (тесты и развёртывание) ✓ Всегда есть возможность rollback ✓ Логируйте deployments ✓ Мониторьте production после каждого deploy
Итог
CI/CD — это не просто инструмент, это философия разработки. Она избавляет от ночных деплоев, паники и срочных исправлений. С CI/CD разработчики могут push'ить код часто (даже несколько раз в день) и быть уверены, что всё работает правильно.