CI/CD: Integração Contínua e Entrega Contínua Explicadas

CI/CD permite que as melhores empresas de tecnologia melhorem seus produtos várias vezes ao dia. Aqui está o que você precisa saber para fazer o mesmo.

ci/cd explained

O que é CI/CD?

CI/CD é uma forma de desenvolver software na qual você pode lançar atualizações a qualquer momento de maneira sustentável. Quando a mudança de código se torna rotina, os ciclos de desenvolvimento se tornam mais frequentes, significativos e rápidos.

“CI/CD” representa as práticas combinadas de Integração Contínua (CI) e Entrega Contínua (CD).

A Integração Contínua é um pré-requisito para CI/CD e exige:

  • Que os desenvolvedores integrem suas mudanças à branch principal do código várias vezes por dia.
  • Que cada integração de código acione uma sequência automatizada de build e testes. Idealmente, os desenvolvedores recebem os resultados em menos de 10 minutos, para que possam continuar focados em seu trabalho.

A tarefa da Integração Contínua é gerar um artefato que possa ser implantado. O papel dos testes automatizados no CI é verificar se o artefato para a versão do código em questão está seguro para ser implantado.

Na prática da Entrega Contínua, as mudanças de código também são implantadas continuamente, embora as implantações sejam acionadas manualmente. Se todo o processo de mover o código do repositório de origem para a produção for totalmente automatizado, o processo é chamado de Implantação Contínua (Continuous Deployment).

Um teste decisivo sobre fazer CI/CD

Se qualquer desenvolvedor da sua equipe puder parar o que está fazendo agora e enviar a versão atual do código para a produção em 20 minutos ou menos, sem ninguém se preocupar com o que pode acontecer — parabéns, você está fazendo CI/CD!

Princípios de CI/CD

As práticas de Entrega Contínua levam o CI mais longe, descrevendo princípios para implantações bem-sucedidas em produção:

  • Arquitetar o sistema de forma que suporte lançamentos iterativos. Evite acoplamento rígido entre os componentes. Implemente métricas que ajudem a detectar problemas em tempo real.
  • Pratique o desenvolvimento orientado a testes para manter o código sempre em um estado implantável. Mantenha um conjunto de testes automatizados abrangente e saudável. Construa monitoramento, logging e tolerância a falhas por design.
  • Trabalhe em pequenas iterações. Por exemplo, se você desenvolver em branches de funcionalidades, elas não devem viver por mais de um dia. Quando precisar de mais tempo para desenvolver novas funcionalidades, use flags de funcionalidades.
  • Os desenvolvedores podem enviar o código para ambientes de staging semelhantes à produção. Isso garante que a nova versão do software funcionará quando chegar às mãos dos usuários.
  • Qualquer pessoa pode implantar qualquer versão do software em qualquer ambiente sob demanda, com o pressionar de um botão. Se for necessário consultar uma wiki sobre como implantar, o jogo acabou.
  • Se você construir, você executa. Equipes de engenharia autônomas devem ser responsáveis pela qualidade e estabilidade do software que constroem. Isso quebra os silos entre desenvolvedores tradicionais e equipes de operações, pois trabalham juntos para alcançar objetivos de alto nível.

Para tornar o CI/CD uma realidade, você precisa automatizar tudo o que puder no processo de entrega de software e executá-lo em um pipeline de CI/CD.

ci/cd process

Exemplos de fluxos de trabalho CI/CD

Aqui está um exemplo simples de um pipeline CI/CD totalmente automatizado (Implantação Contínua):

a simple ci/cd workflow example
CI/CD não deveria ser mais complicado do que o necessário.

Cada alteração na branch master do Git executa os seguintes passos no Semaphore:

  • Compilar o código e os ativos da web, reutilizando o cache de dependências.
  • Executar uma suíte de testes automatizados. Como é uma aplicação JavaScript / Node.js, os testes são escritos com Jest.
  • Se os testes passarem, um bloco de Deploy atualiza o código de produção que é executado na nuvem.

CI/CD com etapas manuais

Aqui está um fluxo de trabalho CI/CD para Kubernetes que inclui mais etapas:

ci/cd workflow example with manual steps
CI/CD multiestágio com Docker e Kubernetes, com etapas manuais para implantação estratégica em ambientes de preparação ou produção (clique para visualizar em tamanho real)

