Série Continuous Integration: Usando GitHub para autenticação no Jenkins

Olá Pessoal,

No post de hoje vamos ver como usar uma conta do GitHub como autenticação  para o nosso Jenkins. Eu particularmente acho isso fantástico, pois não preciso ficar gerenciando usuários. A única desvantagem é se o projeto não usar GitHub.  Daí podemos optar pelo próprio banco do Jenkins ou criar um com o MySQL, por exemplo, e fazer o Jenkins consultar o usuário nessa base de dados.

Lets go…

Starting…

Considerando que você já tem o Jenkins instalado, por default ele não pede autenticação, ou seja, qualquer um que souber o endereço do seu jenkins, caso esteja publico, pode acessar e buildar ou apagar o seu projeto. Que ruim heim? Vamos ver aqui como fazer autenticação.

Se você vem acompanhando o post no blog, certamente já tem o plugin do GitHub e o de autenticação instalado no Jenkins, senão instale em manage Jenkins >> manage plugins.

 

jenkinsplugingithub

Instale e salve. Escolha a opção Install without restart.

Agora vá novamente a manage jenkins e escolha configure global security. Por default vai estar desabilitada. Habilite.

E escolha:

 

jenkinsgithubauth

Aqui teremos que colocar as informações de autenticação do GitHub. Mas o que colocamos ai? A autorização de que usuários podem logar nessa aplicação a partir do GitHub. Então siga esses passos:

  1. Faça o login no Github com sua conta ou a conta que irá permitir acesso;
  2. Acesse: https://github.com/settings/applications
  3. E agora:

 

jenkinsregistergithub

E preencha:

 

jenkinsgithubregisterdone

O clientID e o Client Secret são gerados. Coloque no campo do Jenkins respectivamente, e agora vamos autorizar os usuários que podem acessar. Coloque no campo a seguir os usuários do GitHub que será admin no Jenkins, ou seja, terá permissão total sobre o build:

jenkinsgithubauthorization

A separação é por vírgula. Não se esqueça disso.

Salve as alterações. Feche o Jenkins e abra novamente. É esperado que apareça:

jenkinsgithublogin

Faça o Login. No primeiro acesso, o GitHub vai perguntar se você deseja acessar a aplicação de terceiro que você foi adicionar, permita o acesso e pronto. Você já vai cair no Jenkins.

Show e simples né?

Abraços. Vou ficando por aqui.

See ya!! 

Troubleshooting Jenkins com repositório privado Github

 

Olá Pessoal,

Quebrei a cabeça esses dias tentando fazer o jenkins se comunicar com um repositório privado no GitHub. Considerando que o jenkins está em um servidor remoto, deu muito trabalho, gastei umas 12hrs até funcionar.

O Problema:

jenkins github private repository returned status code 128:

Essa é a exceção que recebemos quando o Jenkins tenta conectar ao repositório privado para fazer o clone.

O motivo?

O Jenkins não consegue autenticar para fazer o clone.

O que achei?

Não fui muito feliz achando que era da mesma forma que fazemos com repositório público, que apenas gerar o ssh key e adicionar no github. Mas não é bem assim.

Solução

Para resolver o problema eu tive que adicionar 2 ssh key.

  1. Gerei um ssh específico (algo como id_rsa_meuprojeto);
  2. Peguei o id_rsa que já tinha no meu servidor e adicionei ao github.

Resumindo em steps

1. Passphrase não pode ter password, ou seja,  deixar empty para o id_rsa_meuprojeto

2. Criei um key específico id_rsa_meuprojeto e adicionei no github e dei authorized no servidor pelo painel. No meu caso uso  integrator

3. Adicione o id_rsa do servidor no github

4. No Jenkins usei key do id_rsa_meu projeto

Veja na imagem a seguir:

demoniojenkinsfixed

E no Jenkins informe o repositório assim:

jenkinsconfiggithub

Ou seja, usando git@github.com:youruser/yourproject

Não use Https, porque não vai.

É isso ai, só buildar e ver o clone rolando.

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