Nein, aus zwei Gründen nicht:
Geschwindigkeit
Commits sollten schnell sein. Ein Commit, das beispielsweise 500 ms dauert, ist zu langsam und ermutigt Entwickler, sparsamer zu Commiten. Angesichts der Tatsache, dass Sie bei jedem Projekt, das größer als eine Hello World ist, Dutzende oder Hunderte von Tests durchführen müssen, wird es zu lange dauern, sie während des Pre-Commits auszuführen.
Bei größeren Projekten mit Tausenden von Tests, die minutenlang auf einer verteilten Architektur oder wochen- oder monatelang auf einer einzelnen Maschine ausgeführt werden, wird es natürlich noch schlimmer.
Das Schlimmste ist, dass Sie nicht viel tun können, um es schneller zu machen. Bei kleinen Python-Projekten mit beispielsweise hundert Komponententests dauert die Ausführung auf einem durchschnittlichen Server mindestens eine Sekunde, dauert jedoch häufig viel länger. Bei einer C # -Anwendung beträgt der Durchschnitt aufgrund der Kompilierungszeit vier bis fünf Sekunden.
Ab diesem Zeitpunkt können Sie entweder zusätzliche 10 000 US-Dollar für einen besseren Server zahlen, wodurch die Zeit verkürzt wird, jedoch nicht viel, oder Tests auf mehreren Servern ausführen, wodurch die Leistung nur verlangsamt wird.
Beide zahlen sich aus, wenn Sie Tausende von Tests (sowie Funktions-, System- und Integrationstests) haben, sodass sie in wenigen Minuten anstatt in Wochen ausgeführt werden können. Bei kleinen Projekten hilft dies jedoch nicht.
Stattdessen können Sie Folgendes tun:
Ermutigen Sie die Entwickler, Tests auszuführen, die sich stark auf den lokal geänderten Code beziehen, bevor Sie ein Commit ausführen. Möglicherweise können sie nicht Tausende von Komponententests durchführen, aber sie können fünf bis zehn von ihnen durchführen.
Stellen Sie sicher, dass das Auffinden und Ausführen relevanter Tests tatsächlich einfach (und schnell) ist. Visual Studio kann beispielsweise erkennen, welche Tests von Änderungen betroffen sein können, die seit der letzten Ausführung vorgenommen wurden. Andere IDEs / Plattformen / Sprachen / Frameworks verfügen möglicherweise über ähnliche Funktionen.
Halten Sie das Commit so schnell wie möglich. Das Erzwingen von Stilregeln ist in Ordnung, da dies häufig der einzige Ort ist und solche Überprüfungen oft erstaunlich schnell sind. Die statische Analyse ist in Ordnung, sobald sie schnell bleibt, was selten der Fall ist. Unit Tests durchzuführen ist nicht OK.
Führen Sie auf Ihrem Continuous Integration-Server Komponententests durch.
Stellen Sie sicher, dass Entwickler automatisch informiert werden, wenn sie den Build abgebrochen haben (oder wenn Komponententests fehlgeschlagen sind, was praktisch das gleiche ist, wenn Sie einen Compiler als Tool betrachten, das einige der möglichen Fehler überprüft, die Sie in Ihren Code einfügen können).
Zum Beispiel ist es keine Lösung, eine Webseite aufzurufen, um die letzten Builds zu überprüfen. Sie sollten automatisch informiert werden . Ein Popup anzeigen oder eine SMS senden sind zwei Beispiele dafür, wie sie informiert werden können.
Stellen Sie sicher, dass die Entwickler verstehen, dass das Unterbrechen des Builds (oder das Fehlschlagen von Regressionstests) nicht in Ordnung ist, und dass es ihre oberste Priorität ist, das Problem zu beheben, sobald dies geschieht. Es spielt keine Rolle, ob sie an einer Funktion mit hoher Priorität arbeiten, die ihr Chef für morgen ausliefern wollte: Sie haben den Build nicht bestanden, sie sollten ihn reparieren.
Sicherheit
Der Server, auf dem sich das Repository befindet, sollte aus Sicherheitsgründen keinen benutzerdefinierten Code wie Unit-Tests ausführen. Diese Gründe wurden bereits in CI-Runner auf demselben Server von GitLab erläutert ?
Wenn Sie dagegen einen Prozess auf dem Build-Server über den Pre-Commit-Hook starten möchten, werden die Commits noch langsamer.