Integração contínua de projeto Java com Jenkins

Há bastante tempo aplicamos e escrevemos sobre integração contínua, uma das práticas mais importantes do desenvolvimento ágil. Através dela, é possível agilizar tarefas demoradas como a compilação de um projeto e a execução dos seus testes automatizados. Com um servidor de integração contínua bem configurado, essas tarefas são executadas a cada mudança no repositório de código e, em caso de erros de compilação ou falhas nos testes automatizados, todos os desenvolvedores são alertados rapidamente. Dessa forma, se o servidor de integração não aponta problemas no projeto, a equipe tem a segurança de que as mudanças no código estão de acordo com a bateria de testes. É também um passo na direção do deploy contínuo.

Nesse post, iremos ensinar como instalar e configurar um projeto simples com testes de unidade no Jenkins, uma versão renovada (e forkada) do Hudson, o servidor de integração contínua que utilizamos aqui na Caelum e um dos mais populares.

O Jenkins é distribuído como um war e portanto pode ser deployado em um servidor de aplicação como o Tomcat ou o Jetty. Nesse post, iremos utilizar o Tomcat e vamos supor que ele já esteja instalado no seu computador. Chamaremos a home do Tomcat de <tomcat>. Você também deve ter o ant instalado no seu computador pois o utilizaremos para compilar o código e executar os testes. Baixe a versão mais recente do Jenkins e coloque no diretório <tomcat>/webpps/. Inicie o servidor de aplicação executando o script <tomcat>/bin/startup.sh. Depois disso, você poderá acessar a interface web do jenkins pela URL http://localhost:8080/jenkins/ no seu navegador.

Para demonstrar a configuração de um projeto novo, iremos utilizar um projeto simples, criado para esse tutorial. Ele possui apenas duas classes bem simples e uma classe de teste com o JUnit. Além disso, o projeto possui um build.xml configurado para compilar o  projeto, executar os testes e gerar um jar. Você pode também ir aplicando todos os passos em seu próprio projeto. Se você ainda não desenvolve com integração contínua, vai poder mudar bastante a forma com que sua equipe desenvolve e receber um feedback contínuo do que está acontecendo.

Como o projeto se encontra em um repositório Git, será necessário instalar um plugin do Git no Jenkins (inicialmente, o Jenkins só suporta CVS e SVN). Para isso, vá até o plugin manager do Jenkins (Manage Jenkins > Manage Plugins) na aba Avaiable, habilite o Git Plugin e clique em Download now and install after restart (pode ser que não exista nenhum plugin disponível na aba Avaiable, nesse caso, vá até a aba Advanced e clique em Check Now para atualizar o repositório de plugins). Depois do término da instalação do plugin, você deverá reiniciar o Jenkins.

Com o plugin instalado, podemos criar uma nova task no Jenkins para compilar e executar os testes do nosso projeto. Clique em New Job, dê um nome a ele, selecione a opção Build a free-style software project e clique em Ok. Você será redirecionado para a página de configurações do projeto.

