Есть у меня гит-репка с Bash-скриптами на все случаи жизни, появилась необходимость при очередном коммите проверять изменённые скрипты с помощью shellcheck и дизейблить коммит, если я накосорезил.
Сейчас автоматизируем
Про shellcheck я писал отдельный пост. Короче, он у тебя должен быть установлен.
Дальше создаём файл .git/hooks/pre-commit в репозитории, в котором нужно запускать проверку, и пишем в него:
#!/bin/bash
bash_scripts=$(find . -name "*.sh")
for script in $bash_scripts; do
shellcheck "$script"
if [ $? -ne 0 ]; then
echo "Shellcheck failed on $script. Commit aborted."
exit 1
fi
done
exit 0
Делаем это исполняемым:
chmod +x .git/hooks/pre-commit
Теперь перед каждым коммитом будет выполняться shellcheck для всех Bash-скриптов в репозитории. Если shellcheck найдёт ошибки, твой коммит не пройдёт, пока не пофиксишь.
Поначалу это напряжно, но потом понимаешь, что у тебя уже вырабатывается какой-то кодстайл и ты не можешь распиздяйничать.
Если у тебя скрипты имеют другое расширение, соответственно меняешь его в переменной bash_scripts.
Помню, в компании была подобная штука на проверку Puppet-кода, пиздец, я там орал как белуга, не понимая, что эта тварь от меня хочет. По итогу, когда я возглавил отдел, выкосил это дермище вместе с Puppet.
Бонусом адаптация под проверку Ansible-плейбуков:
#!/bin/bash
playbooks=$(find . -name "*.yml" -o -name "*.yaml")
for playbook in $playbooks; do
ansible-lint "$playbook"
if [ $? -ne 0 ]; then
echo "ansible-lint failed on $playbook. Commit aborted."
exit 1
fi
done
exit 0
В зависимостях — нужно установить ansible-lint.
С помощью pre-commit можешь любую хуйню замутить и усложнять себе жизнь в геометрической прогрессии. А вообще pre-commit нахуй не нужен, он помещает тебя в рамки, и ты теряешь свободу в творчестве.
Пользуйтесь.








Комментарии