Использование `pre-push` хука для проверки тестов (JavaScript/Node.js пример):
Хук `pre-push` выполняется непосредственно перед тем, как ваши коммиты будут отправлены (pushed) на удаленный репозиторий. Это отличное место для запуска тестов, чтобы убедиться, что вы не отправляете сломанный код.
Шаги реализации:
-
Создайте хук `pre-push`: В вашем репозитории, перейдите в папку `.git/hooks/`. Если файла `pre-push` там нет, создайте его (без расширения). Убедитесь, что у файла есть права на выполнение (`chmod +x .git/hooks/pre-push`).
-
Добавьте скрипт в `pre-push`: Откройте файл `pre-push` в текстовом редакторе и добавьте в него следующий скрипт (или аналогичный, соответствующий вашему проекту):
#!/bin/bash
# Хук pre-push для запуска тестов
echo "Запуск тестов перед отправкой изменений..."
# Запускаем тесты (замените `npm test` на вашу команду)
npm test
# Получаем код возврата команды тестов
TEST_RESULT=$?
# Проверяем, были ли ошибки в тестах
if [ $TEST_RESULT -ne 0 ]; then
echo "Тесты не пройдены. Отправка изменений отменена."
exit 1 # Выход с ошибкой. Отправка отменена.
else
echo "Все тесты пройдены. Отправка изменений разрешена."
exit 0 # Выход без ошибки. Отправка разрешена.
fi
Разъяснения по скрипту:
-
`#!/bin/bash`: Указывает, что это bash скрипт.
-
`echo "Запуск тестов перед отправкой изменений..."`: Выводит сообщение в консоль.
-
`npm test`: Это команда, которая запускает ваши тесты. Замените её на команду, используемую в вашем проекте (например, `yarn test`, `pytest`, `./run_tests.sh` и т.д.).
-
`TEST_RESULT=$?`: Сохраняет код возврата (exit code) предыдущей команды (в данном случае, `npm test`). Код возврата 0 обычно означает успех, а любое другое значение - ошибку.
-
`if [ $TEST_RESULT -ne 0 ]`: Проверяет, был ли код возврата не равен 0 (то есть, была ли ошибка).
-
`exit 1`: Выход из скрипта с кодом 1, что сигнализирует Git'у об ошибке. Git отменит операцию push.
-
`exit 0`: Выход из скрипта с кодом 0, что сигнализирует Git'у об успехе. Git продолжит операцию push.
Важные замечания:
-
Скорость: Тесты должны выполняться достаточно быстро. Если тесты занимают слишком много времени, это может раздражать разработчиков. Рассмотрите возможность запуска только подмножества тестов (например, unit-тестов) в `pre-push` хуке, а более длительные интеграционные тесты запускать в CI/CD системе.
-
Пропуск хука: Разработчики могут пропустить `pre-push` хук, используя флаг `--no-verify` при выполнении команды `git push`. Имейте это в виду при проектировании стратегии тестирования.
-
Зависимости: Убедитесь, что все зависимости, необходимые для запуска тестов, установлены в окружении, где выполняется хук.
-
Локальное окружение: Этот хук работает в локальном окружении разработчика. Если тесты зависят от внешних ресурсов (например, базы данных), необходимо обеспечить их доступность или настроить моки/заглушки.
-
Пример для Python: Если в проекте используются тесты Python с pytest, команда `npm test` заменяется на `pytest`.