Neste exemplo, cada alteração executa automaticamente as seguintes etapas:

  • Construir a aplicação a partir do código-fonte e dependências.
  • Executar uma suíte de testes automatizados.
  • Se os testes passarem, construir automaticamente uma imagem de contêiner Docker e enviá-la para um registro privado.

No final do pipeline de build do Docker, temos um artefato funcional, uma imagem de contêiner. O desenvolvedor, ou mais formalmente, o gerente de release, pode decidir acionar manualmente:

  • Implantação para staging ou produção, o que pode incluir testes rápidos para verificar se não foram introduzidos problemas significativos.
  • Marcação da imagem do contêiner como um artefato que foi introduzido em produção, para permitir auditorias e reversões.

Quais são os benefícios do CI/CD?

CI/CD é muito mais do que a automação de tarefas para evitar erros humanos. Ele nos permite colocar novas soluções nas mãos dos usuários de forma rápida, eficiente e econômica.

Como Dave Farley, coautor do livro Continuous Delivery e especialista em engenharia de software, aponta em um podcast apresentado pelo Semaphore:

O erro de trilhões de dólares é classificar o desenvolvimento de software como um problema de produção, no sentido de ser capaz de escalá-lo para produzir as coisas de forma mais confiável.

O desenvolvimento de software é sempre um exercício de aprendizado, descoberta e experimentação. […] Se você ler o livro Accelerate e o relatório State of DevOps, os números nos dizem que as organizações que praticam entrega contínua produzem software de maior qualidade mais rapidamente. As pessoas que trabalham nisso se divertem mais e as organizações que praticam isso ganham mais dinheiro.

Dave Farley no podcast Semaphore Uncut

Se a sua empresa pratica CI/CD, ela terá uma vantagem competitiva que permite:

Entregar software com menos risco. As pipelines de CI/CD padronizam os processos de lançamento entre projetos. Ao testar cada alteração no código-fonte, reduzimos as chances de introduzir bugs.

Lançar novos recursos mais frequentemente. Uma pipeline de CI/CD pode visualizar todo o seu caminho, do commit à produção, em uma única tela. Você pode navegar entre as etapas, identificar ineficiências e otimizar o processo. Ao remover os obstáculos à produtividade, você permite que sua empresa tenha sucesso.

Entregar o produto que os usuários precisam. Entregar atualizações frequentemente leva a mais feedback dos usuários. Você pode aproveitar isso fazendo testes A/B de recursos ou testando versões iniciais de produtos com clientes reais. Assim, você evita investir demais em recursos que seus clientes não precisam e foca nos que realmente importam.

Melhorar a produtividade dos desenvolvedores. Equipes de engenharia que não praticam CI/CD frequentemente trabalham sob estresse. Há constantes problemas de implantações ruins e falhas difíceis de corrigir. Os desenvolvedores escrevem muito código que nunca é usado. Branches de recursos longos demais são grandes demais para receber uma revisão adequada, o que degrada a qualidade do código. Por outro lado, CI/CD orienta o gerenciamento de produto a otimizar o impacto para o usuário. Os desenvolvedores implantam o código enquanto ele ainda está fresco em suas mentes. O resultado é uma equipe de engenharia feliz.

Os benefícios do CI/CD se acumulam: ciclos de implantação rápidos levam a atualizações menos arriscadas e mais frequentes, o que leva a um aprendizado mais rápido e mais feedback dos usuários, o que leva a desenvolvedores felizes construindo melhores produtos.

Quando o CI/CD não é viável?

“A Entrega Contínua é ótima, mas não vai funcionar com o meu projeto.” Existem, de fato, alguns casos em que o CD pode não ser adequado:

  • Seus clientes não querem atualizações contínuas em seus sistemas.
  • As regulamentações restringem a forma como o software pode ser atualizado. Por exemplo, atualizar continuamente o software utilizado nas indústrias aeroespacial, de telecomunicações e médica não é uma opção.

Mesmo em um ambiente avesso ao CD, as equipes podem aproveitar os benefícios de implantação fácil e manter o sistema em um estado implantável. Elas também podem praticar e aproveitar ao máximo os benefícios do CI.

Para uma análise mais detalhada sobre CI e suas melhores práticas, leia o guia de Integração Contínua da Semaphore.

Uma jornada típica para CI/CD

Se você está acostumado a ciclos de desenvolvimento longos, será necessário mudar sua mentalidade.

Mas se você está considerando adotar CI/CD, você deu um passo importante!

