sexta-feira, 1 de novembro de 2013

Instalando servidor Jenkins caseiro

Estou escrevendo esse post para ficar de tutorial para mim mesmo no futuro =D.

Como toda receita, vamos aos ingredientes:

  • Computador, pode ser aquela torre velha que não servia para nada
  • Internet
  • Ubuntu 12.04
  • No-Ip

Modo de preparo

1) Instalando o Jenkins

No Ubuntu, o Jenkins já possui pacote padrão. Portanto, basta rodar o comando

sudo apt-get install jenkins

Inclusive meu amigo Dênis Costa fez uns scripts bacana para já instalar alguns tipos de ambientes:


Se a instalação ocorrer com sucesso, ela criará um daemon que vai rodar sempre que o computador for ligado. Você pode conferir se rodando acessando no seu navegador:


Essa instalação cria um usuário chamado “jenkins” para rodar o serviço, e a home dele se encontra em:

/var/lib/jenkins

Como essa pasta pertence ao usuário jenkins, toda vez que você for alterar, deverá executar as operações como usuário jenkins ou como super usuário.

A instalação via pacote é mais fácil mas, em geral, não contém a última versão estável. Inclusive na página "Manage Jenkins" ele coloca a mensagem de atualização:



Então se você está fazendo uma instalação nova, aproveite para já atualizar. Visite a página do projeto (http://jenkins-ci.org/) e baixe o arquivo jenkins.war:


Após o donwload, pare o serviço do jenkins:

sudo service jenkins stop

Substitua o jenkins.war na pasta:

/usr/share/jenkins/jenkins.war

Reinicie o serviço:

sudo service jenkins start

Acesse novamente localhost:8080. Depois navegue para Manage Jenkins → Configure System. Quando instalei, a atualização era um patch de segurança e por conta disso era necessário atualizar alguns arquivos. Nessa página (Manage Jenkins), existe logo em cima um aviso pedindo para você clicar para ele sobrescrever esses arquivos. Clique no botão para sobrescrever. Feita a atualização, ele pedirá para você conferir o log de atualização (ele mostra um link indicando isso) e se tudo estiver ok, você pode clicar no botão “Dismiss message” para que a mensagem não aparece mais.

1.1 Segurança

Como a ideia é expor o serviço na web, precisamos de um mínimo de segurança. O jeito mais fácil de controlar quem pode acessar o sistema é utilizando o Open Id. Para isso você precisa instalar o plugin. Navegue para:

Manage Jenkins → Manage Plugins e clique na aba Available

Como existe muito plugin, no seu navegador use o Crtl + F e pesquise por openid. Dê um check nele:



Depois clique em “Download now and install after restart”. As vezes o processo de instalação não consegue restartar o jenkins com o plugin instalado. Se for o caso, a dica é rodar o comando para restartar na força bruta:

sudo service jenkins restart

Se a instalação ocorreu com sucesso, você deve navegar para:

Mange Jenkins → Configura Global Security:



Dê um check em “Enable security” e na parte de "Access Control". Selecione a opção "OpenID SSO", colocando o link do Google. Na parte "Authorization", escolha o "Matrix-based security" e acrescente os emails dos usuários autorizados a acessar a aplicação, bem como seus respectivos poderes:


Clique em salvar.

A partir de agora somente usuários dessa matriz acessam o sistema utilizando sua conta Google como login.

Navegue até Mange Jenkins → Configure System. Nessa tela, escolha o seu domínio:



Obviamente que você precisa escolher um domínio que seja seu e que você tenha acesso ao DNS. Cabe notar também duas coisas:

  1. Escolhi o https por ser um protocolo bem mais seguro que http,
  2. Coloquei a porta 8080 e não a default (443). Fiz isso porque se você usa uma internet em casa, a Net bloqueia as portas padrão, por isso você tem que usar outra para poder acessar (Dica que me foi passada pelo Tony Lâmpada, que por sua vez a recebeu do Beraba).
Feito isso, clique em Salvar

1.1.1) Configuração https:

Acesse o arquivo /etc/default/jenkins. Na linha que começa com JENKINS_ARGS, edite para:

