Как реализовать CI/CD для Python микросервисов?
Что проверяют
Понимаете ли вы конвейер целиком: что проверяется на каждом коммите, как собирается и версионируется образ, как сервис выкатывается и откатывается. Следом обычно спрашивают, что вы делаете с миграциями базы при деплое и как не пересобирать двадцать сервисов из-за правки в одном.
Как отвечать
Опишите этапы и привяжите их к инструментам, с которыми работали (GitLab CI, GitHub Actions, Jenkins):
- проверки на каждый merge request:
ruffдля линтинга и форматирования,mypyдля типов,pytestс отчётом покрытия. Зависимости фиксируются lock-файлом (uv.lock,poetry.lock) и кешируются между прогонами; - сборка образа: multi-stage
Dockerfileна slim-образе, тестовые зависимости в итоговый образ не попадают. Тег это SHA коммита или версия, неlatest: иначе непонятно, что сейчас запущено, и откатываться не на что; - безопасность:
pip-auditпо зависимостям, Trivy по образу, секреты только в переменных CI или Vault; - деплой: Helm-чарт или Kustomize, всё чаще через GitOps (Argo CD, Flux). CI обновляет тег образа в репозитории манифестов, кластер подтягивает изменения сам;
- выкатка и откат: rolling update с readiness-пробами, для рискованных изменений canary. Откат через
helm rollbackили revert коммита в GitOps-репозитории; - после деплоя: smoke-тесты на стейдже, затем продвижение того же образа в прод без пересборки.
Для микросервисов добавьте две вещи. В монорепозитории пайплайн запускается только для изменившихся сервисов (rules: changes в GitLab, paths в GitHub Actions). Совместимость между сервисами держат контрактными тестами, например Pact, иначе зелёный сервис ломает соседа.
Миграции Alembic выполняются отдельным шагом до выкатки и пишутся обратно совместимыми: старая версия кода должна работать с новой схемой, пока идёт rolling update.
Где спотыкаются
Гоняют pytest внутри продового образа. Туда приходится тащить тестовые зависимости, и образ раздувается.
Собирают образ заново для каждого окружения. Тогда в прод уходит не то, что проверили на стейдже.
Не думают про откат: деплой есть, а вернуть прошлую версию можно только руками, особенно если миграция уже удалила колонку.