Git + CI/CD
Branching стратегии, merge, GitHub Actions, pre-commit хуки, автоматизация.
Git + CI/CD — автоматизация, чтобы не деплоить руками в пятницу вечером
Загрузка интерактивного виджета...
Git — не просто «сохранить код». Это система, которая позволяет нескольким людям работать над одним проектом, не ломая друг другу код. А CI/CD — автоматизация поверх Git: при каждом push запускаются тесты и линтеры, при merge в main — автосборка Docker-образа и деплой. Без этого — ручные деплои, «кто сломал прод?» и хаос.
Как организовать ветки
Для ML-команды из 3-10 человек лучше всего работает GitHub Flow — простой и понятный. Основная ветка main всегда рабочая. Для новой фичи создаёшь ветку (feature/add-catboost-model), пишешь код, пушишь, создаёшь Pull Request. Коллега делает ревью, CI прогоняет тесты, после merge в main — автодеплой.
- GitHub Flow — main + short-lived feature branches + PR + merge. Золотая середина для ML-команд
- Trunk-based development — одна main, ветки живут 1-2 дня максимум. Для команд с непрерывным деплоем
- Git Flow — main + develop + feature/* + release/*. Сложнее, подходит для релизных циклов (раз в 2 недели)
Conventional Commits и pre-commit
Вместо коммитов «fix» и «update 2» используй структурированные сообщения: feat: add feature importance plot, fix: resolve OOM in batch prediction, ci: add model quality test. Через полгода откроешь git log и поймёшь, что происходило. А pre-commit запускает линтеры и форматтеры автоматически перед каждым git commit — ruff для линтинга, mypy для типов, проверка на большие файлы. Если что-то не так — коммит не пройдёт.
GitHub Actions — CI/CD для ML-проекта
GitHub Actions — бесплатный CI/CD для публичных репозиториев. Описываешь пайплайн в YAML-файле, GitHub запускает его на каждый push или PR. Для ML-проекта минимум: lint (ruff) + type check (mypy) + unit tests (pytest). Дополнительно: quality gate (AUC не упал ниже порога), integration test (API отвечает на тестовые запросы). Тяжёлые тренировки — на GPU-runner или weekly job.
# .github/workflows/ci.yml
name: ML Pipeline CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
lint-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install uv && uv sync
- run: uv run ruff check .
- run: uv run mypy src/
- run: uv run pytest tests/ -v --cov=src/CD — автоматический деплой при merge
Когда код смержен в main и тесты прошли — CI автоматически собирает Docker-образ, пушит его в registry (GitHub Container Registry, AWS ECR) и деплоит. Ни одного ручного шага. Для ML добавляется шаг model quality: скрипт тренирует модель на тестовых данных и проверяет, что AUC не упал ниже порога. Если упал — merge блокируется.
# .github/workflows/deploy.yml — автодеплой при merge в main
name: Deploy Model
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t ml-model:{{ github.sha }} .
- run: |
echo {{ secrets.REGISTRY_TOKEN }} | docker login ghcr.io -u {{ github.actor }} --password-stdin
docker tag ml-model:{{ github.sha }} ghcr.io/{{ github.repository }}/ml-model:{{ github.sha }}
docker push ghcr.io/{{ github.repository }}/ml-model:{{ github.sha }}
- run: kubectl set image deployment/ml-model model=ghcr.io/{{ github.repository }}/ml-model:{{ github.sha }}💡 Как это в реальной работе
🎯 На собесе
Материалы
Официальный туториал по GitHub Actions.
Подробная статья на русском с примерами.
Официальная документация pre-commit.
Полный курс GitHub Actions.