Jenkins – Instalar y configurar Jenkins sobre Ubuntu 22

Jenkins es quizás la principal herramienta para automatizar el CI/CD, es decir la compilación, integración y despliegue de aplicaciones de manera continua, aunque en general es una excelente herramienta de automatización (para otras muchas labores también). En este Post explico cómo instalar y configura Jenkins sobre Ubuntu 22, así como varias recomendaciones y Plugins habituales.

Instalación de Jenkins en Ubuntu 22

Partimos de una máquina virtual con Ubuntu Server 22 LTS instalado, 1 Core y 2 GB de RAM, suficiente para un entorno de laboratorio y pruebas, donde queremos instalar la última versión de Jenkins.

La instalación de Jenkins creará un usuario jenkins, cuyo directorio home será /var/lib/jenkins. En granjas grandes de Jenkins, nos encontraremos con problemas de inodes como consecuencia de la gran cantidad de ficheros que Jenkins almcena en /var/libe/jenkins, por lo que es recomendable utilizar un segundo disco, de gran tamaño, sobre el que montar el filesystem de /var/lib/jenkins, y crear el filesystem para soportar un alto número de inodes. Esto nos ayudará a evitar problemas de alcanzar el número máximo de inodes.

Otro detalle que nos puede ser de ayuda es crear nosotros el usuario jenkins y el grupo jenkins antes de instalar Jenkins, especificando sus IDs para que sean únicos, y que podamos utilizarlos tanto en el maestro como en los esclavos, y en las imágenes Docker que usemos para ejecutar nuestros trabajos de Jenkins. De este modo, podremos garantizar que coinciden estos IDs, ya que en caso contrario, nos podemos encontrar que más adelante al crear una nueva máquina virtual, ese ID ya esté utilizado por otro usuario, y nos encontremos el problema. A continuación se muestra el usuario y grupo jenkins de una instalación.

En los siguientes enlaces podemos encontrar el ChangeLog de Jenkins, con el historial de versiones:

Jenkins requiere Java. Instalaremos la máquina virtual de Java, en particular Jenkins requiere Java 11, que es la versión que incluye Ubuntu 22 (en particular OpenJDK 11), por lo que instalaremos JRE y JDK de OpenJDK.

sudo apt update
sudo apt install default-jre -y
java -version
sudo apt install default-jdk -y
javac -version

Seguidamente instalaremos la última versión de Jenkins desde los repositorios oficiales de Jenkins.

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key |sudo gpg --dearmor -o /usr/share/keyrings/jenkins.gpg
sudo sh -c 'echo deb [signed-by=/usr/share/keyrings/jenkins.gpg] http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins

Arrancamos el servicio de Jenkins, y recuperamos la contraseña inicial.

sudo systemctl start jenkins.service
sudo systemctl status jenkins

Realizado esto, accederemos a Jenkins con un navegador utilizando la contraseña inicial que acabamos de recuperar. Para ello, hay que tener en cuenta que Jenkins por defecto escucha en el puerto tcp-8080.

En la siguiente pantalla, seleccionaremos instalar los Plugins sugeridos.

Tardará un rato mientras instala todos los Plugins.

Podemos crear un primer usuarios administrador, o continuar con el usuario admin. En nuestro caso, seguiremos con el usuario admin.

Confirmaremos la URL que utilizaremos para acceder a Jenkins. De momento mantenemos la propuesta por el wizard.

Con esto ya habremos finalizado la instalación de Jenkins.

Sin embargo, antes de dar por finalizada la instalación de Jenkins, deberíamos al menos cambiar la contraseña del usuario admin. Para ello, desde Manage Jenkins -> Manage Users, editaremos el usuario admin y cambiaremos su contraseña.

Configuración de Jenkins

Una vez hemos instalado Jenkins, tendremos que empezar a configurar cositas. Hay muchos detalles a configurar, a continuación incluyo algunos que me parecen interesantes, pero hay más.

Instalar y configurar NGINX como Proxy inverso

Vamos a configurar un NGINX como Proxy inverso, escuchando en el puerto tcp-80 (también se podría configurar con HTTPS sobre el tcp-443). Para ello, lo primero es instalar el NGINX.

sudo apt update && sudo apt install nginx -y

Creamos el fichero de configuración de NGINX para Jenkins.

sudo vi /etc/nginx/sites-available/jenkins

Este sería su contenido.

server {
   listen        80 default_server;

   client_max_body_size 1G;

   location / { 
      proxy_pass http://127.0.0.1:8080;

      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
   }
}

Creamos un enlace simbólico para habilitar la nueva configuración que acabamos de crear, y se borra el default.

sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/jenkins
sudo rm /etc/nginx/sites-enabled/default

Habilitamos el servicio de NGINX y lo reiniciamos.

sudo systemctl enable nginx
sudo systemctl restart nginx
sudo systemctl status nginx

Si lo deseamos, podemos comprobar la configuración de NGINX con el siguiente comando.

