Joaquín Cañadas <jjcanada@ual.es> Manel Mena <manel.mena@ual.es>

Tutorial de instalación de Jenkins 2 en Ubuntu 18.04 LTS.
Objetivos
  • Actualizar el sistema Ubuntu 18.04 en caso de que sea necesario

  • Instalar Jenkins 2 (última versión)

  • Configurar un proxy inverso

  • Primeros pasos en Jenkins: configuración básica y plugins

Prerequisitos

1. Creación de una máquina virtual para Jenkins

Debes disponer de una máquina virtual en la nube para la instalación de Jenkins. Sigue los pasos que conoces para crear una máquina virtual.

2. Actualizacion del sistema

2.1. Mensaje de reinicio

Si aparece el mensaje *** System restart required *** ejecutar

sudo reboot -h now
Reiniciar el sistema

Tras ello, actualizar los paquetes

sudo apt-get update -y
sudo apt-get upgrade -y

3. Instalar Java

Puede instalar el JDK con el siguiente comando, es importante instalar al menos la versión 1.8 del JDK, si no Jenkins no funcionará. Aunque ya recomienda usar Java 11

sudo apt install openjdk-11-jdk -y

Primero comprobaremos si la versión activa de Java es la 11.

java -version
java -version

En caso contrario podemos comprobar si hay varias instalaciones de Java en el servidor y elegir la pertinente:

sudo update-alternatives --config java
java -alternartives

3.1. Definiendo la Variable de Entorno JAVA_HOME

sudo nano /etc/environment

Al final de este archivo, agregue la siguiente línea, asegurándose de sustituir la ruta resaltada con la ruta de jdk en su sistema.

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

Guarde, salga del archivo y vuelva a cargarlo.

source /etc/environment

Ahora puede probar si la variable de entorno se ha establecido mediante la ejecución del siguiente comando:

echo $JAVA_HOME

Esto devolverá la ruta que acaba de establecer.

/usr/lib/jvm/java-11-openjdk-amd64

Instalación de Jenkins 2

4. Instalación de Jenkins mediante paquetes

Instalaremos Jenkins en un sistema operativo basado en Ubuntu 18.04 LTS o 20.04 LTS. La instalación consiste en añadir los repositorios de Jenkins, actualizar nuestro sistema de repositorios y una vez acabado, instalar Jenkins.

Como prerequsito es necesario tener instalado Java. Compruebe que está configurado JAVA_HOME

Instalaremos Jenkins de la rama estable (versión Long-Term Support, LTS). Hay que tener en cuenta que esta versión de Jenkins se actualiza cada 12 semanas. Si queréis más información sobre la versión LTS de Jenkins, os dejo el enlace aqui.

Lo primero que haremos es añadir los repositorios de Jenkins e instalarlo mediante apt-get:

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -

sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
    /etc/apt/sources.list.d/jenkins.list'

sudo apt-get update -y

sudo apt-get install jenkins -y

A continuación, levantamos el servicio:

sudo systemctl start jenkins

Debido a que systemctl no muestra un resultado de estado, utilizaremos el comando status para verificar que Jenkins se haya iniciado de forma correcta:

sudo systemctl status  jenkins

Si todo salió bien, la primera parte del resultado de estado mostrará que el servicio está activo.

Y comprobamos también que Jenkins está funcionando en el puerto 8080

netstat -plntu
Listado puertos activos

Una vez realizada la instalación por defecto Jenkins estará escuchando en el puerto 8080. Podemos comprobarlo:

curl localhost:8080
Respuesta de Jenkins en el 8080

Necesitamos instalar un apache o nginx en modo Reverse Proxy para poder acceder a la administración de Jenkins mediante el puerto 80 (HTTP).

5. Instalación de Apache2 como Proxy Inverso

Instalamos Apache2 y lo configuramos para que actue como proxy inverso del puerto 8080.

sudo apt-get install apache2
sudo a2enmod proxy
sudo a2enmod proxy_http

La salida esperada debe ser:

Enabling module proxy.
To activate the new configuration, you need to run:
  sudo service apache2 restart

Reiniciamos Apache2:

sudo service apache2 restart

Comprobamos que Apache2 está funcionando en el puerto 80:

Apache2 homepage

A continuación, creamos un nuevo archivo de host virtual en la carpeta 'sites-available'

sudo nano /etc/apache2/sites-available/jenkins.conf

Copiamos el siguiente texto como contenido del archivo, sustituyendo el texto JENKINS.MACHINE.IP por la DNS generada en AZURE de la máquina (ver ejemplo en la captura de pantalla abajo):

<Virtualhost *:80>
    ServerName        JENKINS.MACHINE.IP (1)
    ProxyRequests     Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode

    <Proxy http://localhost:8080/*>
      Order deny,allow
      Allow from all
    </Proxy>

    ProxyPass         /  http://localhost:8080/ nocanon
    ProxyPassReverse  /  http://localhost:8080/
    ProxyPassReverse  /  http://JENKINS.MACHINE.IP/ (2)
