...often there are untested changes waiting in the test branch which delays delivery of hot fixes for critical bugs in production.
Is there a method that allows for easy hot fixes and not introduce the risk of untested differences when having a separate release branch?
Sì, c'è. Il problema che hai riscontrato è causato da un bug nel flusso di lavoro:
feature1 \
feature2 --> test --> release
hotfix1 /
Come hai visto, se le funzionalità impiegano tempo per testare accuratamente, fungono da barriera per ottenere la correzione a caldo attraverso la pipeline. Il takeaway è che se hai bisogno di ottenere un rilascio in fretta, non ci dovrebbe essere nulla nella pipeline di rilascio che non è molto vicino a essere pronto.
Puoi evitarlo spostando la barriera davanti alla parte di rilascio della pipeline in modo che eventuali ritardi nel test di una modifica rimangano con la modifica:
feature1 --> feature1-test \
feature2 --> feature2-test --> release-test --> release
hotfix1 --> hotfix1-test /
Quando un cambiamento è finito, entra in un ramo separato dove viene testato. Finché i test sono in corso, tutto il lavoro su quel cambiamento avviene tra i due rami. Dopo che il test lo ha approvato, il codice testato viene fuso in un ramo di test pre-release in cui la batteria di test completa viene eseguita ancora una volta prima del rilascio. (In teoria, questa dovrebbe essere una formalità e un non-evento, spiegherò perché più tardi.) Ciò significa che puoi impiegare un tempo lungo per testare feature1
senza ritardare feature2
o hotfix
.
Una cosa importante che viene spesso trascurata è il feedback. Ogni volta che avviene un rilascio, quel codice deve essere unito a tutte le filiali in cui vengono effettuati lo sviluppo e i test. Se hotfix1
rompe feature1
, vuoi scoprirlo in feature1-test
in modo che possa essere corretto lì e non ostacolerà il rilascio di un rilascio contenente hotfix2
. Se la funzione integra le modifiche rilasciate in anticipo, ci dovrebbero essere meno sorprese in release-test
. Questa disposizione consente di trattare gli hotfix e le funzionalità allo stesso modo da una prospettiva di sviluppo e lascia la decisione se sottoporre un hotfix alla batteria piena di test o sottoporre a una rapida procedura una questione di politica QA. Il flusso di lavoro è lo stesso, non importa cosa, e non c'è un ramo / fusione veloce da / verso il ramo release
.
NB: Ciò che viene descritto qui è un po 'troppo semplicistico perché non tiene conto di qualcosa in feature1
che spezza qualcosa in feature2
. Questa disposizione può essere utilizzata in strutture più complesse dove release-test
diventa integration-test
e che alimenta release-test
.