Нет, по двум причинам:
скорость
Коммиты должны быть быстрыми. Например, коммит, который занимает 500 мс, слишком медленный и побудит разработчиков делать коммиты более экономно. Учитывая, что в любом проекте, превышающем Hello World, у вас будут десятки или сотни тестов, их запуск во время предварительной фиксации займет слишком много времени.
Конечно, дела обстоят хуже для крупных проектов с тысячами тестов, которые выполняются в течение нескольких минут на распределенной архитектуре, или недели или месяцы на одной машине.
Хуже всего то, что вы ничего не можете сделать, чтобы сделать это быстрее. Небольшие проекты Python, которые имеют, скажем, сотню модульных тестов, для запуска на среднем сервере занимают по меньшей мере секунду, но часто гораздо дольше. Для приложения C # это будет в среднем четыре-пять секунд из-за времени компиляции.
С этого момента вы можете либо заплатить дополнительные 10 000 долларов за лучший сервер, который сократит время, но не намного, либо запустить тесты на нескольких серверах, что только замедлит работу.
Оба хорошо платят, когда у вас есть тысячи тестов (а также функциональных, системных и интеграционных тестов), что позволяет выполнять их в считанные минуты, а не недели, но это не поможет вам в небольших проектах.
Вместо этого вы можете:
Поощряйте разработчиков запускать тесты, тесно связанные с кодом, который они модифицировали локально, перед выполнением фиксации. Возможно, они не могут запустить тысячи модульных тестов, но могут выполнить пять-десять из них.
Убедитесь, что найти соответствующие тесты и запустить их на самом деле легко (и быстро). Например, Visual Studio может определить, на какие тесты могут повлиять изменения, выполненные с момента последнего запуска. Другие IDE / платформы / языки / рамки могут иметь аналогичную функциональность.
Держите коммит как можно быстрее. Применение правил стиля - это нормально, потому что зачастую это единственное место, где можно это сделать, и потому что такие проверки часто бывают удивительно быстрыми. Выполнение статического анализа - это нормально, как только оно остается быстрым, что редко бывает. Запуск юнит-тестов не в порядке.
Запустите модульные тесты на сервере Continuous Integration.
Убедитесь, что разработчики получают автоматическую информацию, когда они прерывают сборку (или когда не удается выполнить модульные тесты, что практически одно и то же, если вы рассматриваете компилятор как инструмент, который проверяет некоторые из возможных ошибок, которые вы можете внести в ваш код).
Например, переход на веб-страницу для проверки последних сборок не является решением. Они должны быть проинформированы автоматически . Отображение всплывающего окна или отправка SMS - два примера того, как они могут быть проинформированы.
Убедитесь, что разработчики понимают, что ломать сборку (или проваливать регрессионные тесты) нехорошо, и что, как только это происходит, их первоочередной задачей является исправление. Неважно, работают ли они над высокоприоритетной функцией, которую их босс попросил отправить на завтра: они провалили сборку, они должны это исправить.
Безопасность
Сервер, на котором размещено хранилище, не должен запускать пользовательский код, такой как модульные тесты, особенно по соображениям безопасности. Эти причины уже были объяснены в CI Runner на том же сервере GitLab?
Если, с другой стороны, ваша идея состоит в том, чтобы запустить процесс на сервере сборки из ловушки перед фиксацией, то это замедлит еще больше фиксаций.