</Virtualhost>
1 Rercuerda sustituir JENKINS.MACHINE.IP por el DNS de la máquina virtual en Azure donde has instalado Jenkins.
2 Rercuerda sustituir JENKINS.MACHINE.IP por el DNS de la máquina virtual
Archivo jenkins.conf

Guardamos el archivo. Y activamos el host virtual de Jenkins con el comando a2ensite

sudo a2ensite jenkins

Reiniciamos Apache2 y Jenkins

sudo systemctl restart apache2
sudo systemctl restart jenkins

Y por último, comprobamos que los puertos 80 y 8080 están usados por Apache2 y Jenkins, respectivameten

netstat -plntu
Listado de puertos activos 80 y 8080

Configuración de Jenkins 2

6. Primera configuración de Jenkins

Antes de realizar la primera configuración necesitaremos saber el password temporal de admin que Jenkins ha generado para poder empezar a configurarlo:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Copiamos el password y lo pegamos en la siguiente pantalla, y hacemo click en Continuar

Unlock Jenkins

Seguidamente instalaremos los plugins más comunes. No os preocupéis que posteriormente instalaremos varios plugins más, de hecho una de las grandes ventajas que tiene Jenkins es la gran cantidad de plugins que hay.

Install suggested plugins

Tras hacer clic en Install suggested plugins, el proceso de instalación de plugins tradará unos minutos:

Jenkins plugins installations in progress

Seguidamente nos solicitará un usuario y una contraseña de admin, el cual usaremos posteriormente poder acceder a la administración de Jenkins:

Create first Admin user

Pulsamos el botón Save and Finish

Jenkins is ready

Ya podemos acceder a Jenkins introduciendo el usuario y contraseña que acabamos de crear.

Bienvenido a Jenkins

7. Securizando Jenkins

Las versiones anteriores de Jenkins (v1.x) se instalaban sin ningún tipo de control de acceso para los usuarios. Esto implicaba que cualquier usuario podía usar la aplicación, lo que era totalmente desaconsejable. Por ello, lo primero era activar la seguridad. La versión actual (v2.x) crea un usuario Admin con el que hemos hecho el primer acceso, pero, en cualquier caso, sigue siendo necesario configurar la seguridad para poder gestionar el acceso a nuevos usuarios. Para ello, hacemos clic en Administrar Jenkins / Configuración global de seguridad.

Jenkins permite diversos modos de acceso. Vamos a configurar el más básico que es el de Usar base de datos de Jenkins, y marcamos Permitir que los usuarios se registren. A continuación, en la sección Autorización, marcamos Configuración de seguridad. En el campo de texto debemos escribir el nombre del usuario admin con el que hemos accedido, y a continuación hacer clic en el botón Añadir. Tras ello, debemos marcarlo como Administer. Y por último Guardar

Autorización. Configuración de seguirdad
Qué hacer si nos hemos bloqueado y no podemos acceder

En caso de emergencia, si olvidamos la contraseña o no podemos acceder a Jenkins, debemos seguir las instrucciones definidas aquí: Help! I locked myself out!.

Más info en Securing Jenkins

Podemos registar nuevos usuarios mediante el formulario de registro de la página inicial (no estando logueados). Cada miembro del equipo debe registrarse como usuario. Mediante el usuario adminsitrador damos permisos a los nuevos usuarios registrados.

Control de acceso con LDAP

El método de acceso más recomendable sería tener un sistema LDAP para el equipo, y que la validación de todas las herramientas (GitLab, Jenkins, etc) se realizase contra el LDAP (esto se podría implementar con, por ejemplo, OpenLDAP).

Más info:

8. Probando un primer proyecto

Desde la página inicial de Jenkins, clic en Nueva Tarea (Create new Job)

Nueva Tarea
  • Nombre: prueba de sistema

  • Seleccionar: Crear un proyecto estilo libre

  • Ok

Selección tipo de Tarea

Entramos en la configuración del nuevo proyecto. Seleccionamos la pestaña Ejecutar

  • Seleccionamos el botón Añadir un nuevo paso

  • Seleccionamos Ejecutar línea de comandos (shell)

  • En comando escribimos

    top -b -n 1 | head -n 5
  • Pulsamos Guardar

Configuracion proyecto basico

Tras ello hacemos clic en Construir ahora (Build now)

Construir ahora

Tras la ejecución del proyecto, se puede ver el Historial de tareas, hacemos clic en la bolita azul de la primera ejecución y nos mostrará la Salida de Consola. Ahí podemos ver el resultado de la ejecución de este proyecto de prueba en Jenkins.

Bolita azul para ver la Salida consola
Salida consola del primer ejemplo

9. Configuración de herramientas

Jenkins hace uso de diversas herramientas a las que invoca a la hora de realizar tareas en la construcción de los proyectos. Estas herramientas deben ser instaladas y configuradas. Para ello vamos a Admininstrar Jenkins / Global Tools configuration

Global Tools Configuration

9.1. JDK

  • Añadir JDK

  • Nombre: OpenJDK-11

  • JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64/

    Instalación de JDK

