Основы окружений
~30 мин

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 }}

💡 Как это в реальной работе

Утро: git checkout -b feature/new-model, пишешь код. git commit — pre-commit прогоняет ruff и mypy. Пушишь, создаёшь PR. GitHub Actions запускает тесты, проверяет качество модели. Коллега делает ревью. Merge в main → Docker-образ собирается, деплоится на staging. Smoke tests проходят → production. Руками — ноль шагов.

🎯 На собесе

Как устроен CI/CD у вас? Хороший ответ: push → pre-commit (локально) → PR → CI: lint + tests + type check + model quality gate → code review → merge → автосборка Docker → push в registry → деплой на staging → smoke tests → production. Всё автоматически, руками ничего не делаем.