JENKINS_ARGS="--webroot=$JENKINS_RUN/war --httpPort=-1 --httpsPort=8080 --ajp13Port=$AJP_PORT –preferredClassLoader=java.net.URLClassLoader"

Em termos de Jenkins, a configuração enfim terminou.

2) Setup No-IP

Como você quer acessar o Jenkins por um nome, no nosso caso https://seu-dominio.com.br:8080 ,a forma grátis, utilizando a sua internet pessoal, é usar o serviço do site http://www.noip.com/. Cadastre-se. Entre no Hosts/Redirects (http://www.noip.com/members/dns/). Ele vai criar para você um domínio bacana na forma seu-usuario.no-ip.biz. Se você não tiver um dominio, você até poderá utilizar esse como padrão. Clique em modify:



Escolha a opção “DNS Host (A)”.

Como o seu ip na Net é dinâmico, você precisa instalar uma aplicação para avisar o no-ip quando ele muda. Para fazer isso, execute os seguintes comandos no terminal (usar sudo se der erro de permissão):

  • cd /usr/local/src/
  • wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
  • tar xf noip-duc-linux.tar.gz
  • cd noip-2.1.9-1/
  • make install

Ao final da instalação, o programa vai pedir o login e senha de sua conta que você acabou de cadastrar no site do no-ip.


3) Configurando o roteador

Se você utiliza um roteador para compartilhar sua internet, você precisa configurá-lo para dar acesso ao seu servidor. Se você usa um, pode pular esse passo.

Acesse seu roteador digitando no navagador 192.168.1.1. Você precisa saber a senha do roteador. O meu é um linksys e eu vou mostrar as telas dele. Se o seu for diferente, você pode procurar na internet como configurar o seu modelo.

A primeira coisa é que seu roteador deve estar atribuindo ip dinamicamente. Assim, ao seu servidor pode ser dado um ip diferente toda vez que for religado. Isso seria um problema, pois você teria toda vez que conferir o ip no roteador e reconfigurar. Alguns permitem a você atribuir um ip fixo para um computador na rede e foi isso que eu fiz. Acessei:


Cliquei em “DHCP Reservation”. Na tela que abriu, chequei o computador que eu queria e cliquei em add clients.





Assim, o ip não vai mais ser alterado pelo roteador. Em seguida, acessei a parte de redirecionamento de porta. Coloquei como porta externa a 8080 e também como porta interna. Coloquei o ip da máquina escolhida (192.168.1.103) e chequei coluna enabled . Depois salvei as configurações.

Para checar se funcionou, você pode usar o site www.canyouseeme.org. Basta escolher a porta (8080 no nosso caso) e clicar em checkport. Se aparecer a mensagem de Sucess em verde, tudo está ok.


4) Configurando seu domínio.

Nesse ponto, você já pode acessar seu Jenkins através da sua url do no-ip: https://seu-usuario.no-ip.biz:8080.

Mas gostaríamos de colocar o acesso através de nosso domínio. Sendo assim precisamos criar uma entrada CNAME no nosso provedor de dns.

Se você, assim como eu, usa o registro.br, acesso o site, clique em no domínio desejado e depois em Salvar e Editar DNS.

Na página em que abrir, clique em +Record, escolha um subdominio (jenkins no caso) e e escolha o tipo CNAME. Na parte dos dados coloquei o endereço do no-ip: seu-usuario.no-ip.biz.



Agora você pode acessar o jenkins através da url https://jenkins.seu-dominio.com.br:8080. Como estamos usando https e nosso servidor não tem certificado, o navegador vai reclamar. Se for o Mozila, clique em "entendo os riscos". Aqui poderíamos tentar colocar um apache para rodar e servir como proxy, e talvez colocar um certificado nele. Se alguém já fez isso (acho que o Tony fez) me mande o link que eu coloco aqui no post. Para mim não foi um problema adicionar a exceção de segurança.


Conclusão

O objetivo foi atingido: foi possível utilizar aquele computador que estava jogado as traças para fazer um servidor de integração contínua em casa, utilizando a sua internet pessoal. Houve alguns problemas: é necessário colocar https:// e acrescentar a porta no final da url e por conta do certificado, o servidor reclamar. Mas enfim, fiquei satisfeito com o resultado.

