Compreendendo a integração contínua

Integração contínua ou CI é a prática de fazer a build da sua base de código e testá-la automaticamente depois de cada merge.

O que é Integração Contínua (CI)?

Integração contínua (CI) é uma prática de DevOps projetada para ajudar as equipes de desenvolvimento a trabalharem de forma mais eficiente e liberarem software de forma mais confiável. Com a CI, cada vez que você fizer merge das suas alterações, um servidor de CI fará a build do seu código e o testará, fornecendo feedback rápido do seu trabalho. Esse ciclo rápido e confiável de feedback ajuda a liberar alterações mais frequentes e reduz o número de bugs que chegam à produção.

Desenvolvimento sem CI

Para compreender por que a integração contínua é necessária, vamos pensar em como é o desenvolvimento de software sem ela. Digamos que você esteja trabalhando com um sistema de controle de versões como o Git. Você e seus colegas têm cada um sua cópia do repositório, que vocês usam no desenvolvimento local, antes de fazerem o push do seu trabalho para um repositório compartilhado.

Se você estiver desenvolvendo um novo recurso, talvez você trabalhe nele por vários dias antes de compartilhar as suas alterações. Durante esse tempo, os seus colegas também estarão criando recursos em suas cópias locais do repositório. Quando vocês terminarem, cada um de vocês fará o push das suas alterações para o repositório compartilhado e começará a fazer o merge delas no branch apropriado, para que vocês possam testar se cada recurso funciona como esperado ao ser combinado com todo o resto.

Infelizmente, como vocês estão combinando grandes alterações feitas por diversos desenvolvedores, há um alto risco de vocês não conseguirem mais fazer a build do código. Você e os seus colegas gastarão algum tempo para identificar qual conjunto de alterações causou o problema e depois ou desfarão aqueles commits para poderem liberar outras alterações mais urgentes, ou então farão novas alterações no código para corrigir os problemas.

Depois de conseguirem fazer a build do código, talvez vocês descubram que uma combinação de alterações provocou diversos bugs. Novamente, vocês examinarão as alterações no código feitas por cada colaborador para encontrar a causa dos problemas, corrigi-los e depois começar outra vez o processo de build.

A necessidade da CI

A integração contínua acelera esse processo, executando as etapas de build e de teste automaticamente toda vez que você fizer merge das suas alterações no branch apropriado. Depois de automatizar essas etapas, fica viável executá-las com mais frequência, fazendo build e testes da sua base de código a intervalos de poucas horas, em vez de algumas semanas.

Trabalhar com esses incrementos menores significa que você pode identificar e corrigir mais rapidamente quaisquer problemas introduzidos pelas suas alterações no código. Em vez de examinar centenas ou milhares de linhas de alterações para encontrar a causa do problema, a sua procura ficará limitada a um conjunto muito menor de alterações. Além disso, essas alterações ainda estarão frescas na sua memória, de modo que você não tem o ônus adicional da mudança de contexto.

Ao confirmar que o seu software ainda é capaz de completar a build e se comporta como esperado depois de cada alteração, a CI ajuda a manter o seu código apto para implantação. O resultado é que a liberação de alterações para a produção fica menos árdua e você pode liberar recursos e correções com mais frequência.

Embora a integração contínua tenha sido criada para resolver problemas enfrentados por grandes projetos de desenvolvimento de software com inúmeros colaboradores, nunca é cedo demais para incorporar a CI ao seu processo de desenvolvimento. Mesmo que você seja um desenvolvedor individual, trabalhar em pequenos incrementos e validar as suas alterações com testes automatizados à medida que você as implementa pode ajudar você a trabalhar de forma mais eficiente e melhorar a qualidade do seu código.

integração contínua

Práticas de CI

Para ser eficaz, um fluxo de trabalho de CI requer uma combinação de ferramentas, processos e práticas da equipe. Vamos dar uma olhada nesses itens, um de cada vez.

Usar um sistema de controle de versões

Na integração contínua, toda a sua base de código precisa estar armazenada em um sistema de controle de versões ou de código-fonte. Isso inclui todos os arquivos do código-fonte, de configuração, bibliotecas e scripts. O uso do controle de versões facilita muito que diversos desenvolvedores trabalhem em paralelo e compartilhem suas alterações entre si. Servidores de CI integram-se aos sistemas de controle de versões para fazer as builds e os testes das alterações no seu código.

Commits regulares das alterações

