Close

Sviluppo basato su trunk

Scopri perché questa pratica di gestione del controllo delle versioni è comune tra i team DevOps.

Foto di Kev Zettler
Kev Zettler

Full Stack Web Developer


Lo sviluppo basato su trunk è una pratica di gestione del controllo delle versioni per cui gli sviluppatori eseguono il merge di aggiornamenti piccoli e frequenti in un "trunk" o branch principale. Dato che semplifica le fasi di merge e integrazione, aiuta a raggiungere le pipeline CI/CD e aumenta la distribuzione del software e le prestazioni organizzative.

Agli albori dello sviluppo del software, i programmatori non potevano avvalersi dei moderni sistemi di controllo delle versioni. Hanno quindi sviluppato due versioni del loro software, come mezzo per tracciare le modifiche e, se necessario, per annullarle. Nel tempo, questo processo si è rivelato laborioso, costoso e inefficiente.

Con l'evolversi dei sistemi di controllo delle versioni, sono emersi vari stili di sviluppo, che hanno consentito ai programmatori di trovare i bug più facilmente, codificare in parallelo con i colleghi e accelerare la cadenza di rilascio. Oggi, la maggior parte dei programmatori utilizza uno dei due modelli di sviluppo per fornire software di qualità: Gitflow e sviluppo basato su trunk.

Gitflow, che è stato reso popolare per primo, è un modello di sviluppo più rigoroso, in cui solo determinate persone possono approvare le modifiche al codice principale. Ciò mantiene la qualità del codice e riduce al minimo il numero di bug. Lo sviluppo basato su trunk è un modello più aperto, poiché tutti gli sviluppatori hanno accesso al codice principale. Ciò consente ai team di iterare rapidamente e implementare pipeline CI/CD.

Cos'è lo sviluppo basato su trunk?


Lo sviluppo basato su trunk è una pratica di gestione del controllo delle versioni per cui gli sviluppatori eseguono il merge di aggiornamenti piccoli e frequenti in un "trunk" o branch principale. È una pratica comune tra i team DevOps e fa parte del ciclo di vita DevOps poiché semplifica le fasi di merge e integrazione. In effetti, lo sviluppo basato su trunk è una pratica necessaria per le pipeline CI/CD. Gli sviluppatori possono creare branch di breve durata con pochi piccoli commit rispetto ad altre strategie di diramazione delle funzionalità di lunga durata. Con l'aumentare della complessità della codebase e delle dimensioni del team, lo sviluppo basato su trunk aiuta a mantenere il flusso dei rilasci in produzione.

Gitflow vs. sviluppo basato su trunk


Gitflow è un modello di creazione di branch Git alternativo, che prevede l'uso di branch di funzioni e di più branch primari. Gitflow ha branch di lunga durata e commit più ampi rispetto allo sviluppo basato su trunk. Con questo modello, gli sviluppatori creano un branch di funzioni e ne posticipano il merge nel branch principale del trunk fino a quando la funzione non è completata. Questi branch di funzioni di lunga durata richiedono una maggiore collaborazione per il merge e presentano un maggiore rischio di allontanarsi dal branch del trunk e di introdurre aggiornamenti in conflitto.

Scopri la soluzione

Compilare e gestire software con Open DevOps

Materiale correlato

Come ottenere la continuous integration

Gitflow presenta branch principali separati per lo sviluppo, gli aggiornamenti rapidi, le funzionalità e i rilasci. Sono previste diverse strategie per unire i commit tra questi branch. Dato che ci sono più branch tra cui destreggiarsi e da gestire, la complessità è maggiore e sono richieste sessioni di pianificazione e revisioni aggiuntive da parte del team.

Lo sviluppo basato su trunk è molto più semplificato poiché si concentra sul branch principale come fonte di correzioni e rilasci. Nello sviluppo basato su trunk, si presume che il branch principale sia sempre stabile, senza problemi e pronto per la distribuzione.

Vantaggi dello sviluppo basato su trunk


Lo sviluppo basato su trunk è una pratica necessaria per la continuous integration. Se i processi di build e test sono automatizzati ma gli sviluppatori lavorano su branch di funzioni isolati e lunghi, che di rado vengono integrati in un branch condiviso, non viene sfruttato appieno il potenziale della continuous integration.

