El objetivo de esta práctica es el desarrollo gradual de un Pipeline que vaya realizando tareas sobre el repositorio de una aplicación.

La aplicación con la que vamos a trabajar será tu fork de la aplicación django Polls. Como hemos visto esta aplicación que implementa el tutorial de Django tiene implementado un módulo de pruebas.

Vamos a construir el Pipeline en varias fases:

Ejercicio 1: Construcción de una imagen docker

Partimos del pipeline que hemos desarrollado en el Taller 3: Integración continua de aplicación django (Test), donde hemos automatizado el test de la aplicación.

Modifica el pipeline para que después de hacer el test sobre la aplicación, genere una imagen docker. tienes que tener en cuenta que los pasos para generar la imagen lo tienes que realizar en la máquina donde está instalado Jenkins. Tendrás que añadir las siguientes acciones:

  1. Construir la imagen con el Dockerfile que tengas en el repositorio.
  2. Subir la imagen a tu cuenta de Docker Hub.
  3. Borrar la imagen que se ha creado.

Por lo tanto tienes que estudiar el apartado Ejecución de un pipeline en varios runner para ejecutar el pipeline en dos runner:

  • En el contenedor docker a partir de la imagen python:3 los pasos del taller 3.
  • En la máquina de Jenkins los pasos de este ejercicio.

Otras consideraciones:

  • Cuando termine de ejecutar el pipeline te mandará un correo de notificación.
  • El pipeline se guardará en un fichero Jenkinsfile en tu repositorio, y la configuración del pipeline hará referencia a él.

Entrega

  1. Una captura de pantalla donde se vea la salida de un build que se ha ejecutado de manera correcta.

  1. Una captura de pantalla de tu cuenta de Docker Hub donde se vea la imagen subida de último build.

  1. Introduce un fallo en el Dockerfile y muestra la salida del build donde se produce el error.

  1. Entrega la URL del repositorio para ver el Jenkinsfile.
https://github.com/javierasping/django_tutorial_docker.git
  1. Pantallazo con el correo que has recibido de la ejecución del pipeline.

Ejercicio 2: Despliegue de la aplicación

Amplía el pipeline anterior para que tenga una última etapa donde se haga el despliegue de la imagen que se ha subido a Docker Hub en tu entorno de producción (VPS). Algunas pistas:

  • Busca información de cómo hacer el despliegue a un servidor remoto (ssh, buscando algún plugin con esa funcionalidad,…)
  • Si vas a hacer conexiones por ssh, tendrás que guardar una credencial en tu Jenkins con el nombre de usuario y contraseña.
  • Para el despliegue deberá usar el fichero docker-compose.yaml que has generado en otras prácticas.
  • Se deberá borrar el contenedor con la versión anterior, descargar la nueva imagen y crear un nuevo contenedor.

Otras consideraciones:

  • Cambia el disparador del pipeline. Configúralo con un webhook de github, para que cada vez que se produce un push se ejecute el pipeline. Para que el webhook pueda acceder a tu Jenkins puedes usar ngrok.

Entrega

  1. El contenido del fichero Jenkinsfile.
  2. Las credenciales que has guardado en Jenkins.

  1. Demuestra al profesor como se realiza la IC/DC completo.

Ejecución normal del pipeline :

La configuración de nginx y los contenedores ejecutandose

javiercruces@atlas:~$ sudo cat /etc/nginx/sites-available/django_docker 
server {
    listen 80;
    server_name djangodocker.javiercd.es;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name djangodocker.javiercd.es;

    ssl_certificate /etc/letsencrypt/live/javiercd.es/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/javiercd.es/privkey.pem;

    location / {
        proxy_pass http://localhost:8082;
        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;
    }
}

javiercruces@atlas:~$ docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
4d7947fc359f   javierasping/django_tutorial_ic   "/bin/sh -c 'python3…"   33 minutes ago   Up 33 minutes   0.0.0.0:8082->3000/tcp, :::8082->3000/tcp   django_tutorial_web
bdf947a4bccc   mariadb                           "docker-entrypoint.s…"   33 minutes ago   Up 33 minutes   3306/tcp                                    mariadb-django

La aplicación funcionando en el VPS :

La configuración de Ngrok y el Webhook

curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
  | sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
  | sudo tee /etc/apt/sources.list.d/ngrok.list && sudo apt update && sudo apt install ngrok

javiercruces@atlas:~$ ngrok config add-authtoken 2d2CfE


debian@jenkins:~$ ngrok http http://localhost:8082

Si provocamos el fallo :