Toda vez que falamos sobre CI/CD, muitos pensam em YAML, configurações técnicas e termos complexos. Mas na verdade, é uma ideia simples de automatizar tarefas manuais. No nosso caso, vamos usar analogias do dia a dia e até de um jogo que estive jogando.
Comparação Trabalho Manual x CI/CD
Imagine precisar publicar um componente. Se você trabalha com Angular, React ou Vue, provavelmente seguiria esses passos: buildar o componente, rodar os testes para garantir que tudo está como deveria e, para publicar no npm, rodar um simples publish. Legal, você publicou seu componente. Mas imagine que são 60 componentes, e você precisa ajustar um bug que envolveu dois deles. Será necessário publicar na mão e, enquanto isso, os outros desenvolvedores do time precisarão fazer suas publicações na mão.
O CI/CD resolve essa dor, não somente a de publicação. Algo que é feito manualmente pode ser automatizado por uma pipeline, se isso faz sentido no seu contexto. Buildar o componente para garantir integridade, rodar os testes, publicar, subir um ambiente de staging, ferramentas de segurança, SonarQube? Publicar imagens Docker e outros.
Jogo Parcel Simulator
Recentemente joguei e vi um jogo muito interessante chamado Parcel Simulator. Basicamente você é um funcionário que precisa validar pacotes (imagina que são entregas dos correios) e fazer uma série de verificações para ganhar dinheiro e evoluir essa empresa. O interessante é que podemos fazer uma série de comparações com a programação, como: o dia no jogo inicia com uma esteira trazendo esses pacotes até você, depois você precisa validar (peso, país, número de série, tipo de entrega), e essas validações aumentam com o tempo. Chega um momento em que você precisa olhar tantas coisas e ser tão rápido para não atrasar que acaba ficando fácil de errar.
Então, depois de algumas entregas e com um dinheiro guardado, você consegue adicionar máquinas que fazem esse serviço para você e, se elas deixarem passar, adivinha? Você consegue "carimbar com aprovado e reprovado". Para mim isso é CI/CD puro.
Mas antes de tudo, quem liga a esteira? No jogo o dia começa e os pacotes chegam sozinhos, já na nossa pipeline quem dá o start é você. Um push no código ou um merge naquela branch é o que acende a esteira e começa o expediente.
A esteira do jogo é a nossa pipeline, ela irá levar nosso código adiante, fazendo ele passar pelos diversos passos.
Máquina de Validar Pacotes
No jogo, existe a máquina que verifica se o peso do pacote é correto. Na nossa pipeline CI/CD podemos rodar os testes para ver se não teve regressão 🤷🏽♂️.
E vamos além: no jogo compramos a máquina diretamente, a máquina que vai validar o peso, o país, etc. mas podemos imaginar que cada máquina tem um software instalado, igual no CI/CD. Precisamos instalar o Node para rodar JS, não? E para instalar, npm install!
Depois de instalar e rodar todos os processos, vem o quê?
Claro, a aprovação ou rejeição, passou ou não passou!
E aqui vem a parte que eu acho mais importante: o que acontece quando reprova? No jogo, se você deixa um pacote errado passar, adivinha? Toma penalidade. Na pipeline é parecido, só que a favor: quando algo reprova, a esteira trava ali mesmo e o componente quebrado não segue pra frente.
Reprovou, a esteira para. Aquele componente com bug não é publicado no npm, não chega nos outros devs do time e não vai quebrar as telas das aplicações que consomem ele. E de brinde, a pipeline ainda te mostra em qual passo quebrou, se foi no build ou num teste.
CI/CD como uma Máquina
No fim das contas é esse "segurar antes de estragar" que faz o CI/CD valer tanto a pena. CI/CD só é uma outra máquina rodando os mesmos passos que você faria para chegar em um ponto final. Ou seja, você está no ponto A, com o bug corrigido, e quer chegar no ponto B, entregar essa correção em produção ou o que quer que seja esse "entregável" no seu contexto.
Essa máquina pode ser uma action do GitHub, pode ser uma máquina na nuvem (que é engraçado, uma máquina na nuvem só é uma máquina que não está no mesmo espaço físico que o seu). Pode ser uma máquina no mesmo espaço físico, a sua própria máquina, um server particular, um homelab e etc. Existe documentação para rodar esses runners e não depender da nuvem, tendo mais controle, porém, lembre que o CI/CD são os mesmos passos.
Conclusão
CI/CD é uma ideia simples de automatizar tarefas manuais, comparável ao jogo Parcel Simulator onde você valida pacotes para ganhar dinheiro. É uma máquina que garante que seu código seja de qualidade e que ele chegue onde deve, sem erros ou atrasos. É uma maneira de garantir que seu produto ou serviço seja entregue de forma eficiente e sem problemas.