Il mio team utilizza attualmente un processo di distribuzione / distribuzione abbastanza semplice simile a questo:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Builds: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Branches: │ master │ │ qa │ │ prod │
└────────┘ └────┘ └──────┘
Ogni ambiente ha il suo ramo (usiamo git ) e la sua build che utilizza quel ramo. Quando vogliamo promuovere da un ambiente a un altro, ad esempio da DEV a QA, uniamo il ramo master
a qa
e avvia una nuova build QA (che viene quindi distribuita automaticamente nell'ambiente QA).
Stiamo valutando la possibilità di passare a un nuovo processo che eliminerebbe il possesso di una filiale dedicata e la creazione di ogni ambiente. Invece, una singola versione di rilascio creerebbe un "pacchetto di distribuzione" che potrebbe quindi essere distribuito in qualsiasi ambiente. Immaginiamo che un tipico flusso di lavoro sia simile a questo:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ ──► │ QA │ ──► │ PROD │
└────────┘ └────┘ └──────┘
▲
\
┌───────────────┐
Builds: │ release build │
└───────────────┘
▲
│
┌────────┐ ┌─────────┐
Branches: │ master │ │ release │
└────────┘ └─────────┘
La promozione da un ambiente ad un altro non verrebbe più gestita nel controllo del codice sorgente; piuttosto, dovremmo semplicemente prendere i binari già costruiti (il "pacchetto di distribuzione") e rilasciarlo nel nuovo ambiente.
Questo nuovo sistema ci consentirebbe di distribuire qualsiasi build in qualsiasi ambiente, che presenta diversi vantaggi. Ad esempio, è banale provare le correzioni dei bug di PROD in DEV e QA. Il nostro sistema attuale non fornisce un modo semplice per farlo senza ripristinare un ramo, cosa che ovviamente vorremmo evitare.
Il più grande svantaggio di questo nuovo sistema è che non abbiamo più un modo automatico per tenere traccia del codice in quale ambiente. Se abbiamo bisogno di fare una correzione in PROD, non abbiamo più una diramazione dedicata in sincronia con la base di codice di produzione corrente. Lo stesso vale per il QA: se vogliamo apportare una rapida modifica al QA senza dragare il lavoro in corso da master
, non abbiamo più un ramo che rifletta lo stato corrente dell'ambiente QA.
Come possiamo tenere traccia del codice presente in ogni ambiente?
Alcune opzioni che stiamo considerando:
- utilizzando tag git per tenere traccia di quale commit è in quale ambiente
- incorporare il commit git utilizzato dalla build in ogni pacchetto di distribuzione