Lo sviluppo basato su trunk semplifica l'integrazione del codice. Quando gli sviluppatori finiscono un nuovo lavoro, devono eseguire il merge del nuovo codice nel branch principale. Tuttavia, non dovrebbero eseguire il merge delle modifiche al trunk prima di aver verificato di poter completare correttamente la compilazione. Durante questa fase, possono sorgere conflitti se sono state apportate modifiche dall'inizio del nuovo lavoro. In particolare, questi conflitti sono sempre più complessi a mano a mano che i team di sviluppo crescono e la codebase aumenta. Questo accade quando gli sviluppatori creano branch separati che si discostano dal branch di origine e altri sviluppatori eseguono contemporaneamente il merge del codice sovrapposto. Fortunatamente, il modello di sviluppo basato su trunk riduce questi conflitti.

Consente la continuous integration del codice

Nel modello di sviluppo basato su trunk, è presente un repository con un flusso costante di commit che confluisce nel branch principale. L'aggiunta di una suite di test automatizzati e il monitoraggio della code coverage per questo flusso di commit consentono la continuous integration. Quando viene eseguito il merge del nuovo codice nel trunk, vengono eseguiti test di integrazione e code coverage automatizzati per convalidare la qualità del codice.

Garantisce una revisione continua del codice

I rapidi e piccoli commit dello sviluppo basato su trunk rendono la revisione del codice un processo più efficiente. Con piccoli branch, gli sviluppatori possono vedere e rivedere rapidamente le piccole modifiche. Questa procedura è molto più semplice rispetto a un branch di funzioni di lunga durata in cui un revisore legge pagine di codice o ispeziona manualmente un'ampia area di modifiche al codice.

Consente il rilascio consecutivo del codice di produzione

I team dovrebbero effettuare frequenti merge quotidiani con il branch principale. Lo sviluppo basato su trunk mira a mantenere il branch "verde", ovvero pronto per la distribuzione a qualsiasi commit. I test automatizzati, la convergenza del codice e le revisioni del codice forniscono un progetto di sviluppo basato su trunk a garanzia che sia pronto per la distribuzione in produzione in qualsiasi momento. Ciò offre al team l'agilità necessaria per distribuzioni frequenti in produzione e la definizione di ulteriori obiettivi per i rilasci in produzione giornalieri.

Sviluppo basato su trunk e CI/CD

Con la crescita della popolarità di CI/CD, i modelli di diramazione sono stati perfezionati e ottimizzati, portando alla nascita dello sviluppo basato su trunk. Ora lo sviluppo basato su trunk è un requisito della continuous integration. Con la continuous integration, gli sviluppatori gestiscono lo sviluppo basato su trunk insieme a test automatizzati, che vengono eseguiti in seguito a ogni commit a un trunk. Questo garantisce che il progetto funzioni in ogni momento.

Best practice dello sviluppo basato su trunk


Lo sviluppo basato su trunk garantisce che i team rilascino il codice in modo rapido e coerente. Di seguito è riportato un elenco di esercizi e pratiche che aiuteranno a perfezionare la cadenza del tuo team e a sviluppare un programma di rilascio ottimizzato.

Sviluppo in piccoli batch

Lo sviluppo basato su trunk segue un ritmo rapido per la distribuzione del codice alla produzione. Se lo sviluppo basato su trunk fosse come la musica, sarebbe uno staccato rapido: note brevi e concise in rapida successione, mentre i commit del repository sarebbero le note. Mantenere piccoli i commit e i branch favorisce un ritmo più rapido di merge e distribuzioni.

Piccole modifiche di un paio di commit o la modifica di poche righe di codice riducono al minimo il sovraccarico cognitivo. È molto più facile per i team avere conversazioni significative e prendere decisioni rapide esaminando un'area di codice limitata rispetto a una serie estesa di modifiche.

Flag delle funzioni

I flag delle funzioni integrano al meglio lo sviluppo basato su trunk consentendo agli sviluppatori di inserire le nuove modifiche in un percorso di codice inattivo e attivarlo in un secondo momento. Ciò permette agli sviluppatori di rinunciare alla creazione di un branch di funzioni del repository separato e di eseguire invece il commit del codice delle nuove funzionalità direttamente al branch principale in un percorso di flag delle funzioni.

I flag delle funzioni incoraggiano direttamente gli aggiornamenti in piccoli batch. Invece di creare un branch di funzioni e attendere la compilazione della specifica completa, gli sviluppatori possono creare un commit del trunk che introduce il flag delle funzioni ed esegue il push di nuovi commit del trunk, che compileranno la specifica della funzione direttamente all'interno del flag.

Implementare test automatizzati completi

