In un progetto web continuamente sviluppato (non un prodotto) attualmente abbiamo la seguente strategia di branching, approssimativamente basata sul flusso git :
- sviluppare ramo: ultima versione funzionante
- ramo principale: versione da rilasciare / versione rilasciata
- rami delle caratteristiche: caratteristiche in sviluppo
- hotfix branch: correzioni di bug urgenti nella versione rilasciata
Il master è di sola lettura, aggiornato tramite richieste pull dai rami di sviluppo o hotfix . Ogni aggiornamento comporta la creazione e la distribuzione di un candidato al rilascio nel sistema di gestione temporanea. I candidati al rilascio vengono distribuiti in produzione dopo l'approvazione manuale.
I rami delle caratteristiche vengono creati in base allo sviluppo o dall'ultimo commit che è stato unito in master. Viene sviluppata una richiesta pull da un ramo di funzionalità da sviluppare, distribuita a un sistema di test gratuito in cui vengono eseguiti test di integrazione e test di accettazione (automatici e manuali). Una volta testato e rivisto con successo, il PR viene unito, in modo da diventare parte della prossima versione (ovvero unire dallo sviluppo al master).
Il mio obiettivo
Vorrei semplificare questo aspetto e liberarmi del ramo di sviluppo. Il ramo di sviluppo ha principalmente ragioni storiche e poiché è sempre una versione testata con successo, penso che non sia necessario tenerlo separato dal master. La sua rimozione semplificherà anche il processo di rilascio perché non è più presente alcuna unione aggiuntiva.
Ho i seguenti vincoli:
- le versioni sono programmate e non dovrebbero essere completamente automatizzate
- mentre i rami delle funzionalità hanno in genere una durata breve, alcuni rimangono immersi per diverse settimane (ad esempio una riprogettazione) ma devono essere testati (attualmente come richieste pull aperte per lo sviluppo)
- a volte una singola funzionalità dovrebbe essere rilasciata al di fuori della versione normale, trasformandola efficacemente in un aggiornamento rapido. Con la strategia attuale posso riformulare un ramo di funzionalità e unirlo direttamente al master
- succede anche che abbiamo bisogno di trattenere le funzionalità dopo che i test di accettazione con sistemi esterni in fase di gestione temporanea non sono riusciti
Dove non sono sicuro della transizione:
- attualmente sto creando richieste pull per i test e unendo commit per le versioni. Posso unificare questo?
- come gestire gli aggiornamenti rapidi quando il master è in vista dell'ultima versione. Devo compilare e distribuire le versioni direttamente dai rami hotfix?
- esiste un modo sensato per gestire le funzionalità che dovrebbero essere escluse da una versione dopo che sono già state unite? Un ramo di sviluppo separato è davvero un vantaggio per questi casi? La maggior parte delle volte finisco per ripristinare e ripristinare gli commit manualmente comunque.