Abbiamo un sacco di app e servizi web (alcuni prodotti rivolti al pubblico, alcuni interni e parte di un "backend" privato) che sono interdipendenti l'uno con l'altro. Ognuno di questi componenti ha 4 ambienti (cluster di server / nodi che servono scopi specifici):
- Non-Production
DEV
- Ambiente di sviluppo integrato in cui CI costruisce cambiamenti push; utile per gli ingegneri per risolvere bug difficili da trovare che non sono riproducibili localmenteQA
- Ambiente di prova / QA isolatoDEMO
- Ambiente UAT stabile per gli stakeholder aziendali
- Produzione
LIVE
- Il nostro ambiente live / di produzione
La promozione del codice va: LOCAL
(macchina dello sviluppatore) => DEV
=> QA
=> DEMO
=> LIVE
.
Supponiamo di avere un'applicazione chiamata myapp
che è supportata da un servizio Web RESTful chiamato myws
, che a sua volta è supportato da un DB chiamato mydb
.
Attualmente, tra queste dipendenze abbiamo quella che definirei promozione " orchestrata ": i myapp-dev
punti a myws-dev
cui si serve mydb-dev
. Allo stesso modo, myapp-qa
indica a myws-qa
quali usi mydb-qa
. Lo stesso per DEMO
e LIVE
.
Il problema è che ogni volta che apporto una modifica, diciamo myapp
, ciò mi richiede di apportare modifiche myws
e mydb
anche. Ma poiché ogni DEV
ambiente punta agli ambienti delle sue dipendenze DEV
, significa che devo pianificare e implementare tutte queste modifiche contemporaneamente. Inoltre, se una build diventa instabile / rotta, spesso porta giù altri componenti a monte; per esempio se uno sviluppatore rompe qualcosa quando cambia mydb-dev
, anche i cluster myws-dev
e myapp-dev
diventano di solito instabili.
Per risolvere questo problema, sto mettendo insieme una proposta per quella che definirei una strategia di promozione " insensata ": tutte le dipendenze tra componenti seguono questa linea guida:
- Dipendenze a monte dipendono
DEMO
ambiente per loro dipendenze a valle, per tutte le loro ambienti non di produzione (DEV
,QA
eDEMO
); e - Le dipendenze a monte dipendono
LIVE
dall'ambiente per le loro dipendenze a valle per il loro ambiente di produzione
Usando questa convenzione, myapp-dev
attiveremmo a tutti myws-demo
, che sarebbe utile mydb-demo
. Allo stesso modo, myapp-qa
indicherebbe anche myws-demo
e mydb-demo
.
Il vantaggio che posso trovare è la stabilizzazione di compilazione : è molto meno probabile che l' DEMO
ambiente per un particolare componente diventa instabile, perché il codice non ce la fa a DEMO
non rigorosi test sia su DEV
e QA
.
L'unico svantaggio che posso trovare in questo metodo è che, se DEMO
si rompe per un particolare componente, tutti gli ambienti di non produzione per tutte le dipendenze a monte verranno improvvisamente rotti. Ma direi che ciò dovrebbe accadere molto raramente a causa dei test eseguiti su DEV
e QA
.
Questo ha ottenuto di essere un problema che molti sviluppatori (molto più intelligente e con esperienza di me) hanno risolto, e io non sarei sorpreso se questo problema e le sue soluzioni sono già nomi a loro (oltre a ciò che io chiamo orchestrato / silos). Quindi chiedo: i meriti di una strategia di promozione insensata superano qualsiasi contro, e quali sono i contro che potrei trascurare qui?