Migrar Jenkins hacia un Contenedor en Docker

Publicado el 01/02/2016

Introducción

Jenkins es un sistema de integración continua utilizado ampliamente por los grupos de desarrollo de software. Por otra parte, Docker nos brinda una nueva forma de estructurar nuestros servicios.

Migrar nuestro sistema Jenkins hacia la filosofía brindada por Docker puede ser un deseo o una meta de nuestro grupo de desarrollo. Sin embargo, existen preguntas a responder:

  • ¿Se perderán las configuraciones establecidas hasta el momento?
  • ¿Se perderán las estadísticas de las rutinas establecidas?
  • ¿Que tiempo estará Jenkins sin brindar servicios?

La respuesta a ambas preguntas es no. El objetivo del presente artículo es mostrar cómo modificar la estructura del sistema Jenkins sin tener que empezar desde cero.

Las modificaciones mostradas en el artículo fueron realizadas todas en el mismo servidor aunque se puede utilizar un segundo alojamiento para el cambio.

El sistema Jenkins solo dejará de brindar servicios 5 segundos.

Pre requisito

Para realizar los pasos del artículo deberá cumplir con el siguiente requerimiento:

  • Tener instalado Jenkins.

Entorno

La configuración del entorno donde fue desarrollado el artículo es la siguiente:

### Sistema de integración continua ###
         SO: Ubuntu 14.04
    Jenkins: 1.645
    Dominio: jenkins.example.com

El dominio jenkins.example.com se utiliza para acceder al sistema Jenkins.

Paso Uno – Instalar Docker.

La información referente a la instalación de Docker se encuentra claramente descrita en su Sitio Web Oficial. Durante la instalación de Docker hay que tener en cuenta el sistema operativo instalado en nuestro servidor.

Paso Dos – Iniciar el servicio de Jenkins.

Iniciar Jenkins

Para iniciar Jenkins utilizando Docker se escribe lo siguiente:

docker run -p 8085:8080 --name jenkins jenkins
  • -p 8085:8080 enlaza el puerto 8080 del contenedor jenkins al puerto 8085 del host.
  • --name jenkins establece el nombre jenkins al contenedor creado.

Comprobar que funciona Jenkins

Para comprobar que Jenkins funciona correctamente acceda al siguiente enlace web:

http://jenkins.example.com:8085

Detener el servicio

Es necesario detener el servicio para continuar con las configuraciones.

Ctrl-C

Paso Tres – Establecer un volumen para los datos.

Crear estructura

Crear las carpetas donde serán almacenados los datos y las configuraciones del servicio.

sudo mkdir -p ~/jenkins/data

Dar los permisos 777 a las carpetas creadas para que el usuario jenkins escriba dentro de ellas.

sudo chmod -R 777 ~/jenkins/
  • carpeta jenkins: almacena las configuraciones para Docker.
  • carpeta data: almacena los datos de Jenkins.

Iniciar el servicio utilizando el volumen de datos

Para iniciar el servicio utilizando el volumen de datos se escribe lo siguiente:

docker run -d -p 8085:8080 --name jenkins-with-volume -v ~/jenkins/data:/var/jenkins_home jenkins
  • -d se utiliza para iniciar Jenkins como servicio.

Se puede observar que el contenido creado dentro de la carpeta ~/jenkins/data son los ficheros de configuración de Jenkins.

Detener el servicio

Es necesario detener el servicio para continuar con las configuraciones.

docker stop jenkins-with-volume

Paso Cuatro – Migrar la información hacia el contendor.

Después de creada la estructura de carpetas es muy sencillo migrar la infomación del sistema Jenkins que se encuentra actualmente en uso.

Primero se borra toda la información creada por Jenkins en ~/jenkins/data.

sudo rm -r ~/jenkins/data/*
sudo rm -r ~/jenkins/data/.*

Después, se busca el valor de la variable de entorno JENKINS_HOME dentro del sitio de Jenkins en Jenkins > Manage Jenkins > System Information.

JENKINS_HOME es el camino físico donde Jenkins tiene su información.

Una vez identificada la ubicación de los ficheros de Jenkins se realiza la copia desde la ruta JENKINS_HOME hacia la carpeta ~/jenkins/data.

sudo cp -r /var/lib/jenkins/* ~/jenkins/data/

Iniciar el servicio

Es necesario reiniciar el serivio y revisar que Jenkins tenga los mismos datos en la dirección web http://jenkins.example.com:8085.

docker start jenkins-with-volume

Paso Cinco – Instalar Docker Compose.

La información referente a la instalación de Docker Compose se encuentra claramente descrita en su Sitio Web Oficial.

Paso Seis – Utilizar Docker Compose en el proceso.

Crear fichero YAML

Se crea el fichero docker-compose.yml en la carpeta ~/jenkins/.

touch ~/jenkins/docker-compose.yml

Dentro del fichero se agrega la siguiente información:

app:
  image: jenkins
  ports:
    - 8085:8080
  volumes_from:
    - data
  restart: always

data:
  image: busybox
  volumes:
    - /home/user/jenkins/data:/var/jenkins_home:rw
  • app es el servicio de Jenkins.
  • data es el contenedor para los datos de Jenkins.
  • restart:always garantiza iniciar el servicio al reiniciar el host.
  • Se utiliza user dentro de /home/user/jenkins/data:/var/jenkins_home:rw por y no ~ porque tiene que ser un camino físico.

Detener el servicio

El servicio de Docker se detiene utilizando el siguiente comando:

docker stop jenkins-with-volume

Iniciar el servicio con Docker Compose

El servicio de Jenkins se inicia utilizando Docker Compose. Para lograrlo se escribe lo siguiente:

cd ~/jenkins/
docker-compose up -d

Revisar el correcto funcionamiento del sitio en http://jenkins.example.com:8085.

Paso Siete – Establecer solamente Jenkins como Servicio en Docker.

Modificar el puerto en el fichero yml

Se modifica el puerto del host en el fichero docker-compose.yml quedando de la siguiente forma:

app:
  image: jenkins
  ports:
    - 80:8080
  volumes_from:
    - data
  restart: always

data:
  image: busybox
  volumes:
    - /home/user/jenkins/data:/var/jenkins_home:rw

Detener el servicio de Jenkins

Se detiene el servicio Jenkins utilizando el siguiente comando:

sudo service jenkins stop

Iniciar Jenkins como servicio de Docker

Reiniciar el servicio Jenkins en Docker.

docker-compose up -d

Revisar el correcto funcionamiento del sitio en http://jenkins.example.com.

Listo!!! Migración terminada.

Reflexiones finales

La filosofía brindada por Docker para establecer Contenedores como Servicios (CaaS) es ampliamente aceptada por la comunidad del software. Por otra parte, Jenkins constituye una poderosa herramienta para garantizar los procesos de Integración Continua y Entrega Continua. En el presente artículo queda establecido lo siguiente:

  • Se establece Jenkins como servicio dentro de un Contenedor.
  • La migración del servicio de Jenkins permite conservar los datos y las configuraciones.
  • El servicio de Jenkins solo deja de funcionar 5 segundos durante la migración.

Revisiones significativas

Publicado el 01/02/2016