Что такое pre-commit hooks для Git и зачем они нужны
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Доброго времени суток, сегодня я хочу вам рассказать о том, что такое pre-commit hooks для системы контроля версий Git.
Итак, для начала нам надо разобраться с тем, что такое pre-commit hooks. В системе контроля версий Git есть специальный механизм для запуска скриптов и/или команд по определенному событию (см. рисунок ниже), благодаря которому мы можем автоматизировать некоторые рутинные операции.
Допустим, что перед каждым commit мы должны выполнять следующие шаги:
- Переформатирование кода, согласно правилам форматирования кода (black).
- Удаление неиспользуемых импортов библиотек и неиспользуемых переменных (autoflake).
- Апгрейд кода под новый стиль написания, который добавлен в новых версиях языка (pyupgrade).
- Переформатирование импортов согласно правил форматирования (reorder-python-imports).
- Проверить все переформатирования на соответствие стандартам форматирования (flake8).
- Запуск тестов.
Исходя из количества степов, легко забыть что-то из перечня. Ну что же, давайте автоматизировать!
Из всех хуков, которые предоставляет система контроля версий GIT (см. рисунок выше) нам больше всего подходит pre-commit hook на это событие мы и будем подписываться.
Для упрощения конфигурации я буду использовать пакет pre-commit который предоставляет удобные конфиги в формате YAML.
Далее, нам необходимо создать файл .pre-commit-config.yml
в корневом каталоге нашего проекта, рядом с папкой .git .
Давайте разберем конфиг на примере первой задачи «Переформатирование кода, согласно правилам форматирования кода».
- repo: local hooks: - id: black name: black entry: black language: system types: [python] args: [--line-length=200, --target-version=py37]
- repo — репозиторий для которого будет отрабатывать данный хук, в нашем примере — это локальный репозиторий
- hooks — перечень хуков которые будут отрабатывать для репозитория обозначенного выше.
- id — идинтификатор хука, должен быть уникальным среди всех хуков в репозитории
- name — имя хука, должно быть уникальным среди всех хуков репозитория
- entry — команда или скрипт, который должен быть запущен по событию, в нашем случае это команда black
- language — язык, при помощи которого этот хук будет установлен, в нашем случае это system, так как после установки black становиться системной командой
- types — тип файла к которому данный хук должен быть применен, в нашем случае это python файлы
- args — дополнительные параметры запуска команды которую мы обозначили в entry
Таким образом, у нас получился небольшой, компактный конфиг для нашего pre-commit hook. Но одного конфига мало для того, чтобы это заработало, после того как с конфигом мы закончили необходимо выполнить интеграцию (инсталляцию) всех наших хуков непосредственно в репозиторий. Для этого используем команду:
pre-commit install
Полный конфиг для нашей задачи будет выглядеть так:
- repo: local hooks: - id: black name: black entry: black language: system types: [python] args: [--line-length=200, --target-version=py37] - id: autoflake name: autoflake entry: autoflake language: system types: [python] args: [--in-place, --remove-all-unused-imports, --remove-duplicate-keys] - id: pyupgrade name: pyupgrade entry: pyupgrade language: system types: [python] args: [--py37-plus] - id: reorder-python-imports name: reorder-python-imports entry: reorder-python-imports language: system types: [python] args: [--py37-plus] - id: flake8 name: flake8 entry: flake8 language: system types: [python] args: [--max-line-length=200] - id: tests name: Run tests entry: "source .env/bin/activate && python -m pytest -v tests" language: system verbose: true
Так же важно понимать, что при commit хуки применяются не ко всем файлам в проекте, а только к тем, которые попали в commit, то есть те, которые были изменены или добавлены.
Из плюсов можно выделить следующее:
- Автоматизация рутины
- Сокращение количества фейлов на CI/CD
- Удобство в использовании
- Единоразовая настройка
Из минусов:
- Возрастает время на создание комита
- Для больших проектов тесты могут бежать довольно долго
На этом всё. Спасибо, что дочитали до конца, надеюсь, это было полезно для Вас!
37 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів