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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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:
A integração contínua também traz benefícios à empresa como um todo, tais como:
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.
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.
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:
Você pode saber mais sobre como estabelecer um processo de CI ou de CD no nosso guia de melhores práticas em CI/CD.
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.
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.