9.2. Git

  • Añadir Git

  • Nombre: Default

  • Path: git

Suponemos que git ya está instalado previamente en la máquina. En caso contrario instalarlo desde el terminal

sudo apt-get install git

9.3. Ant

  • Instalaciones de Ant…​ / Añadir Ant

  • Nombre: ant 1.10.12

  • Marcar Instalar automáticamente

  • Version: 1.10.12

Instalación de Ant

9.4. Maven

  • Instalaciones de Maven…​ / Añadir Maven

  • Nombre: maven default

  • Marcar Instalar automáticamente

  • Version: la última versión disponible

Instalación de Maven

Seleccionamos la ultima versión de Maven disponible en el desplegable. (La 3.5.0 da muchos problemas!)

En caso de que no esté disponible la configuración de instalaciones de Maven, este paso deberá hacerse una vez realizada la instalación del plugin de Maven.

10. Instalación de plugins

La gestión de los plugins se realiza desde Administrar Jenkins / Administrar plugins.

En la pestaña Actualizaciones disponibles (Update) debemos marcar todos los que se muestren y manternelos actualizados.

La pestaña Todos los plugins (Available) muestra la lista de todos los plugins que no tenemos instalados. De ella tenemos que seleccionar los siguientes:

  • Maven integration plugin

    Maven plugin
  • Cobertura plugin

    Cobertura plugin
  • JaCoCo (Java Code Coverage)

    JaCoCo plugin
  • GitLab

    GitLab plugin
  • SonarQube

    Sonar plugin

Tras ello, hacemos clic en Descargar ahora e instalar despues de reiniciar. Y marcamos Reiniciar Jenkins después de la instalación

Descargar plugins

11. Configuración Adicional (opcional)

Opcionalmente, puede ser necesario realizar alguna configuración adicional. Por ejemplo si queremos construir aplicaciones PHP con Phing debemos instalar el plugin de Phing en Jenkins, así como instalar Phing en la máquina.

Recuerda que hay infinidad de plugins en Jenkins, y si quieres usar alguno de ellos solo tienes que instalarlo. Existe numerosa documentación de Jenkins en la web.

En caso de duda -→ Stackoverflow ;-)

11.1. Configuración de GitLab

Si queréis usar vuestro propio GitLab con Jenkins, tendreis que hacer una configuración de GitLab indicando la URL y el API Token. El API Token es un valor ligado al usuario de GitLab disponible en User Settings / Account:

GitLab token

A continuación, en Jenkins, introducimos la configuración del servidor Gitlab: Administrar Jenkins / Configurar sistema. Al final de la página encontrarás la sección de GitLab.

Giltal Configuration
  • Nombre de la conexión: mi gitlab

  • Gitlab Host URL: http://mi_IP_gitlab

  • Credenciales: Añadir

    • Tipo: GitLab API token

    • API token: mi token

    • ID: mi-gitlab

    • Descripción: token de mi gitlab

      Credencial GitLab API token

      Tras ello seleccionamos la credencial:

Credencial GitLab API token

En un proximo tutorial veremos como usar un repositorio GitLab en un proyecto Jenkins.

11.2. Configuración de SonarQube

SonarQube es una plataforma de calidad de código fuente. SonarQube proporciona diversas herramientas de análisis estático de código fuente como Checkstyle, PMD o FindBugs para obtener métricas que pueden ayudar a mejorar la calidad del código de un programa.

Primero hemos de instalar el plugin de Sonar y luego configurarlo. * Instalación del plugin SonarQube Scanner for Jenkins

SonarQube plugin

A continuación, Administrar Jenkins / Global Tool Configuration. Descender en la página a la sección de configuración SonarQube Scanner, y:

  • Hacer clic Añadir SonarQube Scanner

  • Seleccionar Instalar Automáticamente

  • Nombre: SonarQube scanner 3.x.x

  • Version: la última disponible

Configuracion de SonarQube scanner tool

Se debe crear un token de autenticación desde el servidor SonarQube, creado como una credencial 'Secret Text'. Si aun no dispone de un servidor SonarQube, déjelo en blanco.

Por último guardar la configuración.

12. Actualización

12.1. Actualización de Jenkins

Si al iniciar Jenkins como administradores nos aparece un mensaje indicando que una nueva versión de Jenkins está disponible, es aconsejable actualizar siempre.

Disponible nueva version de Jenkins

Para ello:

  • Administrar Jenkins / Prepare for Shutdown

Prepare for shutdown…​
  • Desde la consola ssh:

    sudo apt-get update -y
    sudo apt-get upgrade -y

12.2. Actualización de plugins

El enlace para gestionar los plugins nos muestra si hay actualizaciones disponibles. Es recomendable actualizar siempre:

Actualizaciones de plugins disponibles

Entramos y marcamos todos con All , y hacemos clic en Descargar ahora e instalar después de reiniciar

Actualizar todos los plugins

Tras ello, marcamos Reiniciar Jenkins…​

Reiniciar Jenkins…​

Bibliografía

Referencias