
Ваша первая линия защиты для чистого кода-предварительная коммитация: как ее настроить
7 июля 2025 г.Вы когда -нибудь случайно раздвигали секреты репозитория? Или, может быть, вы натолкнули неформатированный код, только чтобы создать последующий коммит «Linting»? Мы все были там. Эти небольшие ошибки могут привести к неудачным трубопроводам CI/CD и разочаровывающим задержкам, все из -за проверки, которые можно было бы запустить локально.
Git Hooks - это мощный инструмент для предотвращения этих проблем, запустив сценарии, прежде чем вы совершаете или настаиваете. Тем не менее, обмен и стандартизация этих крючков в команде или проекте может быть сложным.
Именно здесь появляется предварительная коммитация. Предварительная компания-это простая в использовании структуру для управления и обмена многоязычными GIT Hooks, помогая вам поймать проблемы еще до того, как они покинут вашу рабочую станцию.
Начало работы: правильная установка
Прежде чем вы сможете использовать мощность предварительной коммиты, вам необходимо установить ее и настроить для своих проектов.
Установка
У вас есть несколько способов установить предварительную компанию:
- MacOS и Linux:
brew install pre-commit
- Python/Pip (кроссплатформный):
pip install pre-commit
- Другие методы: для установки с использованием Conda или в Windows обратитесь к
Официальная документация Полем
Настройка специфического проекта (стандартный путь)
Это наиболее распространенный подход для обеспечения предварительной коммиты в конкретном проекте:
Создайте файл конфигурации: в корне вашего репозитория создайте файл с именем
.pre-commit-config.yaml
Полем Этот файл будет определять крючков, который должен работать, предварительно обременяющий. (Мы рассмотрим, как заполнить этот файл в следующем разделе).Установите крючки: перейдите к корневому каталогу вашего репозитория в вашем терминале и запустите:
pre-commit install
- Эта команда устанавливает крючки GIT в ваш репозиторий
.git/hooks
каталог. С этого момента Pre-Commit автоматически запускает свои чеки, прежде чем каждый коммит, который вы делаете в этом конкретном репозитории.
Глобальная настройка (метод «Установить и забыть»)
Если вы часто запускаете новые проекты или репозитории клонов и хотите, чтобы предварительная компания была активна по умолчанию (если существует конфигурация), вы можете настроить его глобально. Этот метод использует GITinit.templateDir
особенность.
Файл конфигурации: у всего вашего репозитория должен быть
.pre-commit-config.yaml
Полем Этот файл будет определять крючки, которые должен запускать предварительную компанию. Лучше всего использовать репозиторий шаблона с минимальным предварительным файлом.Настройте каталог шаблонов GIT: скажите GIT использовать конкретный каталог в качестве шаблона для новых репозитории:
git config --global init.templateDir ~/.git-template
(Вы можете выбрать другой каталог, если вы предпочитаете, просто убедитесь, что он последовательен на следующем шаге.)
3. Инициализируйте предварительную компанию в каталоге шаблонов: запустите следующую команду:
pre-commit init-templatedir ~/.git-template
(Если вы выбрали другой каталог на предыдущем шаге, замените~/.git-template
соответственно.)
Это имеет большое преимущество: с этой глобальной установкой любое новое репозиторий, который вы инициализируете (git init
) или клон автоматически установит крюк Pre-Commit. Если в репозитории нет.pre-commit-config.yaml
Файл, предварительный коммит просто ничего не сделает, поэтому безопасно включить во всем мире.
Тем не менее, мне нравится идти на шаг вперед, добавив крюк по умолчанию~/.git-template/hooks/pre-commit
это систематически не удалось, если у репозитория нет.pre-commit-config.yaml
Полем Вот содержание крючка.
#!/usr/bin/env bash
if [ -f .pre-commit-config.yaml ]; then
echo 'pre-commit configuration detected, but `pre-commit install` was never run' 1>&2
exit 1
fi
Создание вашей конфигурации (.pre-commit-config.yaml)
Сердцем предварительной коммиты является.pre-commit-config.yaml
файл. Этот файл, размещенный в корне вашего репозитория, сообщает Pre-Commit, который проверяет работу. Вот небольшой пример такой конфигурации.
# https://github.com/xNok/infra-bootstrap-tools/blob/main/.pre-commit-config.yaml
repos:
# Lint all yam files
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.29.0
hooks:
- id: yamllint
# Runs Ansible lint
- repo: https://github.com/ansible/ansible-lint
rev: v24.7.0
hooks:
- id: ansible-lint
args:
- "ansible"
additional_dependencies:
- ansible
Основная структура объяснена
Типичная конфигурация включает в себя список репозиториев, каждая из которых имеет определенные крючки:
repos
: Это ключ верхнего уровня, который содержит список отображений репозитория. Каждый элемент в списке определяет репозиторий GIT, который содержит крючки с предварительным обменом.
repo
: URL -адрес репозитория, размещающий крючки (например,https://github.com/pre-commit/pre-commit-hooks
) Это очень хороший способ управления зависимостями. Когда вы знаете больше об инструменте, вы можете отправиться в репозиторий.
rev
: Он определяет версию крючков для использования, закрепляя либо GIT Tag, SHA или Branch. Но рекомендуется всегда использовать конкретный тег или SHA (не такая ветвьmaster
), чтобы гарантировать, что ваша лининг не неожиданно сломается, когда обновления удаленного репозитория.
hooks
: Список под каждымrepo
вход. Каждый элемент здесь определяет определенный крючок для использования из этого репозитория.
id
: Уникальный идентификатор крючка (например,,trailing-whitespace
Вcheck-yaml
) Вы можете найти доступные идентификаторы крюка в документации по репозитории крюка. или просто.pre-commit-hooks.yaml
в корне репо.
Практическая конфигурация стартера
Вот базовый.pre-commit-config.yaml
Чтобы начать вас. Для этого примера я советую вам отправиться в GitHub и взглянуть наpre-commit
команда реализована и где вы можете найтиid
каждого из соответствующих крючков, которые вы можете использовать.
Я бы сказалtrailing-whitespace
иend-of-file-fixer
действительно полезны, поэтому конфигурация будет выглядеть так.
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0 # Check for the latest stable version on the pre-commit-hooks repo!
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
# Add other repositories and their specific hooks below
# - repo: ...
# rev: ...
# hooks:
# - id: ...
Примечание: версии для крючков меняются со временем. Это хорошая практика, чтобы иногда проверятьpre-commit-hooks
Репозиторий (или любые другие репозитории крючков, которые вы используете) для последней стабильной теги версии и обновить вашrev
соответственно. Или иметь автоматизацию на месте, например, обновлять или зависит, чтобы регулярно обновлять их.
Вы можете найти большой список ранее существовавших крючков на.pre-commit-hooks.yaml
и посмотрите, доступны ли крючки.
Хорошо знать при использовании предварительной коммиты
Как только вам удобно с основами, Pre-Commit предлагает более продвинутые функции для точной настройки вашего рабочего процесса.
Бегущие крючки вручную
Пока крючки работают автоматически наgit commit
, вы можете захотеть запустить их вручную в другое время:
- Запустите определенный крючок: для выполнения одного крючка (например, для проверки его конфигурации или применения его изменений без совершения), используйте:
pre-commit run <hook_id>
(Заменять<hook_id>
с фактическим идентификатором из вашего файла конфигурации.)
- Запустите все файлы: чтобы запустить все настроенные крючки в каждом отслеживаемом файле в вашем репозитории (не только поставленные изменения), используйте:
pre-commit run --all-files
Это полезно для начальной очистки или при добавлении новых крючков в существующий проект.
Создание собственных местных крючков
Иногда у вас могут быть сценарии или чеки, которые не являются частью репозитория Public Hook. Pre-Commit позволяет определить «локальные» крючки.
- Напишите свой сценарий: Создайте свой сценарий (например, сценарий оболочки, сценарий Python) в вашем репозитории. Для этого примера скажем, что вы создаете
my_custom_script.sh
Полем - Определить в
.pre-commit-config.yaml
: Добавьте локальный приход к крюку в вашу конфигурацию:
# .pre-commit-config.yaml
- repo: local
hooks:
- id: my-custom-check
name: My custom check
entry: ./my_custom_script.sh # Path to your script
language: script # Or python, node, etc.
files: \.(py)$ # Example: regex to run only on Python files
# verbose: true # Uncomment for more output
# args: [--custom-arg] # Optional arguments for your script
Это говорит о том, чтобы доставатьmy_custom_script.sh
для любых изменений в Python (.py
) файлы. Аlanguage: script
Тип очень гибкий; Для конкретных сред, таких как Python или Node, вы можете указать те, кто для управления зависимостями, если это необходимо. Я в основном экспериментировал сbash
крючки
Тем не менее, Pre-Commit очень умна в отношении рабочей среды, так как создает изолированную среду выполнения для инструментов и необходимые зависимости.
К сожалению, не все крючки использовали функцию зависимости, и вам, возможно, придется установить инструменты самостоятельно, чтобы иметь возможность запустить крючок (например, я думаю о Terraform)
Предварительная коммитация в команде и средах CI/CD
В то время как предварительная компания сияет на отдельных машинах для разработчиков, его преимущества умножаются при интеграции в рабочие процессы команды и трубопроводы CI/CD. Даже с установленными локальными крючками перед наборами, кто-то может случайно совершить без крючков (например, используяgit commit --no-verify
) или устарела конфигурация крюка. Ваш трубопровод CI/CD может выступать в качестве окончательного привратника.
Запустив предварительные проверки в вашем конвейере CI, вы гарантируете, что ни один код, нарушающий стандарты вашего проекта, не объединяется. Типичная команда для этого:
pre-commit run --all-files
Эта команда проверяет все файлы в репозитории, а не только в измененных, обеспечивая комплексную проверку.
Концептуальный шаг трубопровода CI (например, действия GitHub):
# Example for a GitHub Actions workflow
# ... (other steps like checkout, setup python/node, etc.)
- name: Install pre-commit and dependencies
run: |
pip install pre-commit
# Install any other dependencies your hooks might need (e.g., linters)
# This might be minimal if your hooks install their own dependencies (common).
- name: Run pre-commit checks
run: pre-commit run --all-files
Приятно иметь концептуальный трубопровод, который работает с любой системой CI, но если вы используете действия GitHub, вам не нужно беспокоиться; Используйтеофициальное действиеПолем
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: pre-commit/action@v3.0.1
При интеграции CI петля завершена, и та же валидация применяется в средах разработчиков, что и в среде CI. Если трубопровод не сбои, исправьте его локально, запустив предварительную компанию.
Заключение
Понимая тамимеетЧтобы быть лучшим способом, чем ручные проверки и «упс», мы исследовали, как этоpre-commit
Преобразует ваш рабочий процесс разработки.
Автоматируя проверки для всего, от ошибок в пробеле и секретного обнаружения до форматирования и личинки кода, предварительный обход выступает в качестве неутомимого локального опекуна качества кода, который может даже интегрировать «беспрепятственно» в трубопроводы CI/CD, чтобы служить в качестве ворота конечного качества.
Оригинал