No, non lo è, per due motivi:
Velocità
Gli impegni dovrebbero essere veloci. Un commit che richiede 500 ms., Ad esempio, è troppo lento e incoraggerà gli sviluppatori a impegnarsi con più parsimonia. Dato che su qualsiasi progetto più grande di un Hello World, avrai dozzine o centinaia di test, ci vorrà troppo tempo per eseguirli durante il pre-commit.
Naturalmente, le cose peggiorano per i progetti più grandi con migliaia di test che vengono eseguiti per minuti su un'architettura distribuita o settimane o mesi su una singola macchina.
La parte peggiore è che non c'è molto che puoi fare per renderlo più veloce. Piccoli progetti Python che hanno, diciamo, cento test unitari, richiedono almeno un secondo per essere eseguiti su un server medio, ma spesso molto più a lungo. Per un'applicazione C #, avrà una media di quattro-cinque secondi, a causa del tempo di compilazione.
Da quel momento, puoi pagare $ 10.000 in più per un server migliore che ridurrà il tempo, ma non di molto, oppure eseguire test su più server, che rallenteranno le cose.
Entrambi pagano bene quando si hanno migliaia di test (oltre a test funzionali, di sistema e di integrazione), che consentono di eseguirli in pochi minuti anziché settimane, ma questo non ti aiuterà per progetti su piccola scala.
Quello che puoi fare, invece, è:
Incoraggia gli sviluppatori a eseguire test fortemente correlati al codice che hanno modificato localmente prima di eseguire un commit. Probabilmente non possono eseguire migliaia di unit test, ma possono eseguirne cinque e dieci.
Assicurati che trovare test pertinenti ed eseguirli sia effettivamente facile (e veloce). Visual Studio, ad esempio, è in grado di rilevare quali test potrebbero essere interessati dalle modifiche apportate dall'ultima esecuzione. Altri IDE / piattaforme / lingue / framework potrebbero avere funzionalità simili.
Mantieni il commit il più velocemente possibile. Far rispettare le regole di stile è OK, perché spesso è l'unico posto dove farlo e perché tali controlli sono spesso sorprendentemente veloci. Fare analisi statiche va bene non appena si accelera, cosa che accade raramente. L'esecuzione dei test unitari non è corretta.
Eseguire test unitari sul server di integrazione continua.
Assicurati che gli sviluppatori siano informati automaticamente quando interrompono la compilazione (o quando i test unitari falliscono, il che è praticamente la stessa cosa se consideri un compilatore come uno strumento che controlla alcuni dei possibili errori che puoi introdurre nel tuo codice).
Ad esempio, andare su una pagina Web per verificare gli ultimi build non è una soluzione. Dovrebbero essere informati automaticamente . Mostrare un popup o inviare un SMS sono due esempi di come possono essere informati.
Assicurati che gli sviluppatori comprendano che interrompere la build (o fallire i test di regressione) non va bene e che non appena accade, la loro priorità principale è risolverlo. Non importa se stanno lavorando a una funzionalità ad alta priorità che il loro capo ha chiesto di spedire per domani: hanno fallito la costruzione, dovrebbero ripararla.
Sicurezza
Il server che ospita il repository non deve eseguire codice personalizzato, ad esempio test di unità, soprattutto per motivi di sicurezza. Quelle ragioni erano già state spiegate nel corridore CI sullo stesso server di GitLab?
Se, d'altra parte, la tua idea è quella di avviare un processo sul server di build dall'hook pre-commit, allora rallenterà ulteriormente i commit.