I test automatizzati sono necessari per qualsiasi progetto software moderno che intenda raggiungere pipeline CI/CD. Esistono diversi tipi di test automatizzati eseguiti in diverse fasi della pipeline di rilascio. Unit test e test di integrazione di breve durata vengono eseguiti durante lo sviluppo e dopo il merge del codice. I test end-to-end con esecuzione più lunga vengono effettuati in fasi successive della pipeline in un ambiente di staging o produzione completo.

I test automatizzati favoriscono lo sviluppo basato su trunk, mantenendo un ritmo di batch ridotto mentre gli sviluppatori eseguono il merge di nuovi commit. La suite di test automatizzati esamina il codice per eventuali problemi e lo approva o lo rifiuta automaticamente. Questo aiuta gli sviluppatori a creare rapidamente commit ed eseguirli attraverso test automatizzati per vedere se introducono nuovi problemi.

Eseguire revisioni asincrone del codice

Nello sviluppo basato su trunk, la revisione del codice deve essere eseguita immediatamente e non inserita in un sistema asincrono per una revisione successiva. I test automatizzati forniscono un livello di revisione preventiva del codice. Quando gli sviluppatori sono pronti a esaminare la pull request di un membro del team, possono innanzitutto verificare che i test automatizzati siano stati superati e che la code coverage sia aumentata. Questo fornirà al revisore una rassicurazione immediata che il nuovo codice soddisfa determinate specifiche. Il revisore potrà quindi concentrarsi sulle ottimizzazioni.

Avere tre o meno branch attivi nel repository del codice dell'applicazione

Una volta eseguito il merge di un branch, è buona prassi eliminarlo. Un repository con una grande quantità di branch attivi presenta alcuni effetti collaterali spiacevoli. Sebbene possa essere utile per i team vedere quali lavori siano in corso esaminando i vari branch attivi, questo vantaggio viene perso in presenza di branch inattivi e obsoleti. Alcuni sviluppatori utilizzano interfacce utente Git che possono diventare difficili da utilizzare quando si carica un gran numero di branch remoti.

Eseguire il merge dei branch almeno una volta al giorno

I team di sviluppo ad alte prestazioni e basati su trunk dovrebbero chiudere ed eseguire il merge di tutti i branch aperti e pronti per il merge almeno su base giornaliera. Questo esercizio aiuta a mantenere il ritmo e imposta una cadenza per il monitoraggio dei rilasci. Il team può quindi taggare il trunk principale alla fine della giornata come commit del rilascio, il che ha l'utile effetto collaterale di generare un incremento giornaliero di rilascio agile.

Numero ridotto di blocchi del codice e fasi di integrazione

I team CI/CD agile non dovrebbero aver bisogno di blocchi o pause pianificati del codice per le fasi di integrazione, sebbene un'organizzazione possa averne bisogno per altri motivi. Il concetto di "continuo" in CI/CD implica che gli aggiornamenti scorrono costantemente. I team di sviluppo basato su trunk dovrebbero cercare di evitare di bloccare i blocchi del codice e pianificare di conseguenza per garantire che la pipeline di rilascio non vada in stallo.

Compilare velocemente ed eseguire immediatamente

Per mantenere una cadenza di rilascio rapida, i tempi di esecuzione della build e del test devono essere ottimizzati. Gli strumenti di compilazione di CI/CD devono utilizzare livelli di caching, laddove appropriato, per evitare costosi calcoli statici. I test devono essere ottimizzati per l'utilizzo di stub appropriati per i servizi di terze parti.

In conclusione...


Lo sviluppo basato su trunk è attualmente lo standard per i team di progettazione ad alte prestazioni poiché imposta e mantiene una cadenza di rilascio del software utilizzando una strategia di ramificazione Git semplificata. Inoltre, lo sviluppo basato su trunk offre ai team di progettazione maggiore flessibilità e controllo sul modo in cui distribuiscono il software all'utente finale.

Bitbucket di Atlassian è dotato di funzionalità CI/CD integrate che consentono lo sviluppo basato su trunk. Provalo subito.

Kev Zettler
Kev Zettler

Kev è uno sviluppatore web full-stack lead e imprenditore seriale con oltre un decennio di esperienza nella creazione di prodotti e team con metodologie Agile. È un appassionato collaboratore, autore e insegnante nell'ambito delle tecnologie open source emergenti come DevOps, criptovaluta e realtà aumentata/virtuale. Nel tempo libero, partecipa a competizioni dedicate allo sviluppo di giochi indie.


Condividi l'articolo

Letture consigliate

Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.

Illustrazione su Devops

Community DevOps

Illustrazione su Devops

Leggi il blog

Illustrazione di una mappa

Inizia gratis

Iscriviti alla nostra newsletter DevOps

Thank you for signing up