A integração contínua é um enorme passo em frente na produtividade e na qualidade para a maioria dos projetos que a adotam. Ele garante que as equipes que trabalham em conjunto para criar sistemas grandes e complexos podem fazê-lo com um nível mais elevado de confiança e controle do que é possível sem ele. A CI garante que o código que criamos, como uma equipe, funciona fornecendo feedback rápido sobre quaisquer problemas que possamos apresentar com as mudanças que cometemos. É principalmente focado em afirmar que o código compila com sucesso e passa um corpo de unidade e testes de aceitação. No entanto, CI não é suficiente.
Consequências importantes da aplicação deste padrão
Implantação contínua
Primeiramente, você é impedido eficazmente de liberar em construções de produção que não são testadas completamente e encontradas para ser cabidas para sua finalidade pretendida.
Os bugs de regressão são evitados, especialmente quando correções urgentes precisam ser lançadas na produção (tais correções passam pelo mesmo processo que qualquer outra alteração).
Em nossa experiência, também é extremamente comum que o software recém-lançado seja quebrado devido a alguma interação imprevista entre os componentes do sistema e seu ambiente, por exemplo, devido a uma nova topologia de rede ou a uma ligeira diferença na configuração de um servidor de produção. A disciplina do pipeline de implementação contínua minimiza isso.
Em segundo lugar, quando a implantação e a liberação de produção são automatizadas, elas são rápidas, repetíveis e confiáveis. Muitas vezes é muito mais fácil executar uma versão, uma vez que o processo é automatizado, porque se tornam eventos “normais” – o que significa que, se você escolher, pode executar lançamentos com mais frequência.
Esse é particularmente o caso em que você é capaz de voltar para uma versão anterior, bem como avançar. Quando esse recurso está disponível, as liberações são essencialmente sem risco. O pior que pode acontecer é você descobrir que introduziu um bug crítico – nesse ponto você volta a uma versão anterior que não contém o bug enquanto você corrige a nova versão off-line.
Para alcançar esse estado invejável, precisamos automatizar uma série de testes que provem que nossos candidatos à liberação estão aptos para seu propósito. Devemos também automatizar a implantação em ambientes de teste, de preparação e de produção para remover essas etapas manualmente intensivas e propensas a erros.
Para muitos sistemas, outras formas de teste e outras etapas no processo de liberação também são necessárias, mas o subconjunto que é comum a todos os projetos é o seguinte.
Fase de confirmação e estágios de teste
- A fase de confirmação afirma que o sistema funciona no nível técnico. Ele compila, passa um conjunto de testes automatizados (principalmente em nível de unidade) e executa análise de código.
- Estágios de teste de aceitação automatizados afirmam que o sistema funciona no nível funcional e não funcional, que atende às necessidades de seus usuários e às especificações do cliente.
- Os estágios de teste manuais afirmam que o sistema é utilizável e cumpre seus requisitos, detecta defeitos não capturados por testes automatizados e verifica se fornece valor aos seus usuários. Esses estágios podem tipicamente incluir ambientes de testes exploratórios, ambientes de integração e UAT (aceitação do usuário Teste).
Etapa de liberação entrega o sistema aos usuários
A etapa de liberação entrega o sistema aos usuários, seja como software empacotado ou implantando-o em um ambiente de produção ou de preparação (um ambiente de teste é um ambiente de teste idêntico ao ambiente de produção).
Referimo-nos a estes estágios, e quaisquer adicionais que possam ser necessários para modelar seu processo de entrega de software, como um pipeline de implantação. Também é referido, às vezes, como um encanamento contínuo da integração, da configuração, uma linha de produção do desenvolvimento, ou uma configuração viva.
Qualquer que seja chamado a etapa de liberação, este é, fundamentalmente, um processo automatizado de entrega de software. Isto não pretende implicar que não haja interação humana com o sistema através deste processo de liberação; em vez disso, garante que os passos propensos a erros e complexos sejam automatizados, confiáveis e repetíveis na execução.
Na verdade, a interação humana é aumentada: A capacidade de implantar o sistema em todos os estágios de seu desenvolvimento pressionando um botão encoraja seu uso frequente por testadores, analistas, desenvolvedores e (mais importante) usuários.
A solução é adaptar uma visão mais holística, de ponta a ponta, do processo de entrega. Já abordamos vários aspectos e questões mais amplas de gerência de configuração e automação de grandes partes do processo de compilação, testes e implantação. Chegamos ao ponto em que a implantação de uma aplicação, mesmo em produção, pode ser feita com um simples apertar de um botão para selecionar a versão que queremos implantar.
Isso cria um poderoso ciclo de feedback. Já que é tão fácil implantar a aplicação em ambientes de testes, o time recebe um feedback rápido, tanto sobre o código, quanto sobre o processo de implantação.
Como o processo de implantação (seja para uma máquina de desenvolvimento ou para a versão final) é automatizado, ele é executado regularmente, e portanto, testado regularmente reduzindo o risco de uma versão e transferindo conhecimento de implantação para o time de desenvolvimento.
O resultado (em jargão lean) é um sistema puxado. Equipes de testes podem criar e implantar seus próprios ambientes de testes com o apertar de um botão; equipes de operação também podem implantar versões em homologação ou produção com o apertar de um botão.
Desenvolvedores podem ver quais versões passaram por quais estágios do processo de entrega e quais problemas foram encontrados, e gerentes podem verificar e monitorar métricas fundamentais como tempo de ciclo, throughput (taxa de transferência) e qualidade de código.
Como resultado, todos os envolvidos no processo de entrega conseguem acesso àquilo de que precisam e quando precisam, além de visibilidade sobre o processo de entrega de modo a identificar, otimizar e remover gargalos. Isso leva a um processo de entrega que não é somente mais rápido, como mais seguro.
Implementação de ponta a ponta
Implantação contínua
A implementação de ponta a ponta de automação do processo de compilação, testes e implantação tem diversos efeitos secundários, trazendo benefícios inesperados. Um desses resultados é que, depois de utilizar as mesmas técnicas em vários projetos, identifica-se o que há de comum nos sistemas de pipelines de implantação contínua que são construídos.
Acreditamos que, com as abstrações identificadas, alguns padrões se encaixam em todos os projetos nos quais os experimentamos até agora. Essa compreensão nos permitiu criar processos bastante sofisticados de compilação, testes e entrega desde o início dos projetos. Esse pipeline de implantação contínua de ponta a ponta também significa que experimentamos um grau de liberdade e flexibilidade em nossos projetos que seria difícil de imaginar alguns anos atrás.
Estamos convencidos de que essa abordagem nos permite criar, testar e implantar sistemas complexos de maior qualidade, cujos custos e riscos são significativamente menores do que teríamos feito sem ela. É para isso que o pipeline de implantação contínua existe.
Assim, o processo modelado pelo pipeline de implantação contínua – o processo de levar o software de um commit à entrega – torna-se parte do processo de levar uma funcionalidade da mente do cliente ou usuário até suas mãos.
O processo como um todo pode ser modelado como um mapa de fluxo de valor. Um fluxo de valor em alto nível para a criação de um novo produto é mostrado na figura abaixo.