Есть у меня гит-репка с 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
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Хуй знает, работает этот код или нет, я давно им не пользовался, главное тут концепт.

Делаем это исполняемым:

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 нахуй не нужен, он помещает тебя в рамки, и ты теряешь свободу в творчестве.

Пользуйтесь.