Para que todos possam fazer builds sobre uma mesma base, é preciso que todos trabalhem a partir do mesmo repositório e compartilhem suas alterações com frequência. Uma boa regra geral é que todos façam merge dos seus commits diariamente no branch de CI do seu repositório comum, embora isso também possa ser feito com mais frequência. Ao mesmo tempo, mantenha a sua cópia local atualizada em relação ao repositório compartilhado, para reduzir o risco de conflitos de merge toda vez que você fizer um push.

Builds e testes automatizados

Depois de fazer merge das suas alterações do código, a próxima etapa é fazer a build da solução e submetê-la a uma série de verificações, tais como linting, testes de unidade e análise estática. Builds e/ou testes manuais são demorados e propensos a erros, o que torna impraticável a integração diária das alterações. Portanto, a automação é essencial. Estão disponíveis ferramentas de build e frameworks automatizados de testes para todas as principais linguagens de programação e você pode usar um servidor de CI para iniciar o processo automaticamente e coordenar as várias etapas.

Examinar as falhas imediatamente

Para colher os benefícios da integração contínua, todos os colaboradores do projeto precisam responder rapidamente quando uma build ou um teste automatizado falhar. Isso garante que todos estejam acrescentando seu trabalho a uma base sólida, em vez de tentar adicionar novos recursos a um código que não funciona. Embora possa parecer que você está pedindo que os membros da equipe interrompam seu trabalho para corrigir uma build ou um teste falhados, um processo automatizado de CI pode entregar resultados iniciais em minutos, permitindo que você resolva quaisquer problemas enquanto as alterações no código ainda estão frescas na sua memória.

Manutenção do processo

Depois de automatizar as suas builds e testes, você precisa manter o seu fluxo de CI. Isso inclui adicionar testes de unidade à medida que você criar código novo e manter a rapidez dos seus ciclos de feedback.

Adicionar um servidor de CI para monitorar o seu repositório, acionar builds, executar testes automatizados e reunir os resultados ajuda a ligar todas essas peças, evitando que você perca tempo escrevendo uma lógica específica de automação. Um bom servidor de CI também pode fornecer insights adicionais, como métricas de cobertura do código e um histórico de builds.

Benefícios da CI

Compreender os benefícios que se pode esperar da integração contínua pode ajudar a motivar os membros da equipe a experimentarem novas práticas e a convencer as partes interessadas a apoiarem novos processos.

Para cada pessoa e para a equipe como um todo, a CI traz:

  • Merges mais suaves: Quando você começa a trabalhar em incrementos menores, diminui o número de conflitos de merge. Para isso, é essencial atualizar regularmente o seu repositório local com as alterações das quais os outros desenvolvedores fizeram push.
  • Fluxo de trabalho mais eficiente: O feedback rápido de um processo automatizado de build e testes alerta você de problemas no seu código alguns minutos depois de você fazer o push da alteração. Já se você usar um processo manual de build ou testes, talvez você não descubra um bug introduzido pela sua alteração até vários dias ou semanas depois.
  • Base de código mais fácil de manter: Fica mais fácil compreender e manter a sua base de código quando você adiciona uma cobertura de testes automatizados para garantir que o seu processo de CI funcione bem.
  • Melhor comunicação e colaboração: Trabalhar em incrementos menores e compartilhar alterações de forma mais regular significa que você também vê no que os outros estão trabalhando. Isso cria mais oportunidades para discutir o projeto de um recurso com os colegas, mostrar o seu progresso aos gerentes de produto e especialistas em usabilidade, e ajustar o curso conforme necessário.

A integração contínua também traz benefícios à empresa como um todo, tais como:

  • Menos bugs: A integração contínua não impede que sejam introduzidos bugs, mas facilita muito que os desenvolvedores identifiquem e corrijam esses bugs. Como resultado, é muito menos provável que bugs sejam liberados para a produção, onde eles podem afetar os seus usuários.
  • Versões mais rápidas e frequentes: A automatização do processo de build e testes poupa tempo e garante que as etapas sejam executadas de forma mais consistente, reduzindo o esforço manual para preparar o software para liberação. À medida que as equipes ganham mais confiança em seu processo de CI, elas podem liberar alterações com mais frequência.

Para descobrir mais sobre os benefícios da integração, entrega e implantação contínuas, leia nosso guia sobre os 12 benefícios da CI/CD.

Desafios da CI

Embora a integração contínua traga benefícios tanto para os desenvolvedores quanto para a empresa como um todo, ela nem sempre é recebida de braços abertos.

