domingo, 23 de noviembre de 2014

Jenkins en alta disponibilidad


Introducción


En esta entrada se explica cómo instalar un entorno del servidor de integración continua Jenkins en HA, de forma que se tengan preparados dos Jenkins Master.

La configuración descrita es de tipo activo-pasivo y utiliza la tecnología HAproxy.

Para ello se van a necesitar 3 máquinas. 

  • Máquina haproxy: 
    • Sistema operativo CentOS 6.5
    • Software necesarios:
      • haproxy
    • IP: 192.168.1.50
  • Máquina jenkins1: 
    • Sistema operativo CentOS 6.5
    • Software necesario:
      • jenkins.
      • java 7 oracle.
  • Máquina jenkins2: (Igual que la máquina jenkins1)

 Instalación de jenkins

Las máquina jenkins1 y jenkins2 deben tener instalado Java7 de oracle, para este punto se puede seguir cualquiera de los tutoriales que se pueden encontrar por internet, por ejemplo este.

Para la instalación de Jenkins se puede seguir los pasos descritos en la propia página de Jenkins. (En la página instalan jdk6, es preferible instalar jdk7).

Los pasos descritos básicamente consisten en ejecutar estos 3 comandos:



wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo  
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key  
yum install jenkins  


Una vez instalado se puede especificar que se inicie el servicio al arrancar la máquina y arrancar el servicio:


 chkconfig jenkins on  
 service jenkins start  


Si no se le especifica lo contrario la home de jenkins está en el directorio /var/lib/jenkins .


Instalación y configuración HAproxy


HAproxy está dentro de los repositorios de CentOS con lo cuál su instalación es muy sencilla, simplemente consistes en ejecutar la siguiente instrucción:


 yum install haproxy  


El fichero de configuración de haproxy es el fichero /etc/haproxy/haproxy.cfg , se recomienda hacer una copia del fichero original:


 cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig  

Y sustituir el contenido de este por:


 global  
   log   127.0.0.1 alert  
   log   127.0.0.1 alert debug  
   maxconn 4096  
 defaults  
   log              global  
   mode              http  
   option             httplog  
   option             dontlognull  
   option             redispatch  
   retries            3  
   maxconn            2000  
   timeout connect     5000  
   timeout client     50000  
   timeout server     50000  
 ####################################  
 #  
 #      loadbalancer  
 #     192.168.1.50:8555  
 #      /     \  
 #  Jenkins1      Jenkins2  
 # 192.168.1.51:8080   192.168.1.52:8080  
 #  (active)      (passive)  
 #  
 ####################################  
 listen jenkinsfarm 192.168.1.50:8555  
   mode  http  
   stats  enable  
   balance roundrobin  
   option httpclose  
   option forwardfor  
   option httplog  
   option httpchk  GET /  
   server Jenkins1 192.168.1.51:8080 check inter 5000 downinter 500  # active node  
   server Jenkins2 192.168.1.52:8080 check inter 5000 backup      # passive node  

Como se puede ver, con la configuración realizada en haproxy, la máquina 192.168.1.50 (haproxy), hace de balanceador entre los dos máquinas jenkins, de forma que, si desde un navegador se va a http://192.168.1.50:8555 , haproxy ira contra jenkins1, si esta no responde realizará la petición al server backup, que es jenkins2.

Para poder realizar la prueba solo es necesario iniciar el servicio de haproxy:


 service haproxy start  

Y activarlo al iniciar la máquina:


 chkconfig haproxy on  


Configuración de los discos

 Jenkins guarda toda la información de las construcciones en disco, este punto es muy importante, porque con la configuración descrita, cada jenkins master tiene su propia información de las construcciones, en un directorio local de cada máquina "/var/lib/jenkins"

Para solucionar este problema, se debe especificar una variable JENKIS_HOME que apunte a un directorio compartido entre los dos jenkins. Por ejemplo un NFS distribuido.

Una solución menos elegante, es ir sincronizando los directorios home de la dos máquinas.

Visualizar el estado de los servidores


HAproxy dispone de una página donde se muestra el estado de los servidores, la URL para este ejemplo es http://192.168.1.50:8555/haproxy?stats

En el caso de que jenkins1 este iniciado y jenkins2 parado, se vería algo así:




Solución empresarial Jenkins HA

Una solución empresarial para disponer de Jenkins en alta disponibilidad, es la que ofrece ClouBees, con su plugin High Availability Plugin.

Destacar que CloudBees ofrece muchas funcionalidades en su versión empresarial de Jenkins.