Il mio team attualmente utilizza un processo di diramazione / distribuzione abbastanza semplice simile al seguente:
┌────────┐ ┌────┐ ┌──────┐
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 usa quel ramo. Quando vogliamo promuovere da un ambiente all'altro, ad esempio, da DEV a QA, uniamo il master
ramo qa
e iniziamo un nuovo build di QA (che viene quindi automaticamente distribuito nell'ambiente di QA).
Stiamo considerando di passare a un nuovo processo che eliminerebbe la presenza di un ramo dedicato e la creazione per ogni ambiente. Invece, una versione a rilascio singolo 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 all'altro non sarebbe più gestita nel controllo del codice sorgente; piuttosto, prenderemmo i binari già creati (il "pacchetto di distribuzione") e li rilasciammo sul nuovo ambiente.
Questo nuovo sistema ci consentirebbe di distribuire qualsiasi build in qualsiasi ambiente, con diversi vantaggi. Ad esempio, è banale testare le correzioni di bug PROD in DEV e QA. Il nostro sistema attuale non fornisce un modo semplice per farlo senza il rollback di un ramo, che ovviamente vorremmo evitare.
Il più grande svantaggio di questo nuovo sistema è che non abbiamo più un modo automatico di tracciare il codice in quale ambiente. Se dobbiamo apportare una correzione in PROD, non abbiamo più un ramo dedicato sincronizzato con l'attuale base di codice di produzione. Lo stesso vale per il QA: se vogliamo spingere una rapida modifica al QA senza trascinare il lavoro in corso master
, non abbiamo più un ramo che rifletta lo stato attuale dell'ambiente QA.
Come possiamo tenere traccia di quale codice è presente in ciascun ambiente?
Alcune opzioni che stiamo considerando:
- utilizzando i tag git per tenere traccia di quale commit è in quale ambiente
- incorporare il commit git utilizzato dalla build in ciascun pacchetto di distribuzione