Uno de los casos de uso más frecuentes de Docker es formando parte de una cadena de integración y despliegue continuo (CI/CD) gestionada por Jenkins.

En esta serie de artículos vamos a levantar un contenedor con Jenkins sobre Docker y vamos a configur Jenkins paso a paso.

Descarga y ejecución de Jenkins en un contenedor

La instalación de Jenkins usando Docker no podía ser más sencilla:

  1. Buscamos la imagen oficial de Jenkins en Docker Hub: https://hub.docker.com/r/jenkins/jenkins/
  2. Revisamos las etiquetas disponibles y seleccionamos la última versión disponible (al escribir este artículo) basada en Alpine Linux: jenkins/jenkins:2.107.1-alpine.
  3. Descargamos la imagen a nuestro repositorio local: docker pull jenkins/jenkins:2.107.1-alpine.
  4. Creamos un volumen local donde almacenar la configuración de Jenkins: docker volume create jenkins_home
  5. Lanzamos el contenedor para Jenkins, montando el volumen de datos creado en el punto anterior: docker run --name jenkins -p 8080:8000 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:2.107.1-alpine

El comando docker run paso a paso

El comando anterior lanza un contenedor llamado jenkins (especificado mediante --name jenkins) basado en la imagen jenkins/jenkins:2.107.1-alpine.

El contenedor monta el volumen jenkins_home en el contenedor (si no se ha creado en el punto 4, se crea el volumen al lanzar el contenedor). El volumen contiene toda la configuración de Jenkins, lo que permitirá actualizar la aplicación a otras versiones sin perder la configuración. La opción de guardar la configuración en un contenedor es preferible a la de montar un volumen local del host.

Si decides montar un volumen local del host en el contenedor, debes tener en cuenta que Jenkins corre dentro del contenedor con el usuario jenkins, con uid 1000; deberás dar permisos en la carpeta local a este usuario para no tener problemas de acceso desde el contenedor. Otra opción es ejecutar Jenkins con un usuario “local” del host mediante el parámetro -u nombre_de_usuario al ejecutar docker run.

Puertos

El acceso web a la aplicación se realiza a través del puerto 8080 , mientras que el puerto 50000 es necesario para conectar con otros servidores Jenkins esclavos a través de JNLP (Java Web Start). Si solo vas a utilizar esclavos vía SSH, no necesitas abrir el puerto 50000.

Otras configuraciones

Puedes realizar configuraciones adicionales a través de parámetros al ejecutar el contenedor, como ajustar el nivel de detalle en los logs, configurar el número de ejecutores, etc.

Preinstalación de plugins

Para preinstalar plugins en Jenkins, debes crear una imagen personalizada. En la imagen, puedes usar el script install-plugins.sh para descargar los plugins indicados. Puedes pasar una lista de plugins a instalar al script mediante:

...
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt

Cuando el contenedor de Jenkins arranca, comprueba si los plugins indicados existen en JENKINS_HOME y los copia si es necesario. No sobrescribirá los ficheros, por lo que si has actualizado los plugins desde la interfaz web, no los modificará.

Es posible sobrescribir los plugins si lo necesitas; para ello debes añadir .override al nombre del plugin que quieras sobrescribir.

Primer acceso a Jenkins

Abre un navegador y accede a http://IP-del-host-docker:8080. Después de unos segundos en los que Jenkins debe acabar de arrancar, se muestra el siguiente mensaje:

Jenkins genera una contraseña segura en /var/jenkins_home/secrets/initialAdminPassword. Puedes obtener esta contraseña inicial de diferentes maneras, pero la más sencilla es revisando los logs de arranque de Jenkins:

$ docker logs jenkins
...

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

cb6e558c91e946ab8f06cf085c9cf88b

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

Mar 17, 2018 5:42:29 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Mar 17, 2018 5:42:29 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Mar 17, 2018 5:42:31 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Mar 17, 2018 5:42:31 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 8,990 ms
Mar 17, 2018 5:42:31 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Mar 17, 2018 5:42:31 AM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
--> setting agent port for jnlp
--> setting agent port for jnlp... done

Personalmente considero más útil aprovechar que el password inicial se encuentra en el fichero /var/jenkins_home/secrets/initialAdminPassword y obtenerlo usando cat /var/jenkins_home/secrets/initialAdminPassword mediante docker exec.

$ docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
cb6e558c91e946ab8f06cf085c9cf88b

De esta forma puedes guardar el password en una variable de entorno y usarlo en un script, para acceder desde otra aplicación usando la API, etc.

$ JENKINS_InitialPassword=$(docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword)

$ echo $JENKINS_InitialPassword
cb6e558c91e946ab8f06cf085c9cf88b

Copia el password e introdúcelo para acceder a Jenkins.

Instalación de plugins

Jenkins ofrece la posibilidad de instalar los plugins sugeridos por la comunidad o realizar nosotros la selección de forma manual. Podemos instalar o desinstalar plugins después, por lo que pulsamos en la opción Install suggested plugins:

El sistema descarga los plugins:

Creación de un usuario administrador

Tras la instalación, se muestra el formulario para crear un usuario administrador:

Jenkins ofrece la posibilidad de seguir usando el usuario admin, sin crear usuarios adicionales.

Tras la creación del usuario, podemos empezar a usar Jenkins:

Si hemos creado un nuevo usuario administrador, accedemos a Jenkins con el usuario recién creado:

Resumen

Hemos descargado la imagen de Jenkins y hemos arrancado un contenedor a partir de ella. Hemos indicado cómo acceder usando el password generado durante el primer arranque, cómo configurar los plugins sugeridos y crear el primer usuario.

En los siguientes artículos crearemos los primeros jobs de prueba en Jenkins.