sudo nginx -t

Realizado esto ya podremos acceder a Jenkins utilizando el puerto tcp-80 por HTTP (o bien por HTTPS y el puerto tcp-443 si decidimos configurarlo así, que sería otra opción).

Una vez configurado el NGINX, deberemos acceder a Jenkins, y en Manage Jenkins -> Configure System, especificar la nueva Jenkins URL (no es suficiente con configurar el NGINX, es necesario también cambiar esta propiedad), y click Save para guardar los cambios..

Instalar el Plugin de Role-Based Authentication Strategy

Por defecto en Jenkins, todos los usuarios son Admin. Sin embargo, en muchas ocasiones necesitaremos poder realizar una gestión más granular de los permisos, por ejemplo, pudiendo decidir qué usuarios puede acceder a qué Pipelines y con qué permisos (ver, ejecutar, etc). Una solución bastante habitual es utilizar el Plugin Role-based Authorization Strategy.

Para instalar este Plugin, en Manage Jenkins -> Manage Plugins -> Available plugins, buscaremos por este Plugin, lo seleccionaremos, y lo instalaremos (Download now and install after restart).

Una vez instalado el Plugin de Role-Based Authorization Strategy, tenemos que activarlo como método de autorización. Para ello, en Manage Jenkins -> Configure Global Security, lo selccionaremos en el desplegable Authorization (opción Role-Based Strategy), y guardaremos los cambios (click Save).

Esto nos habilitará la página de Manage Jenkins -> Manage and Assign Roles, donde tendremos disponible tres opciones, con las que podremos configurar este Plugin.

  • Manage Roles. Podemos definir Role Globales, pero sobre todo, crear Roles y asociar estos Roles con las Pipelines mediante un patrón, así como especificar qué permisos tienen esos Roles sobre las Pipelines a las que aplica.
  • Assign Roles. Básicamente permite especificar qué usuarios son Admin (u otros Roles Globales), y asignar usuarios a Roles. En una instalación grande de Jenkins, con un gran volumen de usuarios y roles (mediante una matriz), se hace duro y tarda en cargar la página (importante analizar bien la forma de organizar Roles de forma sencilla y eficienet).
  • Role Strategy Macros. Esta opción la realidad es que no la he usado.

En cualquier caso, la creación de usuarios será como siempre, desde Manage Jenkins -> Manage Users.

Configurar la Shell de Bash

Configuraremos la Shell de Bash, desde Manage Jenkins -> Configure System, para asegurarnos que es utilizada por defecto en nuestras Pipelines. Click Save para guardar los cambios.

Configurar Labels y Executors en el Nodo principal (master)

Por defecto no tendremos etiquetas definidas en el único Nodo de Jenkins que tendremos tras la instalación inicial (el Nodo master o principal), que además tendrá configurados sólo dos executors, lo que permitirá sólo la ejecución de dos trabajos concurrentes.

Las etiquetas nos permitirán, cuando tengamos varios Nodos (el principal/master más uno o varios esclavos/slaves que pueden ser Linux, MAC, Windows, y con diferentes características o dedicados a tareas concretas), etiquetarlos para que cada trabajo de Jenkins se ejecute en el nodo que le corresponde. Ahora sólo tenemos uno, pero esto es especialmente importante cuando nuestra granja Jenkins crece. De hecho, deberíamos tener al menos un Nodo esclavo/slave, y que los trabajos de Jenkins no se ejecuten nunca en el Nodo principal/master. Para un entorno de laboratorio y pruebas, nos vale sólo con el maestro/principal.

De momento, asociaremos una etiqueta linux a nuestro Nodo principal/master y diez executors para aumentar la concurrencia (esto es relativo, y también dependerá de qué recursos de memoria/CPU tenga y de lo intensas que sean las tareas que ejecutan los trabajos de Jenkins). Lo configuraremos en Manage Jenkins -> Manage Nodes and Clouds -> Built-In Node -> Configure, donde también podemos ver alguna otra configuración que podría ser de interés realizar.

Instalar el Plugin Blue Ocean

El Plugin Blue Ocean es también uno de los más habituales. Ofrece una interfaz de usuario adicional (y complementaria) a la por defecto de Jenkins (la denominada Classic). Muchos usuarios, prefieren utilizar la interfaz de Blue Ocean para algunas tareas, y la nativa de Jenkins (Classic) para otras. Aunque es cuestión de gustos, suele ser habitual dejar disponible ambas, mediante la instalación de Blue Ocean, y que cada uno use la que quiera para lo que desee. Para ello, en Manage Jenkins -> Manage Plugins -> Available Plugins, buscaremos por el Plugin de Blue Ocean, seleccionaremos BlueOcean Aggregator (esto realmente nos instalará varios Plugins, sobre unos 30 Plugins), y lo instalaremos.

Instalar el Plugin de Rebuilder

