Temos muitos aplicativos e serviços da Web (alguns produtos voltados ao público, outros internos e parte de um "back-end" privado)) que são interdependentes entre si. Cada um desses componentes possui 4 ambientes (agrupamentos de servidores / nós que atendem a propósitos específicos):
- Não Produção
DEV- Ambiente de desenvolvimento integrado, onde a CI constrói mudanças push; útil para engenheiros para solucionar problemas difíceis de encontrar que não são reproduzíveis localmenteQA- Ambiente de controle de qualidade / teste isoladoDEMO- Ambiente UAT estável para as partes interessadas do negócio
- Produção
LIVE- Nosso ambiente ao vivo / produção
A promoção do código é: LOCAL(máquina do desenvolvedor) => DEV=> QA=> DEMO=> LIVE.
Digamos que temos um aplicativo chamado myappque é apoiado por um serviço da Web RESTful chamado myws, que por sua vez é apoiado por um banco de dados chamado mydb.
Atualmente, temos o que eu chamaria de promoção " orquestrada " entre essas dependências: os myapp-devpontos para os myws-devquais se usa mydb-dev. Da mesma forma, myapp-qapontos para os myws-qaquais utiliza mydb-qa. O mesmo para DEMOe LIVE.
O problema com isto é que a qualquer momento eu fizer uma alteração para, digamos, myapp, isso me obriga a fazer alterações mywse mydbbem. Mas como cada DEVambiente aponta para os ambientes de suas dependências DEV, significa que tenho que agendar e implantar essas alterações ao mesmo tempo. Além disso, se uma construção se torna instável / quebrada, geralmente reduz outros componentes upstream; por exemplo, se um desenvolvedor quebra algo ao mudar mydb-dev, os clusters myws-deve myapp-devgeralmente também se tornam instáveis.
Para resolver isso, estou montando uma proposta para o que eu chamaria de estratégia de promoção "em silos ": todas as dependências entre componentes seguem esta diretriz:
- As dependências upstream dependem do
DEMOambiente para suas dependências downstream, para todos os seus ambientes de não produção (DEV,QAeDEMO); e - Dependências upstream dependem do
LIVEambiente para suas dependências downstream para seu ambiente de produção
Usando esta convenção, myapp-devrealmente apontaria para myws-demo, o que seria usado mydb-demo. Da mesma forma, myapp-qatambém apontaria para myws-demoe mydb-demo.
A vantagem aqui que eu posso encontrar é a estabilização de construção : é muito menos provável que o DEMOambiente para um determinado componente irá tornar-se instável, porque o código não pode fazê-lo até DEMOsem testes rigorosos, tanto em DEVe QA.
A única desvantagem que posso encontrar para esse método é que, se DEMOfor interrompido para um componente específico, todos os ambientes de não produção para todas as dependências upstream serão subitamente interrompidos. Mas eu diria que isso deve acontecer muito raramente por causa dos testes realizados em DEVe QA.
Isto tem de ser um problema que muitos desenvolvedores (muito mais inteligente e experiente do que eu) ter resolvido, e eu não ficaria surpreso se este problema e suas soluções já têm nomes para eles (além de que estou chamando orquestrada / silos). Então pergunto: os méritos de uma estratégia de promoção em silos superam quaisquer contras, e quais são os contras que posso estar negligenciando aqui?