Integração contínua (CI) do zero

continuous integration 10 de Jan de 2018

Nesse post vou explicar alguns conceitos inicias sobre entrega contínua assim como comparar essa técnica com outras semelhantes. Primeiramente, todos conceitos apresentados nesse post estão relacionados a forma de integrar e/ou entregar uma nova versão de um software ao usuário final.

Imagine uma equipe de 5 desenvolvedores, todos trabalhando em uma funcionalidade diferente, no fim do mês, todos os 5 precisam integrar as novas features à versão principal do software, qual a chance disso dar ??

A integração contínua serve exatamente para lidar com várias entregas diferentes de código ao mesmo projeto sem que as mesmas quebrem qualquer funcionalidade já existente.

Comparando conceitos

Apesar de semelhantes, os conceitos de entrega contínua, integração contínua e deploy contínuo são diferentes e possuem características distintas.

Integração contínua

A técnica de integração contínua consiste em diminuir a quantidade de código integrado à versão principal do software reduzindo os intervalos entre produção de código e integração. Dessa forma, se um desenvolvedor está criando uma grande feature, a tendência é que essa funcionalidade seja dividida em partes menores e integradas à uma versão entregável em intervalos menores evitando que no fim de tudo tenha-se uma quantidade gigantesca de código podendo quebrar funcionalidades do sistema.

Na maioria dos casos a integração contínua é acompanhada de uma boa estrutura de testes automatizados que são executados sempre que uma nova versão entregável do software é criada, dessa forma, os testes garantem que as novas alterações não tenham provocado nenhum efeito negativo na aplicação.

Entrega contínua

Um segundo passo após a integração contínua, a entrega contínua, além de realizar os testes, cria uma versão de release toda vez que uma nova integração for realizada. Dessa forma, com essa versão de Release, o desenvolvedor ou os testers podem ver de perto como as novas funcionalidades ficaram sem se preocupar em enviar qualquer tipo de feature indesejada ao usuário final.

Essa área entre a integração e o usuário final se chama Staging, e nela geralmente temos uma versão da aplicação para testes que deverá ir, caso não tenha problemas, para produção em breve.

A ideia é que com essa versão na área de Staging, nós possamos clicar em um único botão e todos usuários finais receberão nossa Release, agora já testada.

Deploy contínuo

Avançando no processo, a técnica de entrega contínua nos deixou uma versão de Release, porém ela jamais irá ser distribuída aos usuários finais sem uma interação humana. O deploy contínuo vai além, nós passamos por todos passos das técnicas anteriores, porém, a aplicação é entregue ao usuário final automaticamente sem interação humana e a única coisa que irá evitar com que o software seja distribuído será uma falha em algum teste unitário.

Qual utilizar?

Agora que você já conhece os três conceitos aplicados à integração contínua cabe a você decidir qual o mais adequado para seu projeto. Na minha opinião, grande parte dos produtos vão se encaixar no modelo de Entrega contínua passando por pelo menos uma interação humana antes do deploy e distribuição final, isso porque acredito que a área de Stagingque nos permite testar a Release do app antes mesmo do usuário final recebê-la traz grandes benefícios.

Como uma imagem diz mais que mil palavras, abaixo está uma imagem que mostra a diferença e participação de cada processo explicado acima:

Fonte: https://www.atlassian.com/continuous-delivery/ci-vs-ci-vs-cd

Para onde vou?

Agora que você já conhece os conceitos, existes alguns próximos passos que são essenciais para aplicar as técnicas de entrega no seu projeto.

Git & Github

Tentar utilizar qualquer conceito de integração contínua sem aprender sobre um sistema de controle de versão é dar um tiro no próprio pé, o Git te ajuda a controlar novas versões do seu projeto assim como te permite trabalhar com mais desenvolvedores no mesmo projeto sem conflitos de código.

O Github, por sua vez, permite, de uma forma muito simples, armazenar o código e seu histórico de alterações de uma maneira visual e na nuvem, assim, as outras plataformas de integração contínua podem acessar o seu código e receber as novas atualizações automaticamente para realizar todos os processos de entrega configurados.

Para começar a utilizar essas duas ferramentas, fiz uma live no CodeQuinta do zero que explico todos conceitos para quem está iniciando:

Uma vez que você tenha aprendido bem sobre Git & Github você pode dar o próximo passo configurando uma ferramenta de CI.

Ferramentas de CI

Algumas ferramentas que acho ótimas pra quem está começando no mundo de integração contínua:

Buddy

O Buddy é uma ferramenta muito prática e fácil de entender, você realiza todas configurações do processo de integração através do painel da aplicação evitando que alguns conceitos mais complexos te atrapalhem. Utilizei e utilizo essa ferramenta em vários projetos. Recomendo-a para projetos web, deixando projetos mobile para a próxima opção.

https://buddy.works/

Microsoft App Center

Na minha opinião, a melhor ferramenta de integração contínua para projetos mobile atualmente. Suporte à Xamarin, React Native e código nativo, uma ferramenta que faz todo processo de entrega contínua e deploy contínuo caso necessário, integração com App Store e Google Play, testes em dispositivos reais, etc. Se você possui um app mobile, vá de App Center.

https://appcenter.ms/

Concluindo

Agora que você já conhece todos os conceitos de integração contínua está na hora de configurar no seu primeiro projeto. Mesmo que você esteja trabalhando sozinho na aplicação, utilizar uma técnica para entrega vai te ajudar muito a manter seu código sempre revisados pelos testes unitários e só entregá-lo ao usuário final quando realmente estiver finalizado.

Se você gostou do post não esquece de deixar um comentário aí em baixo e suas ?

Marcadores

Diego Fernandes

Programador full-stack, apaixonado pelas melhores tecnologias de desenvolvimento back-end, front-end e mobile, é co-fundador e CTO na Rocketseat.