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-3 eu já tinha resolvido facilmente, mas o ponto 4-5 estava 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. Dúvidas? No blog tem posts relacionados, dá uma procurada nas devidas sessões.
Crie um reposito Git
O meu chamei de trunk.
Criando o projeto parent
Esse cara aqui é o mais importante, pois é pra ele que vamos apontar o Jenkins. Portanto, crie um maven Project:
** Você vai precisar ter o Jboss Tools instalado Plugin instalado na sua IDE Eclipse.
No próximo passo
Observe que criei uma pasta chamada parent-project dentro de trunk. Faça isso.
No ultimo passo, deixe conforme a imagem a seguir:
Agora crie dois maven project, porém no segundo passo deixe assim:
** o package você decide. Eu criei um .jar para o projeto core e .war para o projeto web.
No meu caso:
Abra o arquivo pom.xml do parent-project e adicione os dois outros projetos como modules:
Abra o pom.xml de um dos projetos que você criou, no meu caso ereaders-core. E em parent deixe assim:
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, crie 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.
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>
Caso contrario o seu build ia falhar, poruqe 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
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. Veremos a seguir. Como estou usando o Git, então informei onde está o repositório:
E no build configurei:
Salve as alterações e clique em Build Now
E o resultado é o build construído.
Bom, essa foi uma das soluções e que achei mais viável para o meu projeto. Espero que tenha gostado.
Compartilhe sua experiência… como tem feito?
Abraços, see ya!!
Bom, eu devo admitir de cara que não uso eclipse pra java faz tempo. E também eu só mexo nos pom.xml na mão, mesmo, desde sempre. E Jenkins faz parte de um longo e distante passado 🙂
Não sei, eu acho que ajudar bastante se você colocasse os trechinhos relevantes dos poms.
1) Eu não sei como ficou a estrutura de diretórios, mas eu já vi que o maven fica mutcho loko se você define o parent-pom no mesmo nível hierárquico que os projetos que herdam esse pom. Boa prática é: defina o parent pom e defina os modulos nesse parent pom.
— Parent project pom —
com.mygroup.ereaders
parent-project
1.0-SNAPSHOT
reader-core
reader-web
————————–
Aí, em cada um dos módulos, vc fala que o pai é:
com.mygroup.ereaders
parent-project
1.0-SNAPSHOT
ereader-core
——————————————-
Se você fizer assim, o maven coloca o parent como primeiro no reactor. Não precisa colocar o endereço relativo.
Não entendo porque o plugin de war precisou do endereço daquele jeito. Se você declarou o plugin no nivel do ereader-web, “WebContent/WEB-INF/web.xml” deveria bastar. As barras desse jeito devem funcionar em todos os SOs.
Acredito que se você tivesse criado o projeto usando os arquétipos do maven isso não aconteceria, só pra constar.
O legal disso é que, desde que seu parent-pom esteja instalado no teu local repo, você pode buildar os módulo um independente do outro.
(Nome do repo: trunk. Que old school! rs)
oi Cintia,
Mas, é essa estrutura.Há um trunk como parent. Os projetos foram criados usando arquétipos do maven.E nesse caso fiz um build para o projeto pai então todos os projetos filhos são buildados. Mas, poderiamso ter builds independentes para cada modulo. E uma alteração apenas naquele modulo, resultaria em um build especifico. Mas, como saber se alteração daquele modulo não quebrou em algum outro local de forma automatizada? Só rodar os testes locais não resolve, se tiver testes funcionais tendem a demorar. Transferir o trabalho para o Jenkins por exemplo, é uma boa alternativa.
Google não me respondeu rapido. Tem um default goal pra uma maven task no jenkins?
Não tem Cintia.
camilo, bom dia!!! vc tem o código fonte para baixar para que possa construir por aqui? estou aprendendo a mexer com o jenkins, e maven.
olá Juliano,
Não tenho mais o fonte desse projeto. Mas, vc sobe qualquer projeto seu no github e pronto, até um hello world com main.
abraço,