Série CI: Conectando Jenkins com GitHub

Olá Pessoal,

No post de hoje vamos ver como buildar nossos projetos no jenkins e mantê-lo conectado a um repositório. No nosso caso escolhemos o github por usar o Git. Claro que poderia ser um outro repositório, até mesmo local, mas o Github é o mais popular repositório Git.

Lets go…

Starting

Antes de mais nada vou considerar que você já conhece um pouco de Git e GitHub, pois não entrarei em detalhes de como cada um funciona, para isso  você precisa ter:

– Um repositório criado no GiHub;

– Git na sua máquina local

Os nossos steps

Basicamente criaremos um projeto e em seguida faremos um push para o GitHub. Tendo o projeto no nosso repositório remoto, vamos configurar o Jenkins para conversar com o GitHub  e poder realizar  “pull” quando o build for inicializado.

Step 1

  1. Abra o seu eclipse e crie um Java Project chamado MyBookStore.

cimybookstore

  1. Feito isso, envie esse projeto para o GitHub.

 

cimybookstoregithub

Uma vez que o projeto já está no repositório, vamos ao Jenkins fazer as devidas configurações (estou considerando que você já tem o jenkins rodando na sua máquina, conforme o primeiro post da série).

Acesse o Jenkins e vá em Manage Jenkins  e escolha Manage Plugins. Alguns plugins o Jenkins já traz e outros precisamos instalar. Na aba de Installed verifique se o plugin do GitHub Plugin está instalado:

githubplugin

Se não estiver, vá na aba de available e procure pelo plugin. Instale também um plugin chamado Git Plugin. Esse é para que o Jenkins possa rodar os comandos do Git.

Note: use a opção install without restart.

Configurando o Jenkins

Agora vamos configurar o jenkins, portanto em manage jenkins escolha configure system e observe que você deve ter uma Git na lista:

jenkinsconfigsystem

Esses caras servem para configuramos e dizermos ao jenkins como ele deve se comportar se o projeto que fomos buildar usar um deles. Não é requerido preencher todos, exceto se você tem N projetos e cada projeto tem que usar uma estrutura diferente, por um usar ant e outro maven, daí você precisa configurar tanto maven quando o ant nessa parte do Jenkins.

Primeiro vamos configurar o JDK que é requerido para qualquer projeto Java onde precisamos compilar as classes .java.

Coloque o local onde instalou o Java, conforme a imagem a seguir:

jenkinsjdk

Assim dizemos ao jenkins onde está o nosso Java e qual ele deve usar para compilar as nossas classes durante o build

Agora vamos para o Git

jenkinsgitconfigure

Nada de diferente, apenas informamos onde está o Git na nossa máquina.

Deixamos as próximas opções da maneira default. Agora vamos configurar o Git Plugin que contém as informações do usuário que fez o commit.

jenkinsgituserconfigure

Observe que estamos configurando o Git e não GitHub.

Essa é uma das partes mais importantes e demorei horas para descobrir, aqui vamos colocar key-gen registrado lá no github:

publishsshkenkinsgithub

Em Github web Hook deixei a opção Manually manage hook URLs selecionada. Salve as modificações.

Pronto, jenkins configurado.

Criando Jobs no Jenkins

Agora vamos criar um job no Jenkins para o nosso projeto.

jenkinsnewjob

E darei o mesmo nome do projeto:

jobjenkinsbookstore

Ao criar o job, vamos para as configurações que nos interessa:

gitsourcecodejenkins

Precisamos informar onde está o nosso repositório, pode estar localmente ou remoto. No nosso caso está remoto no GitHub, que é o:

https://github.com/camilolopes/myworkspace.git

sourcecodegitjenkins

E deixamos assim. É esse cara que o jenkins fará o clone, por isso que ele precisa da URL.

Feito isso podemos salvar e buildar nosso projeto:

jenkinsbuildbookstore

Clique na barra de loading à esquerda para ver o log:

jenkinsgithubstoreclone

Observe que o jenkins conectou ao github e está trazendo o que temos no repositório, nesse caso MyBookStore.

Resultado

A seguir o resultado:

jenkinsresult

A nuvem, eu costumo dizer que o projeto passou por algumas turbulências, o solzão está tudo tranquilo, todo time pode ir para praia tranquilo que ninguém vai ligar para incomodar.

Pronto, temos nosso projeto  sendo construído pelo Jenkins.

Falha no Jenkins

Vamos simular uma falha e ver o que acontece, e para isso precisamos alterar a classe para que o código não compile:

mybookstorenocompile

Daí podemos mandar essa alteração para o GitHub. Uma vez com o código alterado no github:

githubcodechangestore

