A adoção de um fluxo de trabalho de CI/CD no desenvolvimento de aplicações tem se tornado cada vez mais comum. Contudo, dimensionar e aperfeiçoar o CI/CD apresenta desafios significativos.
Neste artigo, vamos analisar esses desafios e descobrir como podemos efetivamente dimensionar e otimizar o CI/CD. Acompanhe a leitura!
Atualmente, o desenvolvimento de aplicativos é frequentemente conduzido por equipes compostas por vários desenvolvedores. Cada membro ou equipe tem um papel específico no projeto, avançando em sua área de atuação.
Ao final do projeto, nos deparamos com a necessidade de integrar diversos fragmentos de código. Dependendo da metodologia de trabalho de cada um, a gestão dessa integração pode consumir um tempo considerável.
CI/CD, ou Integração Contínua e Entrega/Implantação Contínua, surgem como uma solução para esse problema, assegurando que as atualizações sejam implementadas sem atrasos e conflitos desnecessários. Vamos entender melhor esse processo.
Integração Contínua
CI, ou Integração Contínua, engloba processos que visam a publicação constante de alterações e adições de código em uma ramificação compartilhada do projeto. Isso permite que o código seja testado e que melhorias e ajustes sejam realizados em tempo real. O objetivo principal é testar cada componente por meio da criação de testes.
Essa prática contínua evita a necessidade de verificar tudo em bloco ao final do desenvolvimento e também evita o trabalho simultâneo em vários componentes. A execução de testes unitários é crucial para assegurar essa abordagem. Assim, torna-se mais simples identificar erros, garantindo que o código compile corretamente e não cause regressões.
Entrega Contínua
A Entrega Contínua, ou CD, engloba a integração contínua e os testes, que podem ser agrupados em contêineres e colocados em produção. Em outras palavras, ela reúne os códigos e testes realizados e os disponibiliza em produção por meio da automação.
Embora possa requerer intervenção humana, ela se torna automatizada ao colocar em funcionamento tudo que foi feito, de forma integrada e completa. Na prática, com a entrega contínua, nosso aplicativo é desenvolvido de forma que esteja pronto para ser lançado em produção a qualquer momento.
Implantação Contínua
Apesar da semelhança entre os conceitos de entrega contínua e implantação contínua, existem diferenças. Embora o objetivo final seja o mesmo – a implantação do aplicativo em produção – os meios para atingi-lo variam. O que distingue a entrega contínua da implantação contínua é o lançamento.
Na implantação contínua, cada modificação que passa pelas diferentes etapas do pipeline é diretamente implantada. Já na entrega contínua, uma etapa de validação humana é necessária para que a implantação ocorra.
Escalabilidade do CI/CD
Com o aumento do número de microsserviços, a escalabilidade do CI/CD torna-se praticamente inevitável. O incremento desses microsserviços resulta em diversos pipelines conectados a um único repositório Git, elevando a carga do servidor de CI e diminuindo o desempenho.
Para escalar o CI/CD, é crucial criar um pipeline de desenvolvimento padronizado e automatizado para todas as equipes. A partir daí, é necessário assegurar a qualidade das entregas individuais dos desenvolvedores e das entregas da equipe. Isso também simplifica a gestão do pipeline.
A escalabilidade pode ser alcançada definindo um processo de CI para executar testes unitários e validar a qualidade do código entregue.
Em seguida, deve-se estabelecer um processo de CD para criar as imagens e implantá-las nos ambientes de forma contínua e, finalmente, definir um processo para construir as imagens e implantá-las no ambiente de produção.
Passos para Escalar o CI/CD
O primeiro passo é alinhar o pipeline com os arquitetos, envolvendo os líderes de equipe. Em seguida, mapear as ramificações do Git para os ambientes (develop -> desenvolvimento e master -> [homologação e produção]). Depois, automatizar o acionamento do CI Job a cada Pull Request e do CD Job a cada mudança nas ramificações mapeadas.
Um fluxo de tarefas pode ser criado para que CI e CD sejam seguidos de forma eficiente.
O fluxo de trabalho do CI se desenvolve em 7 etapas:
- Verificar o branch de origem e destino do Pull Request.
- Verificar se a mesclagem não possui conflitos que necessitem de resolução manual.
- Executar testes unitários.
- Construir o pacote para verificar a integridade e se o código é compilável.
- Realizar a validação de qualidade de código.
- Incrementar e confirmar a versão do projeto na ramificação de origem.
- Notificar o repositório Git sobre o sucesso ou falha da solicitação de pull por meio de chamada de API Webhook ou Rest.
O fluxo de trabalho do CD segue o seguinte caminho:
- A ramificação notificada é verificada.
- O artefato é construído utilizando a ferramenta de construção específica do projeto em desenvolvimento.
- Após a criação do artefato, os projetos da biblioteca são enviados ao Nexus para armazenamento do artefato e o fluxo é finalizado.
As seguintes ações são executadas:
Etapa 1: Uma imagem do Docker é criada para o artefato gerado, aplicando a versão do artefato à imagem do Docker.
Etapa 2: A imagem é carregada no registro do Docker.
Etapa 3: Implantação por meio de distribuição de imagem via Kubernetes.
Para projetos de aplicativos em um ambiente de aprovação/produção, siga as etapas 1 e 2 acima e, em seguida, o seguinte:
- Implementação por meio de rollout de imagem via Kubernetes no ambiente de aprovação.
- O processo é pausado para aguardar a aprovação do lançamento para produção.
- Se aprovada, a imagem que está sendo aprovada é promovida para produção.
- Caso contrário, a imagem em aprovação é revertida.
Otimização do CI/CD
O CI/CD aprimora o ciclo de desenvolvimento de aplicativos e resolve o problema causado pela integração de novo código e o aumento da frequência de entrega.
Veja a seguir como você pode otimizar ainda mais o uso do CI/CD:
Priorize a correção de uma compilação corrompida
Quando uma compilação falha, corrigi-la deve ser a prioridade da equipe. Se a compilação não puder ser corrigida em poucos minutos, a equipe deve decidir se remove o código ou desativa o sinalizador de recurso.
A ideia por trás da correção de uma compilação quebrada é que a compilação sempre produzirá código funcional que pode ser liberado.
Pequenas implantações frequentes
Geralmente, a estabilidade do aplicativo está em risco sempre que ocorre uma implantação. Portanto, tendemos a espaçar as implantações umas das outras. O problema dessa abordagem é que acumulamos muitas mudanças. Uma dessas mudanças pode dar errado, obrigando-nos a reverter as outras que estavam funcionando.
Aplique o padrão estrangulador e divida as mudanças complexas em pequenas e simples. Se você implementar com mais frequência e trabalhar em pequenos lotes, o risco de implantação será menor.
Automatize testes de controle de qualidade para mitigação de riscos
Todos nós provavelmente já passamos pela situação do “funcionava na minha máquina” porque os ambientes de desenvolvimento local geralmente são diferentes. Pode haver muitas diferenças entre seu ambiente local e o ambiente de produção. Você pode otimizar o CI/CD automatizando tarefas de Garantia de Qualidade (QA), como teste de navegador, minimizando o risco de um bug atingir o aplicativo ativo.
Confie em testes automatizados
Para validar quando um desenvolvedor integra um novo código, o CI conta com um conjunto de testes automatizados e confiáveis. Se você precisar compilar código, o primeiro teste é verificar se ele compila. Em seguida, você pode adicionar quantos testes considerar críticos.
Quantos testes devem ser incluídos? Para determinar isso, lembre-se de que o objetivo do CI é fornecer feedback o mais rápido possível. Se um desenvolvedor tiver que esperar uma hora para receber feedback, não funcionará. Você sempre perderá algumas coisas, mas quando detectar um bug na produção, crie um caso de teste e inclua-o no ciclo de CI.
Considere sempre a segurança
Considere a segurança de uma ferramenta de CI/CD, pois ela se integra a configurações ou ambientes existentes. O CI/CD exige que todas as ferramentas de teste de segurança sejam chamadas programaticamente e seus resultados sejam agregados em um só lugar. Procure ferramentas que tenham APIs para auditorias de criptografia automatizadas.
Benefícios de Escalar e Otimizar o CI/CD
Além de aumentar a eficiência das equipes de desenvolvimento, escalar e otimizar o CI/CD também traz outros benefícios, alguns dos quais são:
Redução de despesas gerais
As horas de desenvolvimento geralmente são faturáveis, mas e o tempo gasto na implantação manual de código ou arquivos? Automatizar grandes partes do seu fluxo economizará tempo para trabalho faturável, algo que todos podem apreciar. O teste automatizado também permite que você falhe mais cedo, em vez de encontrar erros no controle de qualidade ou na produção, ou pior, o cliente os encontra. Mais bugs corrigidos no mesmo período de tempo é uma vantagem clara.
Entrega com menos bugs e menos risco
Você detecta bugs muito mais cedo no processo de desenvolvimento, liberando pequenas alterações com mais frequência. Ao implementar testes automatizados em todos os estágios de desenvolvimento, você não corre o risco de mover o código com falha para o próximo estágio e é mais fácil reverter pequenas alterações quando necessário.
Responda às condições do mercado mais rapidamente
As condições de mercado mudam constantemente. Suponha que você descubra que um novo produto está perdendo receita ou que mais clientes acessam seu site a partir de smartphones do que de laptops. Nesse caso, é muito mais fácil fazer uma mudança rápida se você tiver uma entrega contínua otimizada.
Confiança
Se você otimizar o CI/CD, o que significa que você tem um conjunto de testes robusto, sua confiança em não enviar um bug aumenta muito. Se você for transparente com seu processo e educar o restante de sua equipe e clientes, a confiança deles em você como equipe de desenvolvimento também aumentará.
Considerações Finais
O CI/CD torna suas integrações e entregas mais rápidas. No entanto, é importante dimensioná-lo e otimizá-lo para evitar que o processo se torne contraproducente devido ao aumento da complexidade.
Você também pode verificar algumas das melhores ferramentas de CI.