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!

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-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!! 

Série Git na Prática: Atualização específica de um arquivo na branch

Olá Pessoal,

No post de hoje vamos ver como atualizar um arquivo especifico na branch a partir da master. Como assim? Vou explicar no decorrer do post.

Lets go…

Starting….

Vamos dizer que a branch master foi atualizada e o arquivo que estou trabalhando sofreu atualização e preciso trazer para branch, então o comando seria  o seguinte:

git checkout master <nome do arquivo>

Assim estamos trazendo o arquivo do master para o branch.

Então vamos supor que na branch de development estou trabalhando com o arquivo Main.java

E na master alguém alterou o arquivo e fez o commit e ele está assim:

E agora preciso pegar essa atualização e trazer para branch. Nesse caso não haverá conflitos porque as alterações foram em pontos diferentes.

Observe que temos arquivos para commit, devido atualização que fizemos:   

Resultado após o commit:

Lembrando: as alterações feitas no arquivo na branch serão perdidas. 

Abraços, see ya!! 

Série Git na Prática:Descartando alterações no working directory

Olá Pessoal,

No post de hoje veremos como descartar alterações quando ainda estamos no working directory.

Lets go..

 Starting…

Algo muito comum é você fazer alteração no arquivo e depois ver que não seria necessário mais aquela alteração e quer descartar. Mas, o que fazer? Ao modificar o arquivo o git vai informar assim:

Então antes de ir para o INDEX queremos descartar as mudanças feitas e deixar o arquivo como antes. Como proceder?

Simples! Basta executarmos o seguinte comando:

git checkout <nome do arquivo>

Se executarmos novamente o git status veremos que não há nada alterado e se abrirmos o arquivo, ele estará como antes.

Só isso. Simples, não? Não é. O git que é fácil.  🙂

See ya!! Abraços.

Git na prática: Entendendo o rebase

Olá Pessoal,

No post de hoje vamos entender o rebase que temos no git.  Acho umas das mais importantes features do git.

Lets go…

Starting …

O rebase é algo tão comum quanto tomar café todos os dias. Na prática, precisamos dele quando estamos trabalhando na branch e sabemos que o repositório master foi atualizado por outros desenvolvedores e precisamos ter nosso branch atualizado, concorda? Não  é nada legal ficarmos trabalhando na branch com o código de 2 dias atrás. Podemos ter problemas e sérios conflitos aqui na hora do merge, o melhor é que se for ter conflito que seja pequeno e de imediato.

In practice

Considerando o cenário dos posts anteriores onde temos a branch development, vamos supor que ficamos trabalhando na branch por alguns dias e a master sofreu alteração, alguém adicionou um novo arquivo lá e fez o commit.

E agora precisamos trazer esse novo arquivo para o branch, assim vamos garantir que nossa branch está igual à master.

Para isso:

1      Vamos na branch git checkout development

2      Dizer para realizar um rebase da branch master

git rebase master

E o que acontece aqui?

Simples, o git se encarrega de colocar os commit que foram feitos na branch em uma branch temporária e pega os commits da master e coloca na branch, depois ele pega os commit que ele mesmo colocou na branch temporária e coloca de volta na branch development. Aqui ele valida commit por commit, ou seja, é possível ter conflito e teremos que resolver manualmente. Veja como ficou o branch com o novo arquivo que tínhamos apenas na master:

A seguir o ciclo:

E depois que terminamos de trabalhar com a branch podemos fazer um merge, como vimos nesse post. E termos a master atualizada, conforme podemos ver na última imagem (de cima para baixo).

Esse é o rebase. Simples, não?

See ya !! Abraços.