Precisamos configurar o maven, então vá em manage jenkins e na parte do maven deixe assim:

mavenconfigurejenkins

Esquecemos de configurar no Job como será o build, então vá no job que criamos e depois em configure e deixe assim o build:

buildmavenjenkins

Clique em advanced do build

buildmavencompile

No eclipse, clique com o botão direito no projeto e adicione Maven >> e habilite o maven.

Agora commit e manda as alterações para o github.

Agora vamos mandar o Jenkins buildar nosso projeto e ver o que acontece:

jenkinsfailurebuildstore

Vamos tentar arrumar isso corrigindo o código, altere o código e mande para o GitHub.

githubfixedstore

E agora vamos buildar pra ver o que acontece:

buildifxedbookstore

Pronto, assim concluímos essa parte. Um pouco cansativo na primeira vez devido a configurações, mas depois fica mais fácil. No próximo post veremos como automatizar, ou seja, com uma mudança no nosso repositório remoto, automaticamente o build começa. Fez push para o github, o build  começa a validar.

Abraços, see  ya!!

Série CI: Rodando o Jenkins a partir do Jetty no Windows 7

Olá Pessoal,

Estarei começando uma pequena série de posts de Integração contínua usando o Jenkins. Em um dos posts vamos conectar o jenkins com o github e qualquer alteração no repositório o build começa. Mas antes de chegar lá vamos passar por outros posts importantes também : )  keep calm and develop.

No post de hoje veremos como rodar o Jenkins dentro do Jetty. Algo super simples.

Lets go..

Starting…

Essa é uma opção de termos o jenkins rodando, mas você pode fazer o download do package de acordo com o seu sistema operacional e instalar o jenkins diretamente. Não sei se há muitas vantagens entre as duas opções, mas particularmente prefiro ter um servidor e fazer o deploy do .war do jenkins.

Requisitos

Faça o download de uma versão do jetty. Vou usar o jetty 7.x porque é o que tenho aqui na máquina, porém há versões mais recentes: http://jetty.codehaus.org/jetty/

Após o download do jetty, descompate o arquivo:

 

jettydescompactadao

Abra o prompt de comando do Windows e vá até o local onde está a pasta do jetty:

 

cijettycmd

Podemos iniciar o Jetty só para ver se está tudo ok com ele, então digite:

java –jar  start.jar

 

cijettyjavajarstart

E aguarde o jetty iniciar. Após a inicialização do jetty acesse HTTP://localhost:8080

Você verá o seguinte:

 

cijettyrunning

Pronto, temos o jetty rodando. Isso é bom.

Agora vamos parar o jetty para fazer o deploy do Jenkins. Pare a aplicação com ctrl + C.

Vá no site do jenkins e baixe a versão .war.  (estou usando a última versão)

Após ter baixado o .war coloque o mesmo na pasta webapps, dentro do diretório do jetty que você descompactou ainda pouco:

No meu caso:

jetty-distribution-7.0.0.v20091005\jetty-distribution-7.0.0.v20091005\webapps

Agora, inicie o servidor Jetty novamente java  -jar start.jar

E precisamos aguardar o jetty fazer o deploy do jenkins. Na primeira vez será um pouco demorado. Após o jetty concluir o trabalho dele, vamos ver se o jenkins realmente foi deployed. Acesse http://localhost:8080/jenkins/ e verá:

cijenkinsdeployed

No meu caso, tenho um job criado no jenkins, mas não se preocupe, pois faremos um no próximo post.

Por hoje é isso apenas.

Abracos, see ya!! 

Utilizando o Selenium para testes Automatizado

Olá Pessoal,

No post de hoje vamos ver como usar o Selenium para criação de testes funcionais. A ideia é um teste simples para mostrar a potência do framework e daí cabe a cada um usar de forma que atenda as necessidades do projeto. Para o post vou usar a versão selenium-server-standalone-2.32.0.jar  disponível http://docs.seleniumhq.org/

 lets go…

Overview sobre o Selenium

Bem, se você usar o Google e pesquisar sobre “Selenium unit test” verá vários links para a definição, então não há motivos para repetir no post. Veja no famoso Wikipedia. Há um post que gosto bastante sobre o Selenium  que está no blog da Caelum.

Em poucas palavras, nos permite realizar teste funcionais simulando ações que um usuário estaria fazendo.

Mas por que usar um framework para isso?

Há vários motivos para fazer isso de maneira automatizada, como por exemplo:

  • – produtividade;
  • – qualidade;
  • – custo;
  • – feedback.

