Você já se perguntou quanto tempo será necessário para enviar o software para a produção? Meses? Semanas? Dias?

Um número cada vez maior de empresas está fazendo isso em questão de minutos. Isso mesmo, em minutos. E isso só é possível com a ajuda do CI/CD (Continuous Integration/Continuous Deployment). Mas o que exatamente isso significa? Como funciona?

Antes de CI/CD, vamos entender o que são pipelines e jobs

Antes de entrar no conceito de CI/CD, é importante, dentro do contexto, entender o significado de pipeline e job.

Pipeline em tradução livre significa encanamento e é realmente uma analogia à canalização física. Nas práticas DevOps, trata-se de uma lista de ações, chamadas geralmente de jobs, onde a saída de uma ação é a entrada da próxima.

Pensando em um cenário real, teríamos algo como um primeiro job para instalação das dependências, um segundo job para execução da validação de código, um terceiro para execução dos testes, um quarto para build e por fim o deploy.

Ainda, é possível organizar por stages, ou estágios, que nada mais é do que um conjunto de jobs na pipeline. Assim, entende-se como um estágio de testes, por exemplo, um conjunto de ações que executam testes unitários, de integração e end-to-end.

Por fim, para que um pipeline seja iniciado, é necessário que haja um gatilho, ou trigger para quem prefere inglês. Esse gatilho pode ser o push de uma alteração de código em uma branch específica, ou a realização de um merge, por exemplo.

CI - Continuous Integration

Continuous Integration ou integração contínua, é uma prática na qual um time de desenvolvimento integra seu código com uma frequência muito alta. Como essa atividade de integração é algo que consome bastante tempo e esforço, as equipes procuram automatizar tudo o que for possível. Essa automação é feita através de ferramentas que executam as etapas necessárias (instalação de dependências, testes, compilação, etc).

O principal objetivo do CI é estabelecer um ciclo de vida definido que diminua o esforço necessário para a integração do código. A integração contínua, também resulta na detecção de erros no código ainda nos estágios iniciais. O CI normalmente é divido nas etapas de push, teste, fix.

  1. Push: Ao trabalhar em software e em equipe, é importante que seu código seja enviado para o repositório remoto e integrado aos outros desenvolvimentos o mais rápido possível.

  2. Teste: É importante que o CI possua uma etapa de testes automatizados confiáveis. Esses testes devem validar o código desenvolvido. Idealmente primeiro se executa testes unitários e posteriormente testes de integração.

  3. Fix: Se for observado algum problema, corrigí-lo deve ser prioridade ao invés de adicionar uma nova funcionalidade. A ideia é justamente ter código sempre pronto para entregar.

Benefícios da Integração Contínua

  1. Risco de integração reduzido: muitas vezes, os desenvolvedores estão trabalhando em tarefas separadas ou complementares, o que traz um certo nível de risco para a integração. Integrar com frequência reduz esse tipo de problema ao mínimo.

  2. Maior qualidade de código: com o auxílio de uma etapa de validação de código, é possível focar mais na funcionalidade do código, o que resulta em um produto de maior qualidade.

  3. O código versionado funciona: todo código que está versionado no repositório principal deve ser funcional. Com CI é possível identificar se há algum problema que precise ser resolvido para que o software continue funcionando.

  4. Menor tempo de implantação: a automação do processo de integração, reduz o tempo para implantação do software.

CD - Continuous Delivery

Continuou Delivery ou entrega contínua, é a prática de garantir que o código esteja sempre em um estado estável e implantável. Isso quer dizer que todas as alterações de código, novas funcionalidades e correções de bugs devem estar aptos para implantação em um ambiente de produção.

O objetivo do CD é tornar o processo de implantação disponível para ocorrer a qualquer momento sob demanda. Não importando a complexidade da implantação, seja em um sistema distribuido ou um simples monolito.

Nessa etapa também há o conceito de Continuous Deployment, ou implantação contínua, que nada mais é do que um próximo passo em relação à entrega contínua. A implantação contínua é o objetivo final dos times de desenvolvimento. Além de garantir que o software está apto para a implantação, ele também é disponibilizado no ambiente de produção automaticamente. Ao contrário da entrega contínua, não há uma etapa final de aprovação manual antes da liberação para a produção.

Princípios do CD

  1. Processo repetitível e confiável: para facilitar a implantação e garantir qualidade, é importante usar o mesmo processo de liberação para todos os ambientes (desenvolvimento, homologação e produção).

  2. Automatize tudo: tudo deve ser automatizado, assim evita ao máximo problemas que podem ser causado por erro humano, como uma variável de ambiente errada.

  3. Melhoria contínua: esse é o mais relevante dos princípios. Ele garante que você acompanhe as mudanças e evolua seus processos.

  4. Tudo deve estar versionado: código, configuração, scripts, bancos de dados, documentação, tudo deve estar versionado! Isso garante uma base estável para criar processos com eficiência.

  5. Todos são responsáveis: "funciona na minha máquina" não deve ser uma desculpa válida. A responsabilidade do time deve se estender a produção. Todos devem compartilhar responsabilidades ao longo de todo o processo.

Ferramentas de CI/CD

Dentre as diversas ferramentas disponíveis hoje no mercado, destaco as principais utilizadas no dia a dia.

  • Gitlab: é uma plataforma DevOps. Integra todas as funcionalidades necessárias para o processo de desenvolvimento e entrega de software.

  • GoCD: é uma ferramenta de código aberto que automatiza o processo de CD. Possui mapeamento de fluxo de valor, implantações nativas na nuvem, modelagem de fluxo de trabalho e rastreabilidade.

  • Docker: é um conjunto de ferramentas onde é possível executar os passos de uma pipeline além de entregar software em pacotes chamados contêineres.

Conclusão

O CI/CD em geral melhora a velocidade, produtividade e sustentabilidade do time de desenvolvimento de software. A equipe pode concentrar-se em responder mais rapidamente às mudanças no mercado e evoluir o software, além de ter tarefas menos tediosas e repetitivas.