Photo by Perry Grone on Unsplash

O Que Não Te Contaram Sobre Integração Contínua

Leonardo Melo
Cesar School Abduzidos
8 min readJun 14, 2019

--

Oi, somos Jonathan Santos e Leonardo Melo, temos 25 e 22 anos e 1 milhão e 42 mil dúvidas acumuladas. Vai dizer que você nunca precisou pesquisar sobre algo novo e quanto mais tu pesquisava, com mais dúvidas ficava? Pois é! Estamos no terceiro período de Ciência da Computação, pela CESAR School, e estávamos estudando sobre Integração Contínua (Continuous Integration, ou CI) para uma atividade da cadeira de Requisitos e Validação. Na nossa jornada em busca de conhecimento, nos deparamos com uma infinidade de artigos! Top, né!? Mais ou menos… boa parte dos artigos são focados apenas em ferramentas, ferramentas e mais ferramentas — deixando de lado pontos-chave: o que é, e como se dá, CI na prática? Sendo assim, tomamos a iniciativa de escrever esse post e falar não só sobre ferramentas de CI, mas também sobre todo o processo, metodologia e cultura que compõem a prática.

O que integração contínua NÃO é

Para começo de história, vamos deixar claro aqui o que CI não é: Continuous Delivery e Continuous Deployment. Ambos termos correspondem à práticas que são, na verdade, uma extensão (há quem diga evolução) da integração contínua, uma vez que fazem uso de CI mas não se limitam a isso. Em essência, tanto CI como Continuous Delivery e Continuous Deployment, compartilham os mesmos valores, fundamentos e até, em parte, a prática. Isso, por si só, já dificulta um pouco a compreensão e distinção dos termos. Então, se em algum momento você achou que os três termos são a mesma coisa ou que tava lendo o mesmo trecho do artigo pela terceira vez, tá tudo certo! Ficamos confusos nessa parte também. Na tentativa de esclarecer isso, definimos aqui o que são (sem rebuscar):

  • Continuous Delivery: um passo além de Continuous Integration, aqui, temos como objetivo assegurar que o código que está no repositório esteja apto para ser enviado ao ambiente de produção a qualquer momento, com o clique de um botão (manualmente).
  • Continuous Deployment: dois passos além de Continuous Integration e um passo além de Continuous Delivery, aqui, cada alteração enviada ao repositório inicia, sem intervenção humana (por exemplo, um clique de um botão), um processo automatizado que envia as mudanças ao ambiente de produção.
Source: Continuous Integration, Continuous Delivery, Continuous Deployment/Development

O que integração contínua É

Agora que você entendeu o que não é CI, deve estar se perguntando:

“Então o que danado é Integração Contínua?”

Bom, segundo a definição de Martin Fowler

“Integração Contínua é uma prática de desenvolvimento de software onde os membros de um time integram seu trabalho frequentemente, geralmente cada pessoa integra pelo menos diariamente — podendo haver múltiplas integrações por dia. Cada integração é verificada por um build automatizado (incluindo testes) para detectar erros de integração o mais rápido possível. Muitos times acham que essa abordagem leva a uma significante redução nos problemas de integração e permite que um time desenvolva software coeso mais rapidamente.”

Imagem da Amazon Web Services de Continuous Integration

Esses conceitos representam métodos para acelerar a entrega de novas versões de uma aplicação, e estão alinhados com as metodologias de desenvolvimento ágil. O uso dessas práticas colabora para que o trabalho de desenvolvimento de software seja baseado em entregas menores, porém mais frequentes, tornando o processo mais flexível, ágil e eficiente.

Integração de código sem ferramenta de controle de versionamento: não rola.

Vale ressaltar aqui que, para aplicar os conceitos apresentados até então, precisamos possibilitar que à equipe consiga trabalhar de forma transparente quanto ao que estão fazendo e tenham acesso fácil ao código fonte mais atualizado e aos códigos uns dos outros. Logo, se faz extremamente necessário o uso de uma ferramenta de controle de versionamento de código centralizado como, por exemplo, o Git. Mas não se preocupem, se a gente conseguiu vocês conseguem também! Separamos um tutorial camarada, e muito rápido, para vocês começarem a entender na prática como isso funciona: é só clicar nesse link aqui!

Integração contínua na prática

“Poxa, achei massa essa prática de desenvolvimento, mas por que usá-la?”

Imagine o seguinte cenário: uma equipe com três desenvolvedores precisa desenvolver um software Y em uma quantidade X de tempo. Eles dividem as funcionalidades do sistema entre si e cada um vai para um canto desenvolver seu código. Além de estarem codificando isoladamente, os desenvolvedores precisam investir tempo em teste rotineiros de suas funcionalidades. O tempo vai passando e quando o dia da entrega já está se aproximando, eles decidem juntar as partes do código. É nesse momento que o temido bug decide aparecer, e eles percebem que, vão gastar muito mais tempo do que imaginavam realizando correções e novos testes.

Fuck by Eduard Mykhailov

Dessa forma, observamos que a junção das alterações de códigos era difícil e demorada, além de resultar no acúmulo de erros sem correção por longos períodos. Estes fatores dificultavam uma distribuição de atualizações rápida para os clientes.

Agora vamos usar o mesmo contexto só que aplicando a integração contínua.

No nosso exemplo, os três desenvolvedores iriam fazer commits diários, podendo fazê-lo várias vezes ao dia. Com isso, poderiam detectar possíveis bugs ou falhas de integração muito mais rápido, promovendo a colaboração de todo o time. Com a utilização de ferramentas de CI eles poderiam escrever testes automatizados e ganhariam mais tempo em pensar na solução em si, o que entendemos, ser uma das maiores vantagens da integração contínua. Esse fluxo contínuo de integração contínua assegurará que o código esteja sempre em um estado deployable.