Contratar um time de profissionais para fazer testes que você pode automatizar, além de custar caro, o tempo gasto é muito maior que de forma automatizada e isso é importante. Assim podemos contratar profissionais para realizar em pontos estratégicos onde não temos como testar de forma automatizada. Como toda e qualquer ferramenta sempre há uma limitação e ai que entra o fator o humano.

Colocando mão na massa

Vamos colocar a mão na massa e criar um projeto muito simples. Faremos um teste que terá como objetivo acessar uma determinada página na internet e fazer uma pesquisa. Se tudo ocorrer bem, o teste vai passar. Mas, por exemplo, se a página estiver indisponível ou o endereço informado para o teste for inválido o teste vai falhar.  

  1. Crie um Java project e dê o nome que quiser;
  2. Adicione a biblioteca do Selenium ao  classpath do projeto;
  3. Crie uma classe de teste, ou seja, Junit Class. No meu caso criei com o nome de HelloSeleniumTest.java

helloseleniumproject

Vamos criar o nosso primeiro teste que vai acessar a página do Google e pesquisar por “Camilo Lopes”. Veja o código a seguir.

public class HelloSeleniumTest { 

       @Before

       public void setUp() throws Exception {

       } 

       @Test

       public void testSearchInGooglePage() {

             WebDriver driver  = new FirefoxDriver();            

//           Digo qual url para acessar

             driver.get(“http://www.google.com”);            

//           Agora vamos buscar o elemento na página

             WebElement inputTextGoogle = driver.findElement(By.name(“q”));

             inputTextGoogle.sendKeys(“Camilo Lopes”);        

/*           faz um submit na página

 *           poderia buscar o botão search e fazer o submit tb.

 */

             inputTextGoogle.submit();            

             assertTrue(driver.getPageSource().contains(driver.findElement(By.id(“gbqfq”)).getText()));

       } 

}

Entendendo o código

Apesar de que em alguns trechos eu coloquei comentários somente para facilitar o entendimento, vou explicar alguns pontos que considero importantes.

WebDriver: é uma interface do Selenium que todo Web Browser Drivers implementa. O Firefox Browser tem  sua implementação, assim como IE e Chrome, cada um com sua particularidade, e é preciso dar uma olhada na documentação sobre como implementar.

Depois que instanciamos o driver,  dizemos a URL que queremos testar (nesse caso será do Google), mas em um projeto JEE, por exemplo, vamos colocar o caminho onde está nossa aplicação.

Em seguida pesquisamos pelos elementos na página, para isso no Chrome podemos usar o atalho F12, clica na lupa que fica no rodapé e clica sobre o input text e ver qual o nome daquele campo. Podemos usar o id, nome etc. Veja:

seleniuminputgooglesearch

Depois que fizemos isso, criamos uma variável para representar esse campo :

WebElement inputTextGoogle = driver.findElement(By.name(“q”));

 

E em seguida invocamos o método sendKeys(…) e passamos o valor que queremos que seja digitado no input. Para descobrir e conhecer melhor os métodos disponíveis tem que passar por alguns minutos vendo o que temos na documentação do framework.

inputTextGoogle.sendKeys(“Camilo Lopes”);

 

Logo em seguida fizemos o submit página

inputTextGoogle.submit();

 

Criando o assert

Bem, para que  seja testado precisamos usar algum assertXXX do framework Junit. Então vamos verificar se após ter feito o submit há um elemento com o id informado na página.

seleniumtestgreen

O teste passa. Na verdade esse teste  não tem nada de inteligente. Se você reparar, ele verifica se o input que pesquisamos na primeira página do Google é o mesmo na página do resultado da busca.

Claro que em nossa aplicação íamos testar algo mais voltado para regras de negócio. E o método getPageSource() nos ajuda nisso, em busca de um elemento na página corrente.

 

Execute o teste

Vamos executar os testes e aguardar por alguns segundos e veremos que o Selenium vai abrir o browser que definimos (no caso do post foi o Firefox)  e realizar a pesquisa.