Para muitos setores de desenvolvimento, o DevOps representa uma grande mudança na maneira como eles trabalham e desafia os processos existentes. É necessário que haja uma boa comunicação para coordenar os esforços entre as equipes e criar uma cultura de colaboração.

Se você já estiver seguindo metodologias ágeis, geralmente a mudança será mais fácil, pois a importância de escutar o feedback e a noção de equipes auto-organizadoras já devem ter ganhado terreno.

Quando não for esse o caso, reconhecer que a CI é uma mudança significativa, interagir com as pessoas, começar em pequena escala e demonstrar os benefícios podem ajudar a convencer os seus colegas dos benefícios trazidos pela CI.

A integração contínua também enfrenta desafios mais práticos. As builds podem ser demoradas se você estiver trabalhando em um aplicativo grande e monolítico, e a paralelização da execução dos testes pode ser um desafio se os ambientes de teste forem escassos.

Visualizar o seu fluxo de trabalho de integração contínua e usar métricas para identificar gargalos podem ajudar a quantificar os custos e benefícios do investimento em mudanças na arquitetura, infraestrutura adicional e cobertura de testes automatizados.

Como começar com a integração contínua

Configurar um fluxo de trabalho de CI pode intimidar. Há muitas opções a considerar e muitas coisas que você pode automatizar. Felizmente, a CI é um processo que se presta bem a ser dividido em pedaços menores, pois cada etapa já trará alguns benefícios.

As seguintes áreas são bons pontos de partida:

  1. Comece a trabalhar em incrementos menores: Contanto que você tenha o seu código no controle de versões, você pode começar a trabalhar em lotes menores e a compartilhar as alterações com mais frequência, reduzindo, assim, os conflitos de merge. Talvez você queira começar a dividir as tarefas de desenvolvimento durante o refinamento do backlog, para facilitar.
  2. Defina uma estratégia de branching: Isso determina quais branches você submeterá ao fluxo de CI e como as alterações serão liberadas. O desenvolvimento baseado em troncos e o GitFlow (especialmente para software versionado) são duas opções comuns.
  3. Adicione testes de unidade à medida que você programa: Quer você já tenha testes de unidade ou esteja começando do zero, tornar os testes de unidade parte da "definição de terminado" da sua equipe garantirá que a cobertura do seu código esteja sempre melhorando. Ter alguns testes automatizados é sempre melhor que não ter nenhum e você pode começar a praticar a CI com apenas alguns poucos testes.
  4. Automatize de forma incremental: Em vez de tentar colocar em um script todos os estágios do seu fluxo de CI de uma vez, concentre-se no que demorar mais tempo ou der mais feedback. Quando você estiver pronto, poderá usar um servidor de CI para começar a encadear as etapas em um processo automatizado de CI.

Você pode saber mais sobre como estabelecer um processo de CI ou de CD no nosso guia de melhores práticas em CI/CD.

Concluindo

A adoção da integração contínua ajuda a acelerar o processo de desenvolvimento enquanto melhora a qualidade do código. A automatização dessas etapas permite que você trabalhe com mais eficiência e se concentre em adicionar mais valor para o usuário. Porém, a integração contínua é só o começo do pipeline de CI/CD. A próxima etapa, a entrega contínua, aplica os princípios do DevOps à parte seguinte do processo de liberação.

Como o TeamCity pode ajudar

O TeamCity é uma plataforma flexível de CI/CD que você pode personalizar de acordo com as suas necessidades. Ele oferece suporte a todos os principais sistemas de controle de versões, incluindo Git, Perforce, Mercurial e Subversion, além de ferramentas de build e de teste para as mais importantes linguagens de programação. A grande variedade de gatilhos de CI significa que você pode iniciar o processo de build e testes depois de cada commit para um determinado branch, executar um subconjunto de verificações em branches de recursos, agendar builds noturnas e dar aos membros da equipe a opção de executar localmente as verificações de CI.

Para garantir que você obtenha feedback o mais rapidamente possível, o TeamCity pode paralelizar os testes e outras tarefas da build. Integrações com o Slack e com IDEs fornecem feedback onde quer que você esteja trabalhando e relatórios detalhados dos testes ajudam você a identificar rapidamente a causa de uma falha. O TeamCity também oferece diversas métricas para ajudar você a otimizar o seu processo de CI e avaliar a cobertura dos testes de unidade.

Se você decidir ampliar o seu processo de CI para incluir a entrega ou a implantação contínua, o TeamCity pode fornecer tudo de que você precisa para gerenciar ambientes e automatizar implantações.