Na seção Source Code Management, selecione Git e coloque a url pública do repositório (git://github.com/csokol/jenkins-exemplo.git). Em Build Triggers, selecione Poll SCM e no campo Schedule coloque “*/5 * * * *“. Essa configuração determina que o Jenkins irá verificar se houve alterações no repositório desde o último build a cada cinco minutos. Se existir alguma, irá atualizar o seu repositório e executar o job.

Nesse projeto temos duas targets principais do ant que queremos executar no Jenkins, uma para executar os testes e outra para gerar um jar do projeto, pronto para ser distribuído. Para configurar a execução dessas targets, selecione a opção Invoke Ant na seção Build e no campo Targets coloque test jar, essas são as targets que executa os testes e gera o jar, respectivamente.

Agora, precisamos configurar as ações que o Jenkins irá executar depois de executar o ant. Caso exista alguma falha nos testes ou na criação do jar, o Jenkins deve notificar a equipe, para isso, na seção Post-build Actions selecione E-mail Notification e adicione os emails que devem ser notificados em caso de falha no build. Além disso, gostaríamos também de guardar o jar gereado pelo ant, para isso, selecione Archive the artifacts e coloque target/*.jar no campo Files to archive. Assim, toda vez que o job for executado, o Jenkins irá disponibilizar o jar para download em sua interface. Clique em Save para salvar as configurações.

Pronto! Agora o projeto está configurado e cada alteração no repositório irá disparar o Job no Jenkins, executando os testes de unidade:

Como nesse momento o Job nunca foi executado, o primeiro irá iniciar automaticamente e você poderá vizualizá-lo no painel do lado esquerdo em Build history. Você também pode inicar o processo manualmente, clicando em Build Now. Com o build finalizado, você pode visualizar sua página de status, onde poderá baixar o jar criado e também examinar o resultado dos testes em Console Output.

O Jenkins oferece muitos outros recursos além dos descritos aqui, ele é capaz de executar diversas tarefas, como colocar deployar um war em um servidor em produção, gerar relatórios de cobertura de testes, calcular métricas sobre o código do projeto, entre outras. Você poderá conhecer essas funcionalidades explorando os plugins disponíveis ou mesmo desenvolvendo o seu.

38 Comentários

  1. Eduardo Lomonaco 24/04/2012 at 10:48 #

    Excelente tutorial! Descomplicando o Jenkins de maneira bastante completa e simples.

  2. Douglas 24/04/2012 at 15:22 #

    É possível usar o Jenkins para projetos Android?

  3. Fabricio Colombo 24/04/2012 at 16:20 #

    Aqui na empresa utilizamos o Hudson. Qual as principais diferenças entre os dois?

  4. Paulo Silveira 24/04/2012 at 16:20 #

    oi Douglas!

    Da sim. Mais ainda, voce pode fazer com que ele teste em diferentes resolucoes e obter um feedback automatico. Link do plugin:
    https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin

    abracos

  5. Adriano Almeida 24/04/2012 at 21:09 #

    Oi Fabricio,

    Depois da briga que aconteceu, o Hudson ficou com a Oracle e se nao me engano com a Sonatype também e o Jenkins foi o fork que ficou com a comunidade.

    Outro ponto importante é que a diversos plugins que antes suportavam o Hudson, agora só suportam o Jenkins. Não são todos, mas boa parte.

    Em termos de funcionalidade core, ambos tem um conjunto muito similar.

    abracos

  6. Mark Apollo 25/04/2012 at 13:34 #

    Fabricio, a diferença é exatamente esta que o Adriano falou, aqui na empresa usávamos o hudson, mas, como costumamos atualizar ele sempre, quando surgiu o jenkins nós migramos para ele, foi uma migração tão tranquila quanto uma atualização de versão. Os repositórios são totalmente compatíveis (ao menos na época, cerca de 1 ano). nada que reclamar. Lembrando que trabalhamos com Delphi aqui…

  7. Lucas Pérez 25/04/2012 at 20:40 #

    Excelente Post… Grande oportunidade para quem não usa começar a usar. Parabéns !!!

  8. Fabricio Colombo 26/04/2012 at 00:46 #

    Obrigado pelas explicações. Vou baixar o Jenkins para dar uma olhada.

  9. Luiz 27/04/2012 at 01:37 #

    Pode ser usada a opcao “Trigger builds remotely (e.g., from scripts)” tambem para nao precisar ficar rodando desnecessariamente

  10. Francisco Zigmund Sokol 27/04/2012 at 22:04 #

    Oi Luiz,
    Você tem razão, se usarmos essa opção, podemos controlar exatamente quando os builds serão executados, mas da maneira como configuramos no tutorial, os builds serão executados a cada push feito no repositório. Ou seja, não executaríamos nenhum build desnecessário e, melhor ainda, se algum build (ou teste automatizado) quebrasse, saberíamos exetamente qual foi o commit culpado!

    abraço,

  11. Eric 03/05/2012 at 11:36 #

    Excelente post, Chico!

  12. Jean 03/05/2012 at 13:14 #

    Muito legal. Já utilizei o Hudson em um projeto, agora vou retomar o uso.

  13. Leonardo Grandinetti 03/05/2012 at 17:16 #

    Excelente tutorial. Para o próximo post, sugiro conferir as iniciativas do Integration Consortium , o OpenEAI e para dados , o framework da Talend.

  14. Xavier 03/05/2012 at 20:02 #

    Quem quiser testar é só se cadastrar no Cloudbees, eles oferencem uma instancia do jenkins para fazer build de ate 5 projetos de graça.

    http://www.cloudbees.com/

  15. Max Davis Lins 07/05/2012 at 08:21 #

    Excelente Dica!

  16. Thiago Luiz 09/05/2012 at 11:57 #

    O post é excelente para desmitificar a utilização do Jenkins. Parabéns!

  17. Wagner Queiroz 11/05/2012 at 13:18 #

    Parábens, ÓTIMO post !!!

    Depois de 106 erros (igual a uma tarde + uma manhã) na construção, CONSEGUI !!! Ambiente de I.C. rodando redondinho, (e por incrível, no Windows) 🙂

    Não sabia nada de I.C., agora sim eu entendi (na prática) esse “monstro-de-sete-cabeças”.

  18. Thiago Marinho 24/05/2012 at 23:34 #

    Obrigado pelo Post, bem esclarecedor. =D
    @tgmarinho

  19. Neylor Leandro de Sousa 23/08/2012 at 19:57 #

    Gostei muito do artigo, parabéns. Possuo uma dúvida, onde trabalho configuramos um único repositório SVN e colocamos todos os projetos nele. Nesse caso, o Jenkins consegue rodar somente quando houver um commit no trunk especificado da aplicação ou teria que utilizar a técnica “Trigger builds remotely (e.g., from scripts)” que foi citada pelo Luiz? Na opção da Trigger, alguém possui algum exemplo ou referência para pesquisa?
    Parabéns mais uma vez!

  20. Heoísa 07/10/2012 at 11:53 #

    Eu utilizo o webdriver para automatizar os testes de um sistema online. e utilizamos o Hudson para a integração continua. o objetivo é fazer um TDD. Temos um servidor de testes que não é unicamente para esse teste automatizado. estamos pensando em fazer um servidor especifico para o teste automatizado, pois o ato de commitar no teste local atrapalhava o resultado dos testes automatizados. O problema é que agora não temos ideia de como fazer um deploy remoto entre o servidor que terá o webdriver, os codigos para teste(windows) ao sistema que devera ser testado(linux). Então alguem tem uma dica de plugin ou um comando que possa me ajudar.

  21. Paulo 08/11/2012 at 17:23 #

    olá, estou tentando utilizar o plugin rebuild do jenkins, mas o icone de rebuild não aparece.

    alguém tem alguma ideia do que tenho que fazer?
    atualmente utilizo o maven para construir minha aplicação

    []`s e obrigado 🙂

  22. juliano 05/02/2013 at 11:14 #

    bom dia.estou enfrentando o seguinte problema: consegui fazer build de aplicações .net, utilizando o msbuild. No entanto, para aplicações java, não consegui, como deve ser feita a configuração? Outro detalhe, e para o sonar?o que devo fazer para que funcione a integração do jenkins com o sonar?

  23. Jailson 11/04/2013 at 16:33 #

    Boa tarde Pessoal,

    Como eu faço no jenkins para gerar um pacote apartir de uma revisão mais antiga?

    Exemplo: gerei um pacote 02/04/2013 rv 85025 e hoje preciso gerar o mesmo pacote mas sem os commits atuais, como eu configuro na ferramenta para ela gerar apartir desta revisão?

  24. everson 12/04/2014 at 18:32 #

    Olá, não sei por que, mais a pagina do jenkins aparece no meu navegador, nos respectivos sites : google, hotmail, youtube, dentre outros, e só consigo então acessar esses sites usando hotspot shield, existe algum meio de desinstalar, desativar ou apagar esse jenkins ? por favor mandar uma resposta no meu mail plz.
    eversonneo@hotmail.com

  25. Ricardo 27/08/2015 at 12:13 #

    Olá Francisco Sokol, bom dia.

    No final do seu post você informa um link dizendo:

    “Confira nosso curso online de integração contínua com Jenkins.”

    Não consegui encontrá-lo na plataforma da caelum e nem na plataforma da alura, você poderia me informar por gentileza que curso seria esse que você citou no seu post?

    Desde já agradeço!

    Att.
    Ricardo.

  26. Bruno 31/10/2015 at 01:37 #

    Pois é eu tenho quase que certeza que vi esse curso no Alura, mas ele sumiu…

  27. Taiana 15/12/2015 at 10:19 #

    olá, é possível rodar teste do android sem o plugin nativo? digo isso, pq o emulador está muito lento e os testes estão quebrando, mesmo eu colocando tempo =/ tem algum outro plugin para rodar os testes de android no jenkins???

  28. Jader Souza Farais 31/01/2016 at 13:30 #

    Estou com problemas no jenkins, toda vez que vejo o status está informando que o jenkins está morto mas pid existe. já fiz a remoção do jenkins.pid e voltei a inicia-lo mas sem sucesso.

  29. Renato Pereira 08/04/2016 at 19:59 #

    Excelente post, me ajudou muito!

  30. Anonimous 01/09/2016 at 14:47 #

    Estou com problemas com o Servidor SMTP, o Jenkins não envia o e-mail pra equipe. alguém já passou por isso?

  31. Ramon 07/01/2017 at 19:01 #

    Sou um curioso na área de informática e gostaria de entender qual a ligação entre Jekins e JUnit. Ambos são uma ferramenta para testes automatizados? Há diferenças entre eles?

  32. Paulo Silveira 15/01/2017 at 22:25 #

    Sao coisas diferentes. O jenkins é quem vai poder automatizar e controlar os seus builds, deploys, etc. Normalmente isso envolve uma fase de rodar uma bateria de testes de unidade, onde é utilizado o junit com frequencia.

  33. Siva Hora 28/01/2017 at 10:01 #

    ola pessoal, alguém pode me explicar a diferença do Jenkis open souce e do Jenkis da CloudBees?

  34. Matheus Henrique 22/04/2017 at 22:09 #

    Na hora de ir no Build, não tem a opção Invoke Ant

Deixe uma resposta