No, non lo è, per due motivi:
Velocità
I commit dovrebbero essere veloci. Un commit che richiede 500 ms., Ad esempio, è troppo lento e incoraggerà gli sviluppatori a impegnarsi in modo più parsimonioso. 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 progetti più grandi con migliaia di test 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, ad esempio, cento test unitari, impiegano almeno un secondo per essere eseguiti su un server medio, ma spesso molto più 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, o eseguirà test su più server, il che rallenterà solo le cose.
Entrambe pagano bene quando si hanno migliaia di test (oltre a test funzionali, di sistema e di integrazione), consentendo di eseguirli in pochi minuti anziché in settimane, ma questo non è di aiuto per progetti su piccola scala.
Quello che puoi fare, invece, è:
-
Incoraggiare gli sviluppatori a eseguire test strongmente correlati al codice che hanno modificato localmente prima di eseguire un commit. Probabilmente non possono eseguire migliaia di test unitari, ma possono eseguire cinque-dieci di essi.
Assicurati che trovare test rilevanti e eseguirli sia effettivamente facile (e veloce). Visual Studio, ad esempio, è in grado di rilevare quali test possono essere interessati dalle modifiche apportate dall'ultima esecuzione. Altri IDE / piattaforme / linguaggi / framework possono avere funzionalità simili.
-
Mantieni il commit il più velocemente possibile. Applicare le regole di stile è OK, perché spesso è l'unico posto dove farlo e perché tali controlli sono spesso sorprendentemente veloci. Fare analisi statiche è OK non appena si mantiene veloce, che è raramente il caso. Eseguire test di unità non è OK.
-
Esegui i test delle unità sul tuo server per l'integrazione continua.
-
Assicurati che gli sviluppatori siano informati automaticamente quando hanno rotto la build (o quando i test unitari hanno fallito, che è praticamente la stessa cosa se consideri un compilatore uno strumento che controlla alcuni degli errori possibili che puoi introdurre nel tuo codice).
Ad esempio, andare a una pagina web per controllare le ultime build non è una soluzione. Dovrebbero essere informati automaticamente . Mostrare un popup o inviare un SMS sono due esempi di come potrebbero essere informati.
-
Assicurati che gli sviluppatori comprendano che interrompere la compilazione (o test di regressione falliti) non è OK, e che non appena ciò accade, la loro priorità è quella di risolverlo. Non importa se stanno lavorando su una funzione ad alta priorità che il loro capo ha chiesto di spedire per domani: hanno fallito la build, dovrebbero risolverlo.
Sicurezza
Il server che ospita il repository non deve eseguire codice personalizzato, come i test di unità, soprattutto per motivi di sicurezza. Queste ragioni sono già state spiegate nel runner CI sullo stesso server di GitLab?
Se, d'altra parte, la tua idea è quella di avviare un processo sul build server dal hook pre-commit, quindi rallenterà ancora di più i commit.