Resulta muy cómodo poder repetir la ejecución de trabajo o Pipeline de Jenkins desde el historial de ejecuciones del mismo, indiferentemente de sus parámetros, o de si fué iniciado a través de un Web Hook, simplemente volver a ejecutarlo y ya, con un simple Click. Esto es algo que por defecto no se puede hacer, pero que podemos conseguir mediante la instalación del Plugin de Rebuild. Para instalarlo, como ya hemos visto, desde Manage Jenkins -> Manage Plugins -> Available Plugins, buscaremos por el Plugin, y lo instalaremos.

Instalar el Plugin SSH Agent

El Plugin SSH Agent permite utilizar una Clave Privada almacenada en una Credencial de Jenkins, para ejecutar comandos SSH de manera sencilla. Para instalarlo, desde Manage Jenkins -> Manage Plugins -> Available Plugins, buscaremos por el Plugin, y lo instalaremos.

Instalar el Plugin Pipeline Utility Steps

El Plugin Pipeline Utility Steps ofrece varias funciones de utilidad que podremos utilizar en nuestros Pipelines, como findFiles, touch, sha256, tar, zip, readYaml, readJSON, readCSV, etc. Para instalarlo, desde Manage Jenkins -> Manage Plugins -> Available Plugins, buscaremos por el Plugin, y lo instalaremos.

Establecer contraseña y clave privada del usuario Jenkins

Quizás nos interese establecer una contraseña para el usuario Jenkins de Linux, de tal modo que nos podamos conectar por SSH. Puede ser cómodo (especialmente en entornos de laboratorio y pruebas), aunque no es una práctica segura para entornos de Producción.

Otra tarea interesante es establecer una clave privada para el usuario Jenkins de Linux, de tal modo que podamos configurar el acceso SSH a otras máquinas, a repos de Git, etc. A continuación se muestra como hacer ambas cosas, tanto cambiar la contraseña del usuario Jenkins como crear una clave privada, desde una sesión de bash (por ejemplo conectados por SSH al servidor de Jenkins).

sudo passwd jenkins

sudo su - jenkins
ssh-keygen -t rsa -P ""
exit

Realizado esto, crearemos una Credencial en Jenkins (Manage Jenkins -> Manage Credentials -> Global) de tipo SSH Username with private key, para identificar al usuario Jenkins, utilizando la clave privada que acabamos de crear. Esta Credencial la utilizaremos al crear una nueva Pipeline de Jenkins, para que Jenkins pueda acceder a Git para obtener el Jenkinsfile (el código de nuestro trabajo de Jenkins).

Acceso a repos de Git

Crearemos un usuario para jenkins (y lo configuraremos con la clave pública SSH que acabamos de crear) en los repos de Git a los que necesitemos que Jenkins tenga acceso, y le concederemos los permisos necesarios (habitualmente con tener permiso de lectura, es suficiente).

En mi caso estoy utilizando Gitea como gestor de repos Git. He creado una Organización dentro de Gitea, donde subo mis repos, y sobre dicha Organización he creado un Team que concede permiso de Read sobre todos los repos de la Organización, y he añadido al usuario de Jenkins. Así, cada vez que añada un nuevo repo no necesito dar permisos a Jenkins, ya que los hereda de la Organización (más sencillo y fácil de administrar).

Otras tareas adicionales

Hay muchas más cosas que podemos instalar y configurar en Jenkins, como por ejemplo:

  • Instalar Docker en el servidor Jenkins (Install Docker Engine on Ubuntu) y configurar el usuario jenkins para ejecutar el comando Docker sin sudo (Docker Engine post-installation steps).
  • Instalar utilidades del sistema operativo que podamos necesitar (ej: el comando jq).
  • Instalar y configurar el Plugin de tu servidor Git (ej: GitLab, Gitea, etc.)
  • Instalar el comando kubectl, si trabajas con Kubernetes.
  • Configurar el envío de mail con SMTP.
  • Instalar la CLI de tu proveedor de Cloud (ej: Azure, AWS, GCP, Digital Ocean, etc).

Y por supuesto, está la opción de añadir esclavos, tanto esclavos Linux, como Windows o MacOS.

Probando Jenkins: Hello World

Llegados a este punto, ya sólo queda hacer una primera prueba de Jenkins. Para ello, crearemos una nueva Pipeline, con un código de ejemplo como el siguiente, que simplemente añade salida de pantalla con un par de mensajes.

Seguidamente ejecutaremos la Pipeline, y accederemos para ver su historial de ejecución, así como los Logs de cada una de sus fases (stages), comprobando que se ha ejecutado correctamente.

Despedida y Cierre

Hasta aquí llega este Post de Jenkins, herramienta fundamental para automatizar el CI/CD de muchas compañías (y como herramienta de automatización de propósito general), en el que hemos visto como instalar y configurar Jenkins, incluyendo algunos de los más comunes Plugins, y diferentes recomendaciones, a través de la creación paso a paso de una máquina Jenkins para un entorno de laboratorio y pruebas.

Poco más por hoy. Como siempre, confío que la lectura resulte de interés.