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 puerto8080
del contenedor jenkins al puerto8085
del host.--name jenkins
establece el nombrejenkins
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.