Conceito de Integração Contínua e Ferramentas como: Jenkins e SonarQube no IV Meetup Qualyteam.
Fontes: Martin Fowler, Kent Beck, Booch
SubTemas: Continuous Delivery e Deployment, DevOps, ...
2. Ranger
• Maicon Carlos Pereira
• Formado em Ciência da Computação
• MBA em Gerenciamento de Projetos
• Profissional da área a mais de 10 anos...
• Benner Sistemas desde 2010
2
3. Meetup Backlog
To Do Doing Done
Contexto
Benner
Integração
Contínua
Jenkins Sonar
Sonar
3
17. “Integração Contínua é uma pratica de desenvolvimento
de software onde os membros de um time integram seu
trabalho frequentemente,
Martin Fowler
geralmente cada pessoa integra pelo menos
diariamente – podendo haver múltiplas
integrações por dia.
17
18. 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.”
automatizar + feedback
18
20. Grady Booch
Cunhou o termo e o propôs a “Integração Contínua” em 1991
em sua metodologia de desenvolvimento de software chamada
Booch Method.
“Os releases internos representam uma espécie de
integração contínua do sistema, e existem para
forçar o fechamento do micro processo”
20
21. Kent Beck
“Integre e atualize as versões do sistema várias vezes por dia,
cada vez que uma tarefa for terminada...”
21
25. Agora tenho
mais 32 testes
unitários!
Pronto!
Construi tudo
com TDD..
como validar que os
testes ainda estão passando?
32 testes comitados...
25
26. Servidor
Fontes
“Comita” as alterações
Servidor
IC
Notifica a falha ou sucesso
Verifica se tem alterações
Build
• “Baixa” os fontes
• Baixar os pacotes nuget
• Compilar os projetos
Test
Build
Testar
• Testes Unitários
• Testes de Integração
Post
BuildPost Build
• Notificar via E-mail
• Notificar via Chat
• Armazenar artefatos
• Métricas
26
31. Começa antes da integração....
• git pull ....
• coding...
• build...
• test...
• git pull...
• resolve conflitos
• build...
• test...
• git push...
Meu código
Meu código
junto com os demais
31
32. Repositório Único
• É raro mais ainda existem projetos sem
• tudo que você precisa para fazer uma build deve estar incluído
no repositório:
• scripts de teste,
• arquivos de configuração,
• esquema de banco de dados,
• scripts de instalação e
• bibliotecas de terceiros
32
33. Máquina de Integração
• Cada commit deve atualizar o repositório principal em uma
máquina de integração
• Manualmente
• Automaticamente
• Por que?
• Disciplina
• Ambientes diferentes
• Quem fez a build não a considera terminada enquanto ele não
recebe uma notificação
33
34. Corrigir as quebras o mais rapidamente
• Manter a master estável
• Processo / hábito
34
35. Build Automatizado
• Tudo que for além do F5 do Visual Studio, deve ser
automatizado...
• qualquer um deve ser capaz de ir em uma máquina virgem,
pegar as fontes do repositório, e com um único comando ter o
sistema rodando
• Build deve inclusive pegar o schema do banco de dados do
repositório e colocá-lo no ambiente de execução
35
37. “Commits” frequentes / diários
• Usar a integração como meio de comunicação;
• encontrar rapidamente se existe algum conflito entre as versões;
• conflitos que não são detectados por semanas podem ser
difíceis de serem resolvidos.
• Os códigos comitados devem ser estáveis (compiláveis e
testáveis)
37
38. Mantenha a Build Rápida
• Build Rápida == Feedback rápido
• Separar
• Primária: Testes Unidades / Rápidos
• A cada build
• Secundária: Testes de Interface / Carga / Stress / ... Lentos..
• A cada X tempo ou em paralelo
• Sempre que uma build secundária falhar, avalie se é possível
criar um teste na build primária.
38
39. Teste em uma cópia do ambiente de
produção
• Quanto mais parecido for o ambiente de testes com o de
produção maior a chance de detectar problemas
• Mesmo hardware, mesma versão de SO, mesma versão do .Net
e demais ferramentas instaladas....
• Rodar testes em containers Docker
39
40. Torne fácil para qualquer um ter o último
executável.
• qualquer um envolvido no projeto deve ser hábil para ter a
última versão executável e ser capaz de roda-la:
• para demonstrações,
• testes exploratórios ou
• simplesmente ver o que mudou esta semana.
• Simplifique o acesso
• Disponibilizar container atualizado
40
41. Todos podem ver o que esta
acontecendo.
• Comunicação / Feedback
• Estado da Build
• Informações sobre a duração dos builds
• Que alterações lançaram o build
41
42. Automatize a Implantação do Sistema
(Deployment)
• Ter scripts que permitam facilmente implantar o software em
um ambiente de produção
• Reduz erros
• Reduz o tempo necessário, se fosse manual
• Algumas práticas:
• Balancear a parte da carga do web site para o node que contém a nova
versão
42
44. Reduz o risco
• Não se espera até o fim do projeto ou desenvolvimento da
funcionalidade para integrar as partes
44
45. Facilita a identificação e solução de Bugs
• Não nos livras dos bugs
• Commits frequentes e checados por códigos auto-testáveis
• Commits pequenos
• “Fresco” na memória
45
46. Reduz o número de Bugs
• Bugs são cumulativos
• Quanto mais bugs você tiver, mais difíceis são se serem removidos
• Janela quebrada
• Pessoas tem menos energia para encontrar e eliminar os bugs quando
há muitos deles
• Desde que se tenha uma boa suíte de tests, a IC ajuda a reduzir
o número de Bugs
46