Pense em qualquer coisa que atrapalhe a prática de CI/CD como dívida técnica e trate isso dessa forma. Estime o trabalho que precisa ser feito. Defina expectativas claras com todas as partes interessadas e agende um tempo para trabalhar nisso.

Há dois marcos principais na sua jornada para o sucesso com CI/CD. O primeiro é implementar CI: integrações rápidas, confiáveis e frequentes. O segundo é implementar CD: automatizar o deployment, torná-lo uma operação de um clique e facilitar o teste de novo código em ambientes semelhantes ao de produção.

Quando as integrações começarem a ficar mais frequentes

1/ A primeira coisa é começar a tratar o master como se você fosse implantá-lo a qualquer momento. Como você nunca fez isso antes, será difícil. Mas é o começo de fazer algo doloroso com frequência até que pare de ser doloroso.

2/ Trate cada falha de teste como um bug. Isso inclui testes inconsistentes. Extraia o log, investigue e corrija-o. Não importa para o que o teste foi feito, você não pode fechar o problema até que esteja corrigido.

3/ Melhore seu conjunto de testes. Você pode precisar reescrever algum código para tornar os testes mais confiáveis. Todos os desenvolvedores devem se comprometer a escrever testes com a mesma atenção que escrevem o código de produção. Com o tempo, você alcançará um ponto onde um teste falho significa que há um bug real. Eventualmente, você atingirá 100% de builds verdes no CI. Esse é o seu primeiro grande marco. Comemore!

4/ Pare de usar branches de funcionalidades de longa duração e comece a criar ramificações por abstração, usando flags de recursos. Assim, todos estarão empurrando para o master e será fácil testar funcionalidades em desenvolvimento com o restante do sistema. Isso permitirá que você detecte problemas imediatamente, ao invés de meses depois, quando o merge acontecer.

5/ Otimize o ciclo de feedback. Investigue testes lentos e melhore-os ou reescreva-os para serem mais rápidos. Invista em uma ferramenta de CI/CD que possa separar seu pipeline de CI em estágios e executar testes em paralelo. Clientes do Semaphore frequentemente relatam melhorias drásticas, como a redução do tempo de build de uma hora ou até duas para cerca de dez minutos. Assim, você testa completamente cada pull request antes de mesclá-lo.

Desenvolver um conjunto de testes automatizados rápido e abrangente é um grande investimento inicial. No entanto, os benefícios são enormes. Testadores e QA podem caçar bugs e fazer verificações mais úteis. Os desenvolvedores ficam confiantes de que podem enviar uma alteração e que o CI irá detectar problemas imprevistos. Essa confiança impulsiona a velocidade de desenvolvimento.

Quando os lançamentos começarem a ficar mais frequentes

6/ O passo final é automatizar o deployment.

Se o seu processo de deployment for manual, comece documentando-o como uma série de tarefas. Uma a uma, automatize cada tarefa com um script (Bash, Makefile) ou uma ferramenta de gerenciamento de configuração, como Ansible, Chef ou Puppet. Quando terminar, reúna todas as tarefas em um pipeline de CI/CD. Você pode começar configurando a transição de cada estágio para ser acionada manualmente.

Os detalhes da automação de release vão depender muito da sua stack tecnológica. A implementação usando Python no Docker será diferente de usar VMs para rodar servidores de aplicação Java.

7/ Se você está fazendo deploy na nuvem, pode automatizar a criação de infraestrutura usando ferramentas de ‘infraestrutura como código’, como AWS CloudFormation e Terraform. Se você estiver fazendo deploy localmente, provavelmente não conseguirá criar e destruir ambientes semelhantes ao de produção sob demanda. Mas ainda assim, pode alocá-los para estarem sempre disponíveis.

O resultado final é que, após todo esse esforço, sua equipe começará a lançar atualizações mensalmente, depois semanalmente e, em seguida, diariamente. Você poderá ser Ágil no sentido original do termo e entregar valor de forma incremental, mesmo para clientes corporativos.

Saiba mais aqui: Compreendendo o Pipeline de CI/CD.

Comece com CI/CD

Quando você estiver pronto para configurar um processo de CI/CD para o seu projeto, inscreva-se com uma conta gratuita no Semaphore. O Semaphore oferece pipelines de CI/CD de nível empresarial com escalabilidade automática como um serviço.

  • Você pode ler mais sobre as funcionalidades do Semaphore neste site.
  • Encontre um tutorial de CI/CD para sua linguagem e stack de tecnologia na documentação.
Star us on GitHub