Série CI:Maven + Jenkins + Git

Olá Pessoal, no post de hoje vamos ver como integrar maven + jenkis + git. É algo aparentemente simples, mas que na primeira vez me deu umas dores de cabeças chatas até deixar tudo redondo e resolvi compartilhar com vocês.

Lets go…

 O problema

Sempre temos que ter um problema para que o nosso dia fique mais emocionante. Então eu tinha alguns:

  1. Queria montar um ambiente automatizado com o jenkins ;
  2. Queria conectar o jenkins com o git;
  3. Queria fazer meu jenkins buildar pelo maven ;
  4. Não ter um Java Project apenas;
  5. Não queria ter mais de um repositório no Git, ou seja, nada de um repositório por projeto.

Bem, do problema 1 ao 3 eu já tinha resolvido facilmente, mas os pontos 4 e 5 estavam me incomodando, porque eu queria ter mais de um projeto para ter as coisas organizadas e melhor para trabalhar, sem falar que a manutenção fica mais fácil. Também há outro fator, eu sou preguiçoso para coisas repetitivas, odeio ter que fazer mais de uma vez o mesmo trabalho. Gosto de fazer o trabalho chato uma vez e se precisar mudar algo amanhã, que o esforço seja o mínimo possível.

A solução

Após horas de tentativas de montar a estrutura ideal que queria, cheguei a uma que atendeu ao que precisava, ou seja, atingi os 5 pontos citados anteriormente. Como? Simples assim:

  • Repositório: crie um repositório git, que aqui chamei de trunk
  • Parent: crie um maven Project chamado parent. Nele vou colocar as dependências base e comum nos projetos. Adicionei os outros projetos como module do projeto parent.
  • Filho 1: criei um Project maven chamado readers-core que será um projeto focado apenas no back-end da aplicação.
  • Filho 2 : criei um Project maven com suporte JSF que será focado na parte de front-end, porém esse projeto tem uma dependência do projeto filho 1 (readers-core).

Cada projeto tem seu próprio pom.xml, isso evita de ter um pom.xml com tudo e sabemos que quando a configuração de XML começa a crescer é um inferno pra ficar dando manutenção e se achar nele. Daí cada projeto terá no seu pom.xml aquilo que ele precisa de fato, por exemplo, o projeto ereaders-core não precisa ter uma dependência  JSF definida no pom.xml, porque esse é um projeto que não foca em front-end.

A estrutura ficou assim

–meu repositório git

                –parent-project maven

                               –projeto Java A

                               –projeto Java  B

Na prática

Bem, não vou explicar como instalar o jenkins na máquina, nem o Git.No blog há posts relacionados nas devidas sessões. 

  1. Crie um repositório Git (O meu chamei de trunk.)
  2. Criando o projeto parent

Esse cara aqui é o mais importante, pois é pra ele que vamos apontar o Jenkins.  Portanto, crie um maven Project:

 

mavenproject

** Você vai precisar ter o Jboss Tools instalado Plugin instalado na sua IDE Eclipse.

No próximo passo

 

mavenstep2project

Observe que criei uma pasta chamada parent-project dentro de trunk. Faça isso.

 

No ultimo passo, deixe conforme a imagem a seguir:

 

mavenconfigureproject

Agora crie dois maven project, porém no segundo passo deixe assim:

 

mavenprojectchildren

** o package  você decide. Eu criei um .jar para o projeto core e .war para o projeto web.

No meu caso:

mavenprojectsmine

Abra o arquivo pom.xml do parent-project e adicione os dois outros projetos como modules:

moduleparentproejct

Abra o pom.xml de um dos projetos que você criou (no meu caso ereaders-core.) e em parent deixe assim:

parentconfigproject

Faça o mesmo para o outro projeto.

Para projetos Web

Se você criou um projeto web, terá que alterar seu pom.xml  conforme a seguir. No meu caso, criei um maven project e depois adicionei “capacidades de JSF”, isso porque o Jboss tools nos permite fazer isso.  Daí a estrutura do projeto fica assim.

 

readersweb

Nós precisamos informar ao maven onde está o web.xml para que ele possa gerar o .war.

Para isso, clique com o botão direito no pom.xml do projeto web e vá na opção maven >> add plugin. Na janela que aparece, informe o seguinte:

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

Feito isso, vá no modo de edição do pom.xml e adicione o código abaixo:

<configuration>

<webXml>..\readers-web\WebContent\WEB-INF\web.xml</webXml>

</configuration>

O código completo:

<plugin>

                    <groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-war-plugin</artifactId>

                    <configuration>

                    <webXml>..\readers-web\WebContent\WEB-INF\web.xml</webXml>

                    </configuration>

             </plugin>

            

Se não fizesse, o seu build ia falhar, porque ele não ia saber o caminho do web.xml. Por default o maven ia procurar em seuprojeto\ WEB-INF.

Alterando a versão do Java no maven

Se você estiver usando um projeto web com suporte servlet 3.0 é requerido Java 6, mas o maven por default usa Java 5. Para alterar basta adicionar o plugin no pom.xml do projeto web:

groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-compiler-plugin</artifactId>

                    <version>3.0</version>

E depois editar adicionando as informações a seguir:

<configuration>

                    <source>1.6</source>

                    <target>1.6</target>

                    </configuration>

 

Feito isso podemos buildar nosso projeto dentro do eclipse e ver o que acontece, portanto clique com o botão direito no parent-project, vá em Run As >> Maven Install

resultmavenbuildinstall

O resultado final deve ser conforme a imagem acima. Simples, não? Agora foi, mas antes disso tive problemas chatos. Um deles foi esse do .war.

No Jenkins

Agora vamos para o Jenkins e criar um job para buildar esse projeto

O meu chamei de parent-project e escolher a opção maven. 

As configurações são bem simples, a mais chata foi a do build, como veremos a seguir.  Como estou usando o Git, então informei onde está o repositório:

jenkinsrepostrunkmaven

E no build configurei:

jenkinsparentprojectpom

Salve as alterações e clique em Build Now

resultparentprojectjenkins

E o resultado  é o build construído.

Bom, essa foi uma das soluções que achei mais viável para o meu projeto. Espero que tenha gostado.

Compartilhe sua experiência… como tem feito?

Abraços, see ya!

Deixe um comentário

O seu endereço de e-mail não será publicado.