 seleniumfirefox

Convertendo isso para uma aplicação

Em uma aplicação web, vamos ter que usar a url onde nossa aplicação está rodando. Claro que vamos evitar que o endereço seja informado dentro da classe Java, este pode ser informado de um arquivo .properties por exemplo, efaremos assert voltado para as regras de negócio.

Conclusão

O objetivo desse post não era explorar como escrever bons testes com o Selenium, a ideia era apresentar o framework e vê-lo em ação. Após isso podemos tirar nossas próprias conclusões sobre a eficiência e produtividade gerada  quando usamos corretamente.  Já passei por algumas empresas e projetos onde falaram que o Selenium foi o responsável pelo aumento do dos prazos nas entregas. Acredito que o problema certamente não foi com o Selenium, mas sim na forma de como este foi usado ou adotado dentro do projeto.

 

E você tem usado o Selenium em seus projetos? Compartilhe sua experiência…

Abraços, see ya!!! 

Promoção compre 2 e leve 3:TDD, SCJP e JEE

 
olá Pessoal, 
O post de hoje é uma promoção exclusiva para os leitores daqui do blog, para não falar muito aqui, confira a seguir:
Promoção compre 2 e leve 3
Pensando em investir em sua carreira, aprimorar seu conhecimento e economizar?
Conversando com a editora consegui essa promoção relâmpago. Se você queria comprar os meus livros, mas a grana estava curta, então aproveite!! Essa é a oportunidade de comprar 2 livros e o terceiro sair de graça. É uma promoção exclusiva para os meus leitores e seguidores. Abaixo falo com mais detalhes e mostro que o terceiro sai de graça mesmo.
 
Como funciona ?
 
É muito simples, veja os passos:
 
1. Você preenche a solicitação no formulário no final post com os seus dados, já incluindo o endereço de entrega; 
 
2. Em até 2 dias úteis você recebe um e-mail com os dados para pagamento; 
 
3. Envia o comprovante de pagamento; 
 
4. Despachamos o livro em até 1 dia útil; 
 
 
O prazo de entrega e Frete
 
Depende da sua localidade. O produto será enviado como PAC e pode levar até 15 dias.
 
 
Simulação – Promoção de verdade 
 
É promoção de verdade!! Veja que o terceiro livro sai de graça. A seguir uma simulação considerando os valores de venda do livro no site da editora (em outros sites o valor pode sofrer variação para mais).
 
1.Guia do Exame SCJP – R$ 39,20 
 
2.JEE com Frameworks – R$ 47,20
 
3.TDD na Prática – R$ 36,80 
 
Total: R$ 123,20 + Frete 
 
 
Na promoção de hoje você paga:
 
1.Guia do Exame SCJP – R$ 39,20 
 
2.JEE com Frameworks – Grátis
 
3.TDD na Prática – R$ 36,80 
 
Total: R$ 76.00
 
Frete : R$ 15.00 
 
Valor Total Investimento: R$ 91,00 
 
Iai vai ficar parado? A promoção é ate o dia 14/07/2013. 
Abracos, vou ficando por aqui.
see ya!!

Rodando o Jenkins a partir do Jetty no Windows 7

Olá Pessoal,

Estarei começando uma pequena série de post de Integração contínua usando o Jenkins. Em um dos posts vamos conectar o jenkins com o github e qualquer alteração no repositório o build começa. Mas antes de chegar lá vamos passar por outros posts importantes também : )  keep calm and develop.

No post de hoje veremos como rodar o Jenkins dentro do Jetty. Algo super simples.

Lets go..

Starting…

Essa é uma opção de termos o jenkins rodando, mas você pode fazer o download do package de acordo com o seu sistema operacional e instalar o jenkins diretamente. Não sei se há muitas vantagens entre as duas opções, mas particularmente prefiro ter um servidor e fazer o deploy do .war do jenkins.

Requisitos

Faça o download de uma versão do jetty. Vou usar o jetty 7.x porque é que tenho aqui na máquina, porém há versões mais recentes: http://jetty.codehaus.org/jetty/

Após o download do jetty, descompate o arquivo:



Abra o prompt de comando do Windows e vá até o local onde está a pasta do jetty:

Podemos iniciar o Jetty só para ver se está tudo ok com ele, então digite:

java –jar  start.jar

E aguarde o jetty iniciar. Após a inicialização do jetty acesse HTTP://localhost:8080

Você verá o seguinte:

Pronto, então temos o jetty rodando. Isso é bom.

Agora vamos parar o jetty para fazer o deploy do Jenkins. Pare a aplicação com ctrl + C.

Vá no site do jenkins e baixe a versão .war.  (estou usando a última versão)

Após ter baixado o .war coloque o mesmo na pasta webapps, dentro do diretório do jetty que você descompactou ainda pouco:

No meu caso:

jetty-distribution-7.0.0.v20091005\jetty-distribution-7.0.0.v20091005\webapps

Agora, inicie o jetty novamente

java  -jar start.jar

E precisamos aguardar o jetty fazer o deploy do jenkins. Na primeira vez será um pouco demorado. Após o jetty concluir o trabalho dele, vamos ver se o jenkins realmente foi deployed, acesse http://localhost:8080/jenkins/

E teremos:

No meu caso eu tenho um job criado no jenkins, mas não se preocupe, pois faremos um no próximo post.

Por hoje é isso apenas.

Abracos, see ya!!