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 myappche è 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-devpunti a myws-devcui si serve mydb-dev. Allo stesso modo, myapp-qaindica a myws-qaquali usi mydb-qa. Lo stesso per DEMOe LIVE.
Il problema è che ogni volta che apporto una modifica, diciamo myapp, ciò mi richiede di apportare modifiche mywse mydbanche. Ma poiché ogni DEVambiente 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-deve myapp-devdiventano 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
DEMOambiente per loro dipendenze a valle, per tutte le loro ambienti non di produzione (DEV,QAeDEMO); e - Le dipendenze a monte dipendono
LIVEdall'ambiente per le loro dipendenze a valle per il loro ambiente di produzione
Usando questa convenzione, myapp-devattiveremmo a tutti myws-demo, che sarebbe utile mydb-demo. Allo stesso modo, myapp-qaindicherebbe anche myws-demoe mydb-demo.
Il vantaggio che posso trovare è la stabilizzazione di compilazione : è molto meno probabile che l' DEMOambiente per un particolare componente diventa instabile, perché il codice non ce la fa a DEMOnon rigorosi test sia su DEVe QA.
L'unico svantaggio che posso trovare in questo metodo è che, se DEMOsi 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 DEVe 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?