Пример использования `pre-push` хука для проверки тестов.

pre-push хук вызывается перед отправкой коммитов на удаленный репозиторий. Он позволяет предотвратить отправку кода, не прошедшего тесты. Пример скрипта:

#!/bin/sh
# Запуск тестов
npm test

# Проверка статуса выхода
if [ $? -ne 0 ]; then
  echo "Тесты не прошли! Отправка отменена."
  exit 1
fi

# Если тесты прошли, разрешить отправку
exit 0

Этот скрипт запускает npm test. Если тесты завершаются с ошибкой (ненулевой код возврата), скрипт выводит сообщение и отменяет отправку (exit 1). Иначе отправка разрешена (exit 0).


Использование `pre-push` хука для проверки тестов (JavaScript/Node.js пример):

Хук `pre-push` выполняется непосредственно перед тем, как ваши коммиты будут отправлены (pushed) на удаленный репозиторий. Это отличное место для запуска тестов, чтобы убедиться, что вы не отправляете сломанный код.

Шаги реализации:

  1. Создайте хук `pre-push`: В вашем репозитории, перейдите в папку `.git/hooks/`. Если файла `pre-push` там нет, создайте его (без расширения). Убедитесь, что у файла есть права на выполнение (`chmod +x .git/hooks/pre-push`).
  2. Добавьте скрипт в `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`.
0