Что такое pre-commit хуки?python-57

Что такое pre-commit хуки?

Pre-commit хуки — это автоматизированные скрипты, которые запускаются перед фиксацией изменений в Git. Они помогают:

  • Проверять код на соответствие стандартам
  • Запускать тесты и линтеры
  • Предотвращать попадание некачественного кода в репозиторий

Как работают pre-commit хуки?

  1. Разработчик делает git commit
  2. Git запускает привязанные к событию commit скрипты
  3. Если скрипты завершаются успешно (код возврата 0) — коммит создается
  4. Если скрипты возвращают ошибку — коммит отменяется

Основные виды pre-commit хуков

1. Линтинг кода

# .git/hooks/pre-commit (пример простого хука)
#!/bin/sh
flake8 . || exit 1  # Если flake8 найдет ошибки - коммит отменится

2. Проверка стиля кода

#!/bin/sh
black --check .  # Проверка форматирования Black
isort --check .  # Проверка сортировки импортов

3. Запуск тестов

#!/bin/sh
pytest tests/unit/  # Запуск юнит-тестов перед коммитом

Настройка pre-commit с помощью Python-пакета

Установка

pip install pre-commit

Конфигурация .pre-commit-config.yaml

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v4.4.0
  hooks:
    - id: trailing-whitespace  # Удаляет пробелы в концах строк
    - id: end-of-file-fixer    # Добавляет пустую строку в конец файла
    - id: check-yaml          # Проверяет валидность YAML файлов
    - id: check-added-large-files  # Проверяет на большие файлы

- repo: https://github.com/psf/black
  rev: 23.3.0
  hooks:
    - id: black              # Форматирование кода

- repo: https://github.com/PyCQA/flake8
  rev: 6.0.0
  hooks:
    - id: flake8            # Проверка стиля кода
      additional_dependencies: [flake8-bugbear]

Установка хуков

pre-commit install  # Устанавливает хуки в .git/hooks/

Полезные готовые хуки

Для Python проектов

  • black — автоматическое форматирование
  • isort — сортировка импортов
  • flake8 — проверка стиля
  • mypy — проверка типов
  • pylint — статический анализ

Универсальные

  • check-yaml — валидация YAML
  • check-json — валидация JSON
  • detect-secrets — поиск секретов в коде
  • prettier — форматирование фронтенд кода

Кастомизация хуков

Пример кастомного хука

# .pre-commit-hooks.yaml
- id: check-migrations
  name: Check Django migrations
  description: Ensure migrations are up to date
  entry: python manage.py makemigrations --dry-run --check
  language: system
  types: [python]

Локальные хуки

- repo: local
  hooks:
    - id: run-tests
      name: Run unit tests
      entry: pytest tests/unit/
      language: system
      pass_filenames: false

Решение проблем

Пропуск хуков

git commit --no-verify  # --no-verify или -n

Обновление хуков

pre-commit autoupdate

Запуск для всех файлов

pre-commit run --all-files

Интеграция с CI/CD

Хуки можно запускать и на сервере непрерывной интеграции:

# .github/workflows/pre-commit.yml
name: pre-commit
on: [push, pull_request]
jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
      - run: pip install pre-commit
      - run: pre-commit run --all-files

Резюмируем

pre-commit хуки — это мощный инструмент для автоматического контроля качества кода, который экономит время на code review и предотвращает множество распространенных ошибок. Использование хуков особенно полезно в командах, так как обеспечивает единые стандарты кода для всех разработчиков.