Non, ce n'est pas pour deux raisons:
La vitesse
Les commits devraient être rapides. Un commit qui prend 500 ms, par exemple, est trop lent et encouragera les développeurs à s’engager avec plus de parcimonie. Etant donné que sur tout projet plus grand qu'un Hello World, vous aurez des dizaines ou des centaines de tests, leur exécution prendra trop de temps avant la validation.
Bien entendu, les choses s'aggravent pour les projets plus volumineux avec des milliers de tests exécutés à la minute près sur une architecture distribuée, ou des semaines ou des mois sur une seule machine.
Le pire, c'est qu'il n'y a pas grand chose que vous puissiez faire pour accélérer les choses. De petits projets Python comportant, par exemple, cent tests unitaires, prennent au moins une seconde pour s'exécuter sur un serveur moyen, mais souvent beaucoup plus longtemps. Pour une application C #, il faudra en moyenne quatre à cinq secondes, en raison du temps de compilation.
À partir de ce moment, vous pouvez soit payer 10 000 $ de plus pour un meilleur serveur, ce qui réduira le temps, mais pas beaucoup, ou exécuter des tests sur plusieurs serveurs, ce qui ne fera que ralentir les choses.
Tous deux paient bien lorsque vous avez des milliers de tests (ainsi que des tests fonctionnels, de système et d'intégration), ce qui vous permet de les exécuter en quelques minutes au lieu de plusieurs semaines, mais cela ne vous aidera pas pour des projets de petite envergure.
Ce que vous pouvez faire, au lieu de cela, est de:
Encouragez les développeurs à exécuter des tests étroitement liés au code qu'ils ont modifié localement avant d'effectuer une validation. Ils ne peuvent peut-être pas exécuter des milliers de tests unitaires, mais ils peuvent en exécuter cinq ou dix.
Assurez-vous que trouver des tests pertinents et les exécuter est en fait facile (et rapide). Visual Studio, par exemple, est capable de détecter les tests susceptibles d'être affectés par les modifications apportées depuis la dernière exécution. D'autres IDE / plates-formes / langages / frameworks peuvent avoir des fonctionnalités similaires.
Gardez le commit aussi vite que possible. L'application de règles de style est acceptable, car souvent, c'est le seul moyen de le faire et parce que ces vérifications sont souvent incroyablement rapides. Effectuer une analyse statique est acceptable dès lors que cela reste rapide, ce qui est rarement le cas. Exécuter des tests unitaires n'est pas correct.
Exécutez des tests unitaires sur votre serveur d'intégration continue.
Assurez-vous que les développeurs sont automatiquement informés quand ils ont cassé la construction (ou quand les tests unitaires échouent, ce qui est pratiquement la même chose si vous considérez un compilateur comme un outil qui vérifie certaines des erreurs possibles que vous pouvez introduire dans votre code).
Par exemple, consulter une page Web pour vérifier les dernières versions n'est pas une solution. Ils devraient être informés automatiquement . Afficher une popup ou envoyer un SMS sont deux exemples de la façon dont ils peuvent être informés.
Assurez-vous que les développeurs comprennent que casser la construction (ou échouer les tests de régression) n’est pas correct, et que dès que cela se produit, leur priorité est de la réparer. Peu importe qu'ils travaillent sur une fonction hautement prioritaire que leur supérieur hiérarchique a demandé à envoyer pour demain: ils ont échoué à la construction, ils doivent la réparer.
Sécurité
Le serveur qui héberge le référentiel ne doit pas exécuter de code personnalisé, tel que des tests unitaires, notamment pour des raisons de sécurité. Ces raisons ont déjà été expliquées dans CI Runner sur le même serveur de GitLab?
Si, par contre, votre idée est de lancer un processus sur le serveur de construction à partir du hook de pré-validation, cela ralentira encore plus les validations.