Com esse setup agora eu posso, junto com o Dênis, acessar o Jenkins remotamente, até mesmo do celular, para poder demonstrar um deploy com um clique em nossa palestra sobre entrega contínua(http://www.slideshare.net/RenzoNuccitelli/python-brasilentrega-contnua ) sem sobrecarregar a rede do evento (isso quando ela existe ;D)

Espero que vocês tenham gostado desse quitute que preparamos na receita de hoje. Entrem em contato, sugestões são sempre bem vindas.

Abs,
Renzo Nuccitelli


PS: MOMENTO REVOLTA: Ei Net, vai tomar no toba! Procurei saber sobre o bloqueio de portas e dizem que é por questão de segurança. Mas aí acho um link no reclame aqui: (http://www.reclameaqui.com.br/3775039/net-tv-e-banda-larga-virtual/porta-80-bloqueada-para-conexoes-entrantes/). Ou seja, se pagar por um ip fixo, aí pode desbloquear a porta 80, não tem problema com vírus?. Enfim, sei que com isso eles querem evitar que você utilize uma conexão doméstica para servir um site. Mas se eu pago pela velocidade, simplesmente deviam liberar. Pode deixar que eu tomo conta do vírus no meu próprio pc.

Assim se cria uma oportunidade para se ganhar dinheiro em cima da babaquice de uma empresa. A próprio no-ip consegue fazer um proxy reverso para você, permitindo acesso na porta 80 ou 443. Basta pagar e fazer a configuração: http://www.noip.com/support/knowledgebase/getting-started-with-no-ip-com/. O preço fica em 14,95 doletas. Afinal, ser extorquido para ter que fazer um net empresas de mais de R$ 200,00 é o fim da picada: (http://www.reclameaqui.com.br/774534/net-tv-e-banda-larga-virtual/venda-de-ip-fixo-por-9-00-adicionais-na-fatura/). Olhá aí a maravilha de letra miúda dizendo que planos de 10 e 20 mega não incluem ip fixo: http://www.netcombo.com.br/empresas/banda-larga.

Enfim, fica um link que recebi do Luciano Ramalho que aborda bem o assunto, indo ainda mais além: http://terramagazine.terra.com.br/silviomeira/blog/2013/10/28/liberdade-dinheiro-neutralidade/ #marco-civil-internet

3 comentários:

Edgar Gabaldi disse...

Renzo,

Eu também não curto muito o fato de não conseguir acessar algumas portas da Net como 80 e 22 ou qualquer outro serviço conhecido.

Já fiquei bastante chateado com isso e as vezes tenho essa necessidade uma vez ou outra. Não é só a NET que faz isso, VELOX também e acredito que qualquer outro provedor de acesso. =(

Semanticamente até dou razão. O serviço de acesso a internet que eles oferecem é para consumir internet e não dar a possibilidade dos clientes proverem serviços. Pense na responsabilidade de um VPN numa pequena empresa que contratou um plano domestico. A internet cai e a empresa do cara para, quem é responsável pelo serviço?

Quando você paga pelo pelo IP Fixo, você não tem apenas as portas liberadas, você tem outra prioridade no SLA de suporte.

Claro que nossas necessidades não possui fins comerciais e sinceramente, esse é na minha opinião o maior problema com o bloqueio dessas portas. O atendente quando fala para você "é para evitar vírus" é uma resposta padrão para dar para pessoas comuns, ele não sabe que você ou eu temos conhecimento técnico para saber que não tem nada haver.

Temos sempre a opção de mudar a porta padrão dos serviços para portas não bloqueadas, que são muitas e "driblar" esse contratempo. Quase todo serviço de rede disponibiliza essa opção.

Abraço e boa sorte.

felipebastos disse...

vlw pelo artigo ..

infelizmente, todos os provedores brasileiros tem esse probleminha por causa do plano empresarial ;(

Renzo disse...

Edgar, só discordo em não liberar as portas ao menos quado vc pede por isso. Liberá-las não tem a ver como ip fixo ou SLA. Simplesmente existem casos em que vc não quer ou precisa de nenhum dos dois, como apenas para fazer testes com um servidor caseiro. Isso para mim é apenas uma malandragem dos ISPs, só isso. Mas como vc bem disse, a gente da um jeito acessando o serviço em portas genéricas =D