Integra presto, integra spesso. Costruisci una codebase condivisa con fiducia.
L'Integrazione Continua è ampiamente fraintesa. Non è solo un server di build. Non è solo eseguire test ad ogni commit. Questi sono strumenti che supportano la CI—ma la CI stessa è una pratica.
La vera CI significa:
La parte "continua" è fondamentale. Se integri settimanalmente, non è continuo. Se hai branch di funzionalità di lunga durata, non è continuo. CI significa integrare il tuo lavoro con quello di tutti gli altri ogni giorno, di solito più volte al giorno.
La CI È una Pratica Sociale
La CI riguarda il modo in cui il team lavora insieme, non solo gli strumenti. Un server Jenkins che esegue test su branch vecchi di un mese non è CI.
La vera CI richiede lo sviluppo basato sul trunk: tutti fanno commit sul branch principale (spesso chiamato "trunk" o "main").
Sembra spaventoso. Le persone non romperanno le cose? È qui che entra in gioco la disciplina:
I branch di lunga durata sono il nemico della CI. Quando sviluppi su un branch per settimane, non stai integrando. Stai solo posticipando l'integrazione—e più aspetti, più diventa difficile.
Branch per ore, non per giorni. Integra quotidianamente, non settimanalmente.
Uno sviluppatore crea un branch, lavora per 2-3 ore, esegue tutti i test localmente, poi fa merge su main. Questo accade 3-4 volte al giorno per sviluppatore. L'integrazione è noiosa perché i conflitti sono rari e piccoli.
Gli sviluppatori creano branch di funzionalità che vivono per 2-3 settimane. Fanno merge su main quando la funzionalità è 'completa'. I conflitti di merge sono dolorosi. I bug di integrazione sono comuni. Il 'server CI' testa solo il branch main obsoleto.
Perché la CI funzioni, il ciclo di build e test deve essere veloce. Martin Fowler suggerisce la regola dei 10 minuti: l'intera build, inclusi tutti i test, dovrebbe completarsi in meno di 10 minuti.
Perché 10 minuti? Perché:
Se la tua build richiede troppo tempo:
Alcuni team eseguono un sottoinsieme veloce localmente (test unitari) e la suite completa sul server CI. Va bene purché la suite completa venga eseguita abbastanza velocemente da fornire feedback tempestivo.
La build si romperà. Ciò che conta è cosa succede dopo.
La regola: Quando la build si rompe, risolverla diventa la massima priorità. Tutto il resto si ferma.
Questo può sembrare estremo, ma considera: una build rotta significa che il team non può fidarsi del branch principale. Il lavoro di tutti è bloccato perché non possono integrare in sicurezza. Ogni minuto in cui la build è rotta è un minuto di rischio accumulato.
Chi la risolve? Di solito la persona che l'ha rotta. Ma se è bloccata, altri aiutano. Una build rotta è un problema del team, non un problema individuale.
Come prevenire le rotture:
Alcuni team usano una rotazione "sceriffo CI"—qualcuno responsabile di monitorare la build e coordinare le correzioni. Questo previene l'effetto spettatore dove tutti presumono che qualcun altro la risolverà.
Le Build Rotte Sono Emergenze
Una build rotta che rimane rotta per ore è un fallimento del team. Trattala con la stessa urgenza di un incidente in produzione.
La CI è la base per pratiche più avanzate:
Continuous Delivery (CD): Ogni commit può essere deployato in produzione. Il deployment è una decisione di business, non tecnica.
Continuous Deployment: Ogni commit che supera i test viene automaticamente deployato in produzione. Nessuna approvazione umana richiesta.
Non ogni team ha bisogno del continuous deployment. Ma ogni team beneficia della CI. Inizia da lì.
Metriche CI da monitorare:
La CI non riguarda solo il rilevamento di bug. Riguarda la creazione di un ritmo dove l'integrazione è noiosa, routinaria e sicura. Quando l'integrazione è sicura, tutto il resto diventa più facile.