Использование pre-commit
Если кто-то ещё не использует, советую попробовать внедрить такой инструмент как pre-commit.
Зачем?
Позволяет автоматически запускать проверки кода, линтеры, авто тесты локально перед коммитом.
Плюсы:
- Дешевле во всех смыслах (Чем полноценный CI)
- Устраняем человеческий фактор, да можно отключить, но в целом проверка автоматизировна
- Код становится чище и легче в поддержке
- Дополнительные Quality Gate на стороне разработчика
- Дополнительная уверенность что всё ок (при хорошем покрытии тестами)
Минусов за время использования не заметил, только если то, что требуется время на внедрение в проект и в команду для наибольшей выгоды. Например, на одном из хакатонов, мы его отключали чтобы не тормозить разработку, но там другие критерии и основной - скорость.
Установка
Установка достаточно простая (можно в виртуальном окружении):
pip install pre-commit
Установка git hook из корня репозитория
pre-commit install
И конфигурационный файл: .pre-commit-config.yaml
Пример:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-xml
- id: check-ast
- id: check-json
- id: check-added-large-files
- repo: https://github.com/PyCQA/flake8
rev: 4.0.1
hooks:
- id: flake8
args: [--max-line-length=120]
Всё, после этого после commit-а будут прогоняться указанные вами проверки только на тех файлах которые вы меняли.
Список доступных hooks можно посмотреть здесь
Оптионально, можно сразу прогнать на всех файлах:
pre-commit run --all-files
НО, если проект большой, то это приведёт к большому числу изменений. Надо смотреть по ситуации.
Рецепты
Python
Пример, с запуском python юнит тестов через pytest (запускаются все тесты, даже если не меняли их) можно найти здесь
Так же используется:
- black (автоматически форматирует код)
- isort (расставляет импорты в порядке)
Но тоже надо смотреть по ситуации, иногда творится уже совсем настоящая магия и лучше её избегать, может быть непредсказуемый результат в итоге.
На последних проектах, я их не использую.
Python unit tests in Docker
Для запуска тестов в docker image:
- поменять как минимум
<working_dir>
и<docker_image>
в entry. - Настроить запуск тестов под себя
Пример:
repos:
- repo: local # Use a local repository
hooks:
- id: docker-pytest
name: pytest
language: docker_image
entry: --entrypoint "/bin/bash" -v "pwd":/<working_dir> --user root <docker_image> -c "pytest -v tests/"
pass_filenames: false
always_run: true
verbose: true