pre-commit

Я и моя команда столкнулись с проблемой, когда нарушения соглашений по Code Style стали выявляться достаточно поздно: в CI или на Code Review. Общей настройки .editorconfig нам было явно недостаточно, так как сам по себе editorconfig не может описать полностью все нюансы форматирования.

Очевидным и общеизвестным решением здесь является проверка кода до передачи в систему контроля версий. Все прекрасно знают о хуках в git, однако за последние несколько лет не встречал команд, которые активно бы их использовали.

На мой взгляд, есть две основные проблемы с хуками в git:

  • Невозможность их прозрачной установки при получении рабочей копии.
  • Запуск сценария в ответ на определенное действие (например, pre-commit) производится только одним файлом в каталоге .git/hooks — это усложняет поддержание хуков в актуальном состоянии всеми участниками команды.

Чтобы облегчить настройку pre-commit-хука мы использовали известный инструмент pre-commit. Он написан на python и использует конфигурацию в yaml-формате.

В чём преимущества этого инструмента? Давайте их перечислим:

  • Декларативное описание сценариев в едином конфигурационном файле .pre-commit-config.yaml, которые необходимо выполнить до того, как изменения в кодовой базе попадут в историю.
  • Строгая фиксация версий самих сценариев — это ключ к воспроизводимости у всех участников на всех машинах.
  • Возможность запустить весь набор сценариев проверки отдельно от git с помощью команды pre-commit run.
  • Простая установка сценариев одной командой pre-commit install для вашей рабочей копии.

Установка

Я рекомендую устанавливать pre-commit с помощью утилиты pipx. У этого способа есть неоспоримое преимущество: для каждого инструмента, установленного с помощью pipx создаётся свой собственный virtualenv, и пакеты python, от которых зависит этот инструмент, не будут конфликтовать друг с другом в системном site-packages.

pipx install pre-commit

Если для вас это не играет большой роли, можете воспользоваться инструкцией по установке из официальной документации.

Пример

Вот как выглядит файл .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-toml
  - repo: https://github.com/igorshubovych/markdownlint-cli
    rev: v0.34.0
    hooks:
      - id: markdownlint-docker
        args:
          - --disable
          - MD034

Я намеренно отключил инспекцию, запрещающую использовать “голые” ссылки в markdown — считаю это допустимым.

А вот так, например, можно включить проверку и форматирование директивы import в языке Go с помощью инструмента goimports:

repos:
  - repo: https://github.com/tekwizely/pre-commit-golang
    rev: 645165368711be670d1945c15060e746f5ed15c6
    hooks:
      - id: go-imports
        args:
          - -local
          - git.your-company.tld
          - -w

Описав конфигурационный файл .pre-commit-config.yaml в корне вашего репозитория выполните команду:

pre-commit install

Она добавит запуск хуков в вашей рабочей копии.

Если вы хотите проверить ваши изменения до запуска команды git commit, запустите pre-commit run:

pre-commit run

Вывод покажет проблемы, если они имеются.

Надеюсь, с помощью инструмента pre-commit вам будет проще начать использовать хуки git, если, конечно, у вас есть такая потребность. Успехов!

Ссылки