Настройка хуков Git
Приоритет качества кода в процессе разработки должен начинаться с разработки локального кода. Важно выявлять возможности для этой практики даже до создания pull request'ов, чтобы обнаруживать и исправлять потенциальные проблемы качества кода.
Хуки Git предлагают отличную возможность. Они служат механизмом выполнения пользовательских скриптов в ответ на значительные события жизненного цикла Git, такие как фиксации, слияния и отправки. Скрипты, расположенные в каталоге git\hooks репозитория, обеспечивают практически неограниченную гибкость в автоматизации задач разработки программного обеспечения и применении стандартов разработки.
Как реализовать хуки Git
Начнем с изучения клиентских хуков Git. Перейдите в каталог репозитория .git\hooks— вы найдете там много файлов с расширением sample
. Это расширение не только указывает на их назначение, но и эффективно предотвращает их выполнение. Имена файлов определяют действия Git, которые активируют их выполнение после удаления расширения sample
.
Переименуйте файл pre-commit sample
в pre-commit. Как указывает название файла, скрипт, который он содержит, будет выполняться каждый раз, когда вы вызываете git commit. Фиксация выполняется только в том случае, если скрипт предварительной фиксации завершится с возвращаемым значением 0.
Однако важно отметить, что, по умолчанию, это не будет работать так, как это предназначено в любой из операционных систем Windows. Часто игнорируемая причина этого поведения является первой строкой скрипта:
#!/bin/sh
В операционных системах Linux — #! префикс указывает на загрузчик программы, что остальная часть файла содержит скрипт для интерпретации, а /bin/sh — полный путь к интерпретатору, который следует использовать.
Хотя Git для Windows поддерживает команды Bash и скрипты оболочки, при указании путей файловой системы он не соблюдает то же соглашение. Вместо этого необходимо предоставить полный путь к файлу sh.exe, начиная с буквы диска.
Однако есть дополнительная предостережение, которое приводит к тому, что Git для Windows по умолчанию устанавливается в каталоге C:\Program Files. Так как этот каталог содержит пробел в его имени, результирующий путь к файлу sh.exe будет интерпретирован как два отдельных пути, что приведет к сбою. Чтобы избежать этого, необходимо добавить одну обратную косую черту (\) перед пробелом, чтобы служить escape-символом. Фактически при использовании 64-разрядной версии Git для Windows первая строка скрипта должна иметь следующий формат:
#!C:/Program\ Files/Git/usr/bin/sh.exe
Как это сделать
Как использовать недавно обнаруженные функциональные возможности скриптов предварительной фиксации Git? Как насчёт предотвратить случайные утечки секретов на GitHub?
Давайте используем хук Git для сканирования кода, который фиксируется в вашем локальном репозитории, на наличие определенных ключевых слов. Замените содержимое файла скрипта pre-commit на следующий код:
#!C:/Program\ Files/Git/usr/bin/sh.exe
matches=$(git diff-index --patch HEAD | grep '^+' | grep -Pi 'password|secret')
if [ ! -z "$matches" ]
then
cat <<\EOT
Error: Words from the blocked list were present in the diff:
EOT
echo $matches
exit 1
fi
Этот пример предназначен для иллюстрации концепции, а не полнофункционального решения, поэтому список ключевых слов намеренно тривиал. С помощью регулярных выражений можно значительно расширить область и гибкость. Вы также можете ссылаться на внешний файл, что значительно упрощает текущее обслуживание.
Принцип работы
После вызова скрипт перехватчика предварительной фиксации использует команды Git diff и grep для идентификации ключевых слов или шаблонов в добавочных изменениях в коде, который фиксируется. Если обнаружены какие-либо совпадения, скрипт создает сообщение об ошибке и предотвращает выполнение коммита.
Там больше:
Другие распространенные варианты использования скриптов предварительного коммита включают форматирование кода, линтинг или выполнение пользовательских тестов, чтобы убедиться, что коммит соответствует стандартам проекта. Скрипт prepare-commit-msg выполняется перед запуском редактора сообщений фиксации. Он позволяет динамически создавать сообщения коммитов для применения соглашений об именовании, таких как использование определённых префиксов (например, feat: для новых возможностей или fix: для исправления ошибок).
Например, следующий скрипт prepare-commit-msg автоматически добавляет имя текущей ветки к сообщению коммита при создании нового коммита. Он изменяет файл сообщения коммита ($1), добавляя имя ветви с двоеточием и пробелом в начало файла.
#!C:/Program\ Files/Git/usr/bin/sh.exe
# Get the current branch name
branch_name=$(git branch --show-current)
# Check if the commit message file exists
if [[ -f "$1" ]]; then
# Prepend the branch name to the commit message
sed -i "1s/^/$branch_name: /" "$1"
fi
Скрипты постфиксации выполняются после завершения фиксации. Его можно использовать для активации уведомлений или создания документации.
Например, следующий скрипт отправляет уведомление по электронной почте назначенному получателю после каждой фиксации. Скрипт можно настроить, изменив адрес электронной почты получателя, SMTP-сервер и тему и текст сообщения электронной почты. Кроме того, может потребоваться настроить систему для отправки сообщений электронной почты с помощью командлета PowerShell Send-MailMessage или использовать другой метод для отправки уведомлений в зависимости от среды и требований.
#!C:/Program\ Files/Git/usr/bin/sh.exe
# Set the recipient email address
$recipient="your@email.com"
# Set the subject of the email
$subject="Git Commit Notification"
# Set the body of the email
$body="A new commit has been made to the repository."
# Send the email notification
Send-MailMessage -To $recipient -Subject $subject -Body $body -SmtpServer "your.smtp.server"
Стоит отметить, что папка репозитория .git\hooks не сохраняется в системе контроля версий. Вы можете задаться вопросом, есть ли способ поделиться скриптами, разработанными с другими членами вашей команды разработки. Хорошая новость заключается в том, что начиная с версии 2.9 Git, вы можете связывать хуки Git с папкой, которая может быть включена в систему контроля версий. Это можно сделать, обновив конфигурацию глобальных параметров для репозитория Git:
Git config --global core.hooksPath '~/.githooks'
Если вам когда-либо нужно перезаписать хуки Git, которые вы настроили на стороне клиента, вы можете сделать это с помощью параметра no-verify:
Git commit --no-verify
Server-Side крючки
Несмотря на то что клиентские хуки Git предлагают надёжные возможности для улучшения рабочего процесса разработки, Azure Repos также предоставляет серверные хуки для дальнейшего расширения процесса разработки, включая поддержку создания запросов на слияние. Дополнительные сведения см. в справочнике по хукам службы Azure Repos и событиям.