Jenkins sobre Docker

Jenkins es una conocida herramienta open-source de integración continua.Es muy útil en desarrollo de software para automatizar compilaciones, pruebas de unidad e integración, y despliegues.

Hoy vamos a aprender a configurar Jenkins en un contenedor de Docker para automatizar la compilación y un test de unidad sobre un proyecto alojado en GitHub.

Para este ejemplo emplearemos el proyecto JSex, un intérprete de expresiones sobre objetos JSON.

Instalar Docker y Jenkins

En este tutorial partimos con Docker instalado. Si no lo tenemos instalado, podemos hacerlo siguiendo las instrucciones de Docker Store.

Creamos y ejecutamos un nuevo contenedor para Jenkins:
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins -v jenkins_home:/var/jenkins_home jenkinsci/jenkins
Explicación:
  • docker run crea y ejecuta un nuevo container. Si la imagen (jenkinsci/jenkins) no se encuentra, la descarga de Docker Hub.
  • -d lanza el contenedor en modo daemon (demonio), es decir, lo hace funcionar en segundo plano.
  • -p 8080:8080 enlaza el puerto 8080 de nuestro host al puerto 8080 del contenedor. Esto permite acceder a la interfaz web a través de localhost.
  • -p 50000:50000 publica igualmente el puerto 50000 para la API de Jenkins.
  • --name jenkins asigna el nombre "jenkins" al contenedor.
  • -v jenkins_home:/var/jenkins_home crea un volumen de datos llamado "jenkins_home" para guardar los datos aunque paremos o eliminemos el contenedor.
  • jenkinsci/jenkins es el nombre de la imagen oficial de Jenkins.

Configuración de Jenkins

Accedemos a la interfaz web de Jenkins mediante la dirección "localhost:8080":

Jenkins recién instalado.

En primer lugar nos pide la contraseña de administrador. Para averiguarla, podemos ejecutar:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
La introducimos y realizamos la instalación por defecto, seleccionando "Install suggested plugins" en la siguiente pantalla. A continuación nos pide crear un nuevo usuario. Rellenamos los campos que aparecen y aceptamos.

Menú principal de Jenkins.

Preparar entorno de desarrollo

Este paso es necesario para que Jenkins pueda compilar el proyecto JSex en concreto. Necesitaremos el compilador GNU CC y la herramienta GNU Make.

El contenedor de Jenkins funciona sobre una imagen basada en Debian, de modo que instalaremos estas dependencias utilizando apt-get, dentro del contenedor:
docker exec -u root jenkins bash -c "apt-get update && apt-get -y install gcc make"

Diseñar pipeline para Jenkins

Un pipeline de Jenkins es el conjunto de etapas de pruebas que se va a ejecutar. Para este proyecto hemos diseñado un pipeline de dos etapas:
  • Build, para compilar el proyecto y verificar que no hay errores de compilación.
  • Test, para ejecutar un script de pruebas unitarias.
Este pipeline se guarda en un archivo con nombre Jenkinsfile, dentro del proyecto en GitHub:
pipeline {
    agent any
        stages {
            stage('Build') {
                steps {
                    sh 'make'
                }
            }
            stage('Test') {
                steps {
                    sh './test.sh'
                }
           }
      }
}

Añadir proyecto a Jenkins

Volvemos a Jenkins y seleccionamos "New Item", a la izquierda. Vamos a crear una tarea de tipo Pipeline:

Jenkins: nueva tarea.

A la hora de crear una tarea de tipo pipeline tenemos dos opciones:
  • Escribir un Jenkinsfile en la propia configuración.
  • Utilizar un Jenkinsfile de un repositorio de GitHub.
Ya que tenemos el Jenkinsfile en el proyecto de GitHub, utilizaremos la última opción, seleccionando la opción "Pipeline script from SCM". Entonces ponemos la dirección del proyecto en GitHub:

Definición de la tarea pipeline.

Ejecutar un test

Por último, para lanzar una prueba, pulsamos "Build Now" en el menú lateral y esperamos los resultados:

Resultado del test en Jenkins.

Como podemos ver, el test se compone de la etapa de descarga del proyecto más las dos que hemos definido en el Jenkinsfile.

Estos son los pasos básicos para comenzar a utilizar Jenkins. A partir de aquí podemos instalar Jenkins directamente en un servidor (sin Docker) o crear una imagen de Docker personalizada, que incluya los programas que necesitamos.

Comentarios

Entradas populares de este blog

Algoritmo de relleno

Problema de las N reinas

Cifrado de Vernam