Jenkins utilizando Docker y proxy inverso con Nginx

Aprendemos a instalar un entorno de integración continua con Jenkins, utilizando en esta ocasión el contenedor oficial para Docker. Además, para conseguir una dirección web amigable y no acceder a él a través de un puerto, configuraremos un proxy inverso con Nginx.

Instalación de Docker en Ubuntu 18.04

En esta ocasión voy a utilizar mi VPS que tengo creado en Clouding.io Una vez he accedido a él vía SSH, el primero paso es actualizar el sistema e instalar Docker, tal y como indico a continuación:

  1. #Actualizamos el sistema
  2. sudo apt update

Desinstalamos las versiones antiguas de Docker que podamos tener instaladas en el host:

  1. sudo apt remove docker docker-engine docker.io

Añdimos los programas y librerías para su funcionamiento:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

Importarmos la clave GPG que utiliza el repositorio de Docker:

  1. sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add

Añadimos el repositorio:

  1. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  \
  2. $(lsb_release -cs)  stable"

Volvemos a actualizar e instalamos:

  1. sudo apt update
  2. sudo apt install docker-ce

Las operaciones de estado, parada y encendido para Docker en el host son:

  1. # Estado
  2. sudo systemctl status docker
  3. # Encendido
  4. sudo systemctl start docker
  5. # Parada
  6. sudo systemctl stop docker

Ahora ya podemos descargar y poner en marcha el contenedor con Jenkins

Instalar Jenkins vía Docker

Jenkins es el producto más popular y utilizado en los entornos de integración conntinua.

En esta entrada vamos a utilizar la imagen oficial. Además le indicaremos un puerto, en este caso el 8080, que es el que viene por defecto y un volumen para que se almacenen los datos de forma no volatil.

  1. sudo docker volume create jenkins_home
  2. sudo docker run -d -v jenkins_home:/var/jenkins_home \
  3. -p 8080:8080 -p 50000:50000 \
  4. jenkins/jenkins:lts

Una vez creado ya la podemos ver en funcionamiento:

  1. CONTAINER ID     IMAGE              COMMAND               CREATED          STATUS           PORTS                                              NAMES
  2. d345b65306ef     jenkins/jenkins:lts"/sbin/tini -- /usr/…" 22 hours ago     Up 22 hours      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   priceless_khorana

Podemos comprobar el estado del puerto:

  1. davidochobits@servubuntu:~# sudo lsof -i :8080
  2. COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
  3. docker-pr 10484 root    4u  IPv6 10153178      0t0  TCP *:http-alt (LISTEN)

Por último., que no menos importante, es utilizar un proxy inverso con Nginx, para que no tener que utilizar el puerto en el navegador.

Proxy inverso con Nginx

La instalación de Nginx es bien sencilla, de hecho todos los pasos os los explique en otra entrada: Instalar y configurar un proxy inverso con Nginx en Ubuntu 18.04

En nuestro caso el fichero de configuración contiene la siguiente información:

  1. server {
  2.     listen 80;
  3.     listen [::]:80;    
  4.     server_name jenkins.bitsandlinux.com;   
  5.     location / {
  6.         proxy_pass http://localhost:8080;
  7.         proxy_http_version 1.1;
  8.         proxy_set_header Upgrade $http_upgrade;
  9.         proxy_set_header Connection 'upgrade';
  10.         proxy_set_header Host $host;
  11.         proxy_cache_bypass $http_upgrade;
  12.     }
  13. }

Una vez creado recordar crear el correspondiente enlace simbólico:

  1. sudo ln -s /etc/nginx/sites-available/jenkins.bitsandlinux.com \
  2. /etc/nginx/sites-enabled/

Y reiniciamos el servidor web:

  1. sudo systemctl restart nginx

Evidentemente, previamente, debemos tener creado el subdominio en nuestro proveedor y asignarle la IP del VPS.

Habilitar HTTPS con Lets Encrypt y Certbot

Por último, que no menos importante, habilitamos la conexión HTTPS con Let’s Encrypt utilizando la herramienta Certbot

  1. sudo apt-get install python-certbot-nginx

Una vez hecho esto, solo hemos de utilizar la herramienta:

  1. sudo certbot --nginx

Nos hará una serie de preguntas y al final listará los proyectos web que ha detectado y debemos seleccionar cuál de ellos será al que se le añadirán los certificados. Todo bastante fácil la verdad.

Los paquetes de Certbot vienen con un trabajo cron o un temporizador systemd que renovará los certificados automáticamente antes de que caduquen. No necesitararemos ejecutar Certbot nuevamente, a menos que cambiemos su configuración. Puede probar la renovación automática de los certificados ejecutando este comando:

  1. sudo certbot renew --dry-run

La herramienta añadira la tarea programada en algún de los siguientes lugares:

  1. /etc/crontab/
  2. /etc/cron.*/*
  3. systemctl list-timers

Podemos comprobar el certificado desde la siguiente URL: https://www.ssllabs.com/ssltest/

Instalación web de Jenkins

Al acceder por primera vez a la URL, se nos indicará que consultemos un fichero en el contenedor, con una clave para poder acceder por primera vez:

Inicio instalación de Jenkins


Para localizar esta información, podemos ejecutar desde la consola de comandos:

  1. sudo docker exec -ti d345b65306ef cat \
  2. /var/jenkins_home/secrets/initialAdminPassword

En el siguiente paso se nos pregunta si queremos instalar los plugins recomendados:

Pregunta si queremos instalar los plugins recomendados


Podemos ver el estado de instalación:

Estado de instalación la instalación


Una vez finalizada la instalación debemos definir las credenciales:

Definir credenciales


Definimos la URL :

Definir la URL


Y ya hemos finalizado:

Final de la instalación


De esta manera ya podemos acceder a Jenkins:

Vista de Jenkins recién instalado


Y esto es todo. Espero que esta entrada os sea de utilidad en algún momento.

Fuentes consultadas

Docker Hub Jenkins