Nem tudo são flores

“Tá bom demais para ser verdade!”

É verdade!! Nem tudo na vida são flores, e é por isso que vamos falar um pouco sobre alguns dos desafios de ser utilizar CI. O primeiro deles, nós chamamos de síndrome do avestruz (isso mesmo). Com a integração contínua do código, podemos realizar vários testes por dia (a cada commit enviado ao repositório, por exemplo) e, para cada um destes testes, é possível enviar uma notificação com feedback gerados. Seja por questões de prioridade ou por qualquer outro motivo, pode ser que haja um acúmulo de mensagens ao longo do dia (devido tamanha frequência) e, ao notar isso, o responsável baixe a cabeça, ignore as notificações e continue o que estava fazendo anteriormente.

Síndrome da Avestruz / Ostrich Syndrome

Isso nos leva ao segundo ponto. Além da pressão pré-existente e crescente em todos nós (independente de área de atuação/estudo ou nível de escolaridade) para fazer mais, melhor, e mais rápido, os testes diários e relatórios gerados podem acabar contribuindo para que algumas pessoas se sintam inseguras na hora de fazer commits/integrar código.

“Testing leads to failure, and failure leads to understanding.” — Burt Rutan

A citação acima exemplifica bem o desafio que temos aqui: não podemos focar só em ferramentas e código e esquecer de pessoas, afinal são elas que fazem tudo acontecer. Esse talvez seja o maior desafio que encontramos, pois requer tempo, treinamento, paciência e empatia. Introduzir CI, assim como a vasta maioria dos métodos de desenvolvimento modernos, pede mudança de hábitos, processos e mindset.

Ferramentas (tava demorando, né!?)

“To achando tudo massa!! Quais ferramentas de CI eu posso usar?”

Hoje, existem diversas ferramentas no mercado que podem lhe ajudar a atingir este objetivo, desde ferramentas open-source como o Jenkins e ferramentas pagas como o CircleCI, TravisCI, AWS CodeBuild, Azure Devops e muitas outras.

Essas ferramentas são servidores de CI que irão conter suas compilações automatizadas e os teste de validação de código que serão executados pelo servidor. Você sabe o que é compilação (build)? No contexto em que estamos falando, refere-se ao processo que converte o seu código e outros arquivos em sua forma final ou consumível. A compilação pode ser automatizada quando essas etapas são repetíveis, não requerem intervenção humana direta e podem ser executadas a qualquer momento sem nenhuma informação além daquelas armazenadas no repositório de controle do código-fonte.

Exemplo do que integração contínua evita. Source: GIPHY

Com a compilação automatizada do nosso software, podemos validar o código-fonte através de testes. Testes unitários, integrados e funcionais automatizados ajudam a dar muito mais eficiência ao seu processo de integração contínua. Uma boa prática é a utilização de frameworks XUnits para esta tarefa, exemplo: Junit para Java, PHPUnit para PHP, CppUnit para C++, entre outros.

O segredo da integração contínua é…

“Então quer dizer que é só eu adotar algumas ferramentas e escrever alguns testes e pronto?”

Apesar de ser o que muitos artigos, vídeos e até ferramentas prometem… não. Aqui na CESAR School, durante toda graduação, trabalhamos em equipes formadas por estudantes de Ciência da Computação e Design para desenvolver soluções para problemas reais — botando em prática todo conhecimento e aprendizado que obtivemos ao longo do curso. Projeto a projeto, percebemos que ferramentas são apenas um meio. Quando falamos de técnicas de desenvolvimento ágeis, não é diferente.

“O segredo não está na ferramenta, e sim na capacidade da sua equipe de evoluir colaborativamente”

As ferramentas fazem parte do todo e são necessárias, sim! De qualquer forma, como já mencionado (em Nem tudo são flores), integração contínua exige, além de uma ferramenta para tal, uma mudança de cultura na equipe. Usando o GIF acima como analogia, o martelo pode ser usado para representar a ferramenta de CI escolhida, a estaca pode ser entendida como o ato de integrar continuamente, e a sincronia ser vista como o reflexo da gestão de equipe. Se a ferramenta não for adequada ou a gestão de equipe for ignorada, equipe perde sintonia e o progresso para. De nada adiantar ter a melhor ferramenta se não tiver trabalhado e preparado a equipe para adotar CI, e vice-versa.

Hora de descer pro Play!

Já abordamos vários conceitos e falamos muuuuito! Chegou a hora de colocar a mão na massa e aprender na prática como todos esses conceitos funcionam no mundo real. Para esse post não ficar enorme e você parar de ler no meio do caminho, vamos indicar um tutorial muito bom do canal Fun Fun Function. O tutorial é bem simple e super engraçado!

É hora de dar tchau!

Chegamos ao fim da nossa jornada, esperamos que tenha ficado claro os conceitos que aqui foram apresentados. Constatamos juntos que a integração contínua traz diversos benefícios para o seu processo de desenvolvimento de software, com ela você pode encontrar bugs mais rapidamente, lançar novas versões de software com mais confiabilidade e melhorar a performance do time de desenvolvimento como um todo. O objetivo é sempre tentar evoluir o seu processo de desenvolvimento a fim de torná-lo mais eficiente, ágil e simples. Abstrair tarefas manuais e repetitivas, assim como obter um rápido feedback de erros vai lhe ajudar bastante nessa evolução.

--

--