Principal Engineering

Pressing buttons in the right order.

pre-commit

Posted at — Jun 16, 2023

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

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

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

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

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

Установка

Я рекомендую устанавливать 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, если, конечно, у вас есть такая потребность. Успехов!

Ссылки

comments powered by Disqus