Infraestrutura como código: como Nosso processo de desenvolvimento / lançamento reformulado para incluir a escala de nossa equipe

(11 de dezembro de 2020)

Neste artigo, mostramos como lidamos com nosso processo de implantação contínua no passado, o que nos levou a mudar o que temos, e quais esforços fizemos para tornar o processo o mais simples / eficaz possível.

O artigo pode dar um gostinho inicial de devops, mas em sua essência, o processo de lançamento afeta todas as equipes e como elas funcionam por conta própria ou colaborar com outras equipes, mostraremos como as funções estão mudando apenas com a mudança do processo.

Sobre nós

Nós da Halan ajudamos oferecendo soluções logísticas sob demanda e de sinalização ( parcelamento, Delivery, pagamento online, E-commerce) para população carente pelas tecnologias existentes em transporte e outros serviços, você pode conferir nosso ap p aqui ( android / iOS )

Dando o processo antigo é devido, o bom e o mau

Começaremos por como tratamos nosso processo no passado e como isso nos afetou positiva ou negativamente.

Para minha equipe, temos quase tudo implantado na AWS com GitHub como nosso sistema de controle de versão, então precisamos descobrir uma maneira de enviar recursos de nossos repositórios GitHub para serviços AWS.

Versões de controle de implantações

Nós dependia do pipeline de código AWS , definimos gatilhos para iniciar um pipeline de implantação sempre que um novo commit é mesclado em um dos ramos principais que representam os estágios conhecidos: dev , prod e encenação ambientes.

visão geral de como as implantações são acionadas

Este fluxo significa que qualquer recurso no branch master está em produção, que certamente torna a fusão para master um tópico tabu para discutir e nem todos tinham que permissão para fundir seu PR no master.

A mesma coisa era para outros ramos, mas não era realmente um problema, uma vez que os envs de desenvolvimento e de teste não são tão assustadores.

Nosso QC começou a testar e verificar os recursos quando eles são mesclados no ambiente de teste, o que significa que eles testam primeiro no ambiente de teste e, em seguida, se verificado , o recurso será mesclado no ramo mestre . parece funcionar bem, mas vamos ver as desvantagens desse processo.

Isso nos permitiu testar e implantar vários recursos ao mesmo tempo em cada estágio (dev, staging), o que é bom e ruim em ao mesmo tempo porque:

  • Isso significa que os desenvolvedores não precisam esperar uns pelos outros para obter controle sobre o ambiente de desenvolvimento / teste.
  • Mas isso significa que os recursos do O estágio dev pode por engano causar um ao outro não funcionar ou work (falso positivo), e ambos os casos são muito ruins e podem fazer com que o código entre em produção enquanto não está realmente funcionando.

Ramificações divergentes, rebase desnecessário

Como você já deve ter notado, dissemos isso para implantar em dev env, você precisa mesclar seu código no branch dev. Bem, essa parte rapidamente bagunçou a linha do tempo de nosso branch, pois:

  • Nem todos os recursos que foram testados no dev entram em produção, então tínhamos commits fantasmas em nosso branch dev unificado .
  • Um laboratório de experimentação, sem dúvida, as pessoas podem descobrir que estão fazendo algo errado depois de um tempo e decidir descartar seus códigos / commits e iniciar um novo, mas isso ainda nos deixa com seus antigos commits fundido no branch dev.

Este tipo de comportamento produziu o que chamamos de divergência entre branches, para fundir um recurso branch que tem master como sua base em dev, você precisa resolver conflitos ! o que é estranhamente estranho, você literalmente em conflito com fantasmas e resolvendo coisas que nunca estarão em produção mais, isso certamente dá a você duas opções ruins:

  • Construa um novo branch para seu recurso bifurcado de seu branch de recurso original e resolva os conflitos nele então, quando terminar o teste, mescle o branch original no master.
  • Resolva os conflitos em seu branch e escolha seus commits em um novo branch ao mesclar com o master.

Com mais desenvolvedores entrando em nossa equipe, as coisas começarão a ficar mais feias e a divergência certamente aumentará.

Renovando o processo de construção / implantação

A primeira coisa que tínhamos em mente é como nos livrar dessas ramificações divergentes, precisamos de um novo método para fornecer recursos para a produção com segurança e controlar quantos recursos são implantados na produção sem envolver o controle de origem com o negócio de implantação.

Uma pequena revisão sobre AWS

Primeiro, precisamos identificar o principal elementos que desempenharão um papel conosco no processo:

  • Github : controle de origem tendo repositórios para cada micro-serviço lá fora.
  • Amazon ECR : um registro de imagem Docker que é dividido em `repos`, cada repo representa um micro-serviço também e contém as imagens que foram enviadas para o serviço X e podem ser usadas ou implantadas neste serviço diretamente para fazê-lo funcionar.
  • Amazon ECS / EC2 / EKS : é aqui que vivem nossos microsserviços, junto com seus ambientes, o ECS é dividido em clusters, cada cluster contém uma série de serviços, cada um tem uma definição de tarefa que contém informações como variáveis ​​de ambiente , especificações de computação, rede, etc.

Portanto, precisamos encontrar uma maneira de uni-los para tornar mais fácil para nós, como equipe de desenvolvimento, fornecer recursos e para o QC controlar e verificar os recursos.

Achamos que poderíamos definir um serviço intermediário, um serviço que é responsável por implantando outros serviços. Tínhamos dois comandos principais que queríamos que este serviço manipulasse:

  • Comando de compilação: nós queremos ser capazes de construir uma imagem e enviá-la para ECR de qualquer branch / commit que quisermos de um determinado repositório GitHub para um determinado repositório ECR.
  • Comando de implantação: queremos ser capazes de implantar uma determinada imagem de um repo no ECR para todos os clusters que mantêm o serviço X.

Vamos pegar cada um desses comandos no microscópio e ver o que cada um deles envolve, começamos com o comando Build :

  • Primeiro de tudo, precisamos clonar o repo no commit / branch especificado.
  • Crie uma imagem do docker usando o Dockerfile nesse repo.
  • Envie o imagem construída para o repositório ECR com uma nova tag, se necessário ou mais recente.

Embora todas essas etapas sejam certamente complicadas le em nosso novo serviço de implantação, mas descobrimos que é complicado, já que a construção de docker imagens consome muito recursos e isso limitará nosso novo serviço a alguns simultâneos implantações ou torná-lo tão gigantesco em recursos.

Concluímos que, em vez de fazer todo esse trabalho no próprio serviço, poderíamos iniciar um novo fluxo de trabalho no Github nesse repo e passar para ele tudo detalhes da tarefa, como para qual branch fazer check-out e qual repositório ECR enviar, quando estiver finalmente concluído, ele sinalizará o usuário de volta usando um web-hook . É claro que existem outras soluções para isso, como Jenkins para melhor segurança e para garantir que seu código seja construído nas máquinas que você gerencia.

Isso mudou o fluxo de trabalho que mencionamos acima, agora funciona da seguinte maneira:

  • Receba os detalhes da versão do usuário.
  • Acione uma ação Github no repositório especificado.
  • As ações do Github irão girar uma nova máquina que nos notificará com o status da compilação quando feito, ele também marcará o commit com o Número do cartão Jira em que você está trabalhando.

O segundo comando é o comando Depoly , que é muito mais simples do que o comando de compilação, aqui só temos que:

  • Receba os detalhes de implantação do usuário.
  • Inicie uma nova tarefa de implantação em cada cluster que contém o serviço e forneça o url da imagem em ECR.

fluxo de trabalho de implantação

É isso mesmo para implantação! apenas um trabalho de facilitação entre dois produtos AWS, vamos comparar este fluxo de trabalho com o que tínhamos antes e ver como nossa estratégia de lançamento mudou.

Usar o novo processo para implantar seu código em qualquer um dos estágios (prod, dev, staging) não requer nenhum tipo de mesclagens , o código é totalmente independente do implantação , poderíamos ter 20 recursos prontos no branch master e apenas escolha implantar 10 deles.

Mas isso também implica que só podemos ter um recurso sendo testado no branch dev, a menos que dois devs concordem em rebase um no outro.

Histórico de implantação e marcação

Isso também nos forneceu uma reversão estratégia contra problemas de produção, agora temos um branch master marcado para cada recurso / tarefa que tínhamos, sempre que enfrentamos um problema de produção e queremos reverter um recurso, podemos navegar facilmente de volta para onde esse recurso começou e reverter para o commit antes, se possível.

> Além disso, isso nos permitiu mesclar todos os recursos de trabalho no branch master, mesmo se eles não forem implantados, ainda podemos tê-los no master prontos para o próximo lote de recursos estar em produção quando necessário, o que certamente ajudará nosso foco da equipe em entregar tarefas sem se preocupar com quando essa tarefa será mesclada com o mestre para ser implantada, aqui nós mesclamos primeiro e depois nos preocupamos com implantações. nosso processo melhor, incluindo variáveis ​​de ambiente e especificações de máquina, todos eles estarão disponíveis como código, sempre que alterarmos essas especificações, que refletirão automaticamente ect em nossas máquinas na AWS no respectivo Ambiente , não há necessidade de codificar manualmente esses valores todas as vezes na AWS.

Com isso, teremos melhor controle e visibilidade em todas as configurações de nossos serviços, tudo em nossa infraestrutura estará em código e a um clique para atualizar! Além disso, isso torna a mudança de nossa infraestrutura independente do provedor de serviços, poderíamos mudar de AWS para a nuvem do Google, por exemplo, e só precisaríamos mudar os comandos usados ​​pelo serviço de implantação para implantar nossa infraestrutura no novo provedor de serviços.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *