Tecnologia do DevOps: automação de implantação

A automação de implantação é o que permite implantar software em ambientes de teste e produção com apenas um clique. A automação é essencial para reduzir o risco de implantações de produção. Também é essencial para fornecer feedback rápido sobre a qualidade do software, permitindo que as equipes realizem testes abrangentes o mais rápido possível após as alterações.

Um processo de implantação automatizada tem as seguintes entradas:

  • Pacotes criados pelo processo de integração contínua (CI, na sigla em inglês), que devem ser implantáveis em qualquer ambiente, incluindo produção.
  • Scripts para configurar o ambiente, implantar os pacotes e executar um teste de implantação, às vezes conhecido como teste preliminar.
  • Informações de configuração específicas do ambiente.

Recomendamos armazenar os scripts e informações de configuração no controle de versão. Seu processo de implantação deve fazer o download dos pacotes de um repositório de artefatos (por exemplo, Container Registry, Nexus, Artifactory ou o repositório integrado da ferramenta de CI).

Os scripts geralmente executam as seguintes tarefas:

  1. Preparar o ambiente de destino, talvez instalando e configurando software que seja necessário ou iniciando um host virtual a partir de uma imagem pré-preparada em um provedor de nuvem como o Google Cloud.
  2. Implantar os pacotes.
  3. Executar quaisquer tarefas relacionadas à implantação, como a execução de scripts de migração de banco de dados.
  4. Executar configuração que seja necessária.
  5. Executar um teste de implantação para garantir que todos os serviços externos necessários estejam acessíveis e que o sistema esteja funcionando.

Como implementar a automação de implantação

Quando você projeta o processo de implantação automatizada, é recomendável seguir estas práticas recomendadas:

  • Usar o mesmo processo de implantação para todos os ambientes, incluindo produção. Essa regra garante que você teste o processo de implantação várias vezes antes de usá-lo para implantar na produção.
  • Permitir que qualquer pessoa com as credenciais necessárias implante qualquer versão do artefato em qualquer ambiente sob demanda de modo totalmente automatizado. Se você precisar criar um tíquete e esperar que alguém prepare um ambiente, não terá um processo de implantação totalmente automatizado.
  • Usar os mesmos pacotes para todos os ambientes. Esta regra significa que você deve manter a configuração específica do ambiente separada dos pacotes. Dessa forma, você sabe que os pacotes que está implantando na produção são os mesmos que testou.
  • Possibilitar a recriação do estado de qualquer ambiente a partir das informações armazenadas no controle de versão. Essa regra garante que as implantações sejam repetíveis e, no caso de um cenário de recuperação de desastres, o estado da produção possa ser restaurado de maneira determinista.

O ideal é ter uma ferramenta que possa ser usada de forma autônoma para fazer implantações, que registre quais versões estão atualmente em cada ambiente e registre a saída do processo de implantação para fins de auditoria. Muitas ferramentas de CI têm esses recursos.

Dificuldades comuns na automação de implantação

Ao automatizar o processo de implantação, você enfrenta as seguintes dificuldades:

  • complexidade do processo atual
  • dependências entre serviços
  • componentes que não foram projetados para automação
  • colaboração ruim entre equipes

Complexidade

A primeira dificuldade é a complexidade. Automatizar um processo manual, complexo e frágil produz um processo automatizado, complexo e frágil. Você primeiro precisa remodelar a arquitetura para fins de implantação. Isso significa tornar o script de implantação o mais simples possível e inserir a complexidade no código do aplicativo e na plataforma da infraestrutura. Procure os modos de falha de implantação e pergunte como evitá-los, tornando seus serviços, componentes, plataforma da infraestrutura e monitoramento mais inteligentes. Aplicativos nativos da nuvem em execução em uma plataforma como serviço, como App Engine, Cloud Run ou Pivotal Cloud Foundry, geralmente podem ser implantados com a execução de um único comando, sem a necessidade de nenhum script de implantação, o que é o processo ideal.

Há duas propriedades importantes de um processo de implantação confiável. Primeiro, as etapas individuais do processo de implantação devem ser, na medida do possível, idempotentes, para que você possa repeti-las quantas vezes forem necessárias em caso de falha. Segundo, elas devem ser independentes da ordem, ou seja, componentes e serviços não devem falhar de modo descontrolado se algum outro componente ou serviço que eles esperam estiver ausente. Em vez disso, os serviços devem continuar funcionando de forma degradada até que suas dependências fiquem disponíveis.

Para novos produtos e serviços, recomendamos tratar esses princípios como requisitos do sistema desde o início da fase de design. Se você estiver adaptando a automação de um sistema atual, talvez precise fazer algo para implementar essas características ou criar na telemetria, de modo que o processo de implantação possa detectar estados inconsistentes e falhar de forma suave.

Dependências

A segunda dificuldade é que muitos processos de implantação, especialmente em ambientes corporativos, exigem orquestração. Em outras palavras, você precisa implantar vários serviços juntos em uma ordem específica, enquanto realiza outras tarefas, como migrações de banco de dados em sincronização estrita. Existem muitas ferramentas de fluxo de trabalho de implantação corporativa para ajudar nessa situação, mas elas são basicamente paliativos para um problema de arquitetura: a estrita associação entre vários componentes e serviços. Com o tempo, você precisa resolver essa associação estrita. A meta é que os serviços sejam implantáveis de forma independente, sem necessidade de orquestração.

Essa abordagem costuma exigir um design cuidadoso para garantir que cada serviço aceite a compatibilidade com versões anteriores, de modo que os clientes do serviço não precisem de upgrade na etapa de bloqueio, mas possam ser receber upgrade de forma independente em uma data posterior. Técnicas como controle de versões de API podem ajudar nessa tarefa. Também é importante garantir que os serviços continuem funcionando (talvez com algumas funcionalidades indisponíveis), mesmo que não consigam se conectar a outros serviços de que dependem. Esse design é bom para sistemas distribuídos, porque ajuda a evitar falhas em cascata. O livro "Release It!", de Michael Nygard, descreve vários padrões para ajudar no projeto de sistemas distribuídos, incluindo disjuntores. É possível até desassociar upgrades de banco de dados dos serviços de que dependem usando o padrão de alteração paralela.

Não projetado para automação

Uma terceira dificuldade comum são os componentes que não são projetados para automação. Qualquer processo de implantação que exija login em um console e interação manual por meio de cliques deve ser alvo de aprimoramento. Hoje, a maioria das plataformas (incluindo o Google Cloud) oferece uma API que o script de implantação pode usar. Se esse não for o caso, será preciso ser criativo para evitar essa intervenção manual, talvez encontrando o arquivo de configuração ou banco de dados subjacente da ferramenta e fazendo alterações diretamente nele ou substituindo-o por outra ferramenta que tenha uma API.

Colaboração ruim entre equipes

A última dificuldade ocorre quando desenvolvedores e equipes de operações de TI não estão sincronizados. Isso pode acontecer de algumas maneiras. Por exemplo: os desenvolvedores podem usar um método para implantar que seja diferente do método usado pelas operações de TI. Ou então, em outro exemplo, se os ambientes forem configurados de formas diferentes, você aumentará substancialmente o risco de que o processo de implantação seja realizado manualmente pelas operações de TI, o que introduz inconsistências e erros. O processo de automação de implantação precisa ser criado por desenvolvedores e operações de TI em trabalho conjunto. Essa abordagem garante que ambas as equipes possam entender, manter e evoluir a automação de implantação.

Formas de melhorar a automação de implantação

A primeira etapa é documentar o processo de implantação atual em uma ferramenta comum à qual desenvolvedores e operações tenham acesso, como o Documentos Google ou um wiki. Em seguida, busque simplificar e automatizar incrementalmente o processo de implantação. Essa abordagem normalmente inclui as seguintes tarefas:

  • empacotar o código de modo adequado para implantação;
  • criar imagens ou contêineres de máquinas virtuais pré-configuradas;
  • automatizar a implantação e a configuração de middleware;
  • copiar pacotes ou arquivos no ambiente de produção;
  • reiniciar servidores, aplicativos ou serviços;
  • gerar arquivos de configuração a partir de modelos;
  • executar testes automatizados de implantação para garantir o funcionamento e a correta configuração do sistema;
  • executar procedimentos de teste;
  • criar script e automatização de migrações de banco de dados.

Busque remover etapas manuais e implementar idempotência e independência de ordem sempre que possível, bem como aproveitar os recursos da sua plataforma de infraestrutura sempre que possível. Lembre-se: a automação de implantação deve ser o mais simples possível.

Formas de medir a automação de implantação

A medição da automação de implantação é simples.

  • Conte o número de etapas manuais no seu processo de implantação. Busque reduzir sistematicamente essas etapas. O número de etapas manuais aumenta o tempo de implantação e a oportunidade de erro.
  • Avalie o nível (ou porcentagem) de automação no pipeline de implantação. Busque aumentar continuamente esse nível.
  • Determine o tempo gasto em atrasos no pipeline de implantação. Enquanto você busca reduzir esses atrasos, entenda onde e por que o código é interrompido no pipeline de implantação.

A seguir