Warning: This information may be outdated. Please note the date of the post.



Integración Continua (CI) como concepto.

La integración continua (CI) es la práctica de desarrollo software donde los miembros de un equipo integran su trabajo de forma periódica, verificando el código tras la compilacion y pruebas del mismo, con el objetivo de detectar errores así poder evitarlos. Además del control de versiones y generación de informes.

¿Qué es Jenkins?

Jenkins es un servidor de automatización usado más para la integración continua y es de código abierto. Está basado en el proyecto Hudson. Está escrito en Java.

Jenkins es capaz de realizar múltiples tareas necesarias para asegurar una calidad en el software:

  • Facilita el control de versiones
  • Hace pruebas y testea el código
  • Monitorización continua de las métricas de calidad de proyecto.
  • Puede enviar los cambios una vez testeados al repositorio principal
  • Automatiza la compilación y puede también automatizar el despliegue, una vez integrado los cambios testeados.
  • Notifica de cualquier cambio o error a los integrantes del equipo.
  • Permite generar y visualizar la documentación del proyecto.
  • Cuenta con muchísimos plugins para realizar diferentes tareas.

Instalación de Jenkins

La instalación de Jenkins depende del SO en el que nos encontremos por lo que puedes seguir la guía de la documentación oficial

En mi caso voy a lanzar un contenedor con Docker desde la imagen de jenkins en concreto “jenkins/jenkins:lts”.

Para instalar Docker puedes ayudarte de mi post Introducción a Docker, o consultar la documentación oficial de Docker.

Una vez tengamos Docker instalado vamos a lanzar el contenedor de forma que:

docker run - Arranca el contenedor -d - En segundo plano -v - Indicamos el volumen como punto de montaje -p - Exponemos los puertos, que utilizara el 50000 y el 8080 pero indicaremos el 9080 para jenkins porque el 8080 será para la aplicación que vamos a desplegar. -e - Variable de entorno JENKINS_OPTS para indicar el puerto que va usar jenkins --name - Nombre del contenedor jenkins/jenkins:lts - Imagen

La instrucción queda de la siguiente manera:

docker run -d -v $(pwd)/jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 -p 9080:9080 -e JENKINS_OPTS="--httpPort=9080" --name jenkins jenkins/jenkins:lts

Comprobamos que está funcionando y podemos acceder al navegador en el puerto indicado

celiagm@debian:~/github/onebit$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED        STATUS       PORTS                                                                                                                                 NAMES
f58dc8b0e18f   jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   32 hours ago   Up 7 hours   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:9080->9080/tcp, :::9080->9080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins

unlock-jenkins.png

Unlock Jenkins

Como podemos apreciar en el navegador nos indica que tenemos que introducir una clave que se ubica en la ruta /var/jenkins_home/secrets/initialAdminPassword.

En este caso como hemos montado un volumen, accedemos a ese volumen y visualizamos la clave. También podríamos entrar en el contenedor con exec -ti y obtenerla.

celiagm@debian:~/docker/jenkins_home/secrets$ cat initialAdminPassword 

Copiamos la clave y la introducimos en el navegador.

Configuración Jenkins

Una vez hecho eso nos saldrá la pantalla de personalización, para este ejemplo instalaremos los plugins sugeridos.

customize.png

Ahora empezará a instalar

start.png

Crearemos el usuario administrador

admin.png

Indicaremos la url, en este caso dejaremos localhost por defecto.

url.png

Ya tendríamos el sitio listo para usar

inicio.png

Seguridad

Iremos en el menú de la izquierda a » Manage Jenkins » En Security vamos a » Configure Global Security. Para configurar la seguridad de Jenkins.

En este caso está todo correcto, para este entorno de prueba pero aquí puedes modificarlo según tus necesidades

Security.png

En Credentials podemos añadir formas de autenticación para conectarnos remotamente ya bien sea por usuario y contraseña o por clave ssh.

ssh.png

Jenkins CLI

Con Jenkins CLI nos referimos al cliente de Jenkins desde la línea de comandos. Es más rápido de gestionar y más eficiente en cuanto a memoria utilizada.

Para descargar Jenkins CLI accedemos a la url: http://docker.jenkins:9080/jnlpJars/jenkins-cli.jar

Si entramos en la url: http://localhost:9080/cli/

Nos aparecerá la forma de ejecutar el jenkins cli y los muchos comandos para su gestión.

Necesitaremos tener instalado java, en mi caso es:

sudo apt-get install default-jdk 

Ejecutamos el siguiente comando, indicando la ruta donde tenemos el cli, y le indicamos la autentificación que en mi caso sera usuario y contraseña.

java -jar jenkins-cli.jar -s http://localhost:9080/ -auth admin:admin -webSocket help

Una vez nos hayamos logueado podemos ir probando comandos por ejemplo:

celiagm@debian:~/docker/jenkins_home$ java -jar /home/celiagm/jk/jenkins-cli.jar -s http://localhost:9080/ -auth admin:admin who-am-i
Authenticated as: admin
Authorities:
  authenticated

Alias para facilitar el trabajo con Jenkins CLI

El comando a utilizar es muy tedioso de escribir y podemos crear un alias para ahorrarnos tiempo.

alias jenkinscli="java -jar /home/celiagm/jk/jenkins-cli.jar -s http://localhost:9080/ -auth admin:admin"

Si queremos saber la versión

celiagm@debian:~/docker/jenkins_home$ jenkinscli version
2.303.1

Comandos útiles

# Visualizar la id de la sesión
celiagm@debian:~/docker/jenkins_home$ jenkinscli session-id
50964909
# Listar las tareas (hemos creado una de prueba)
celiagm@debian:~/docker/jenkins_home$ jenkinscli list-jobs
prueba
# Reiniciar jenkins (esto no mata el contenedor)
celiagm@debian:~/docker/jenkins_home$ jenkinscli restart

celiagm@debian:~/docker/jenkins_home$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED        STATUS       PORTS                                                                                                                                 NAMES
f58dc8b0e18f   jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   34 hours ago   Up 8 hours   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:9080->9080/tcp, :::9080->9080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   jenkins

# Lanzamos la tarea de prueba 
celiagm@debian:~/docker/jenkins_home$ jenkinscli build prueba
celiagm@debian:~/docker/jenkins_home$ jenkinscli build prueba

Comprobamos en el navegador

build.png

Borramos la tarea

celiagm@debian:~/docker/jenkins_home$ jenkinscli delete-job prueba
celiagm@debian:~/docker/jenkins_home$ jenkinscli list-jobs
celiagm@debian:~/docker/jenkins_home$ 

[Este post está en proceso … ;)]

Fuentes: