Integración Continua y Despliegue Continuo (CI/CD)
La aplicación desplegada, compuesta por los dos microservicios (frontend y backend), utiliza un pipeline de CI/CD para automatizar el proceso de integración y despliegue. Ambos proyectos cuentan con distintas ramas, cada una dedicada a un entorno específico: main para producción, pre para preproducción y dev para desarrollo. Cada una de estas ramas tiene su propio pipeline de CI/CD, con sus propias configuraciones y pasos específicos.
Ejecución del pipeline de CI/CD
Para ejecutar el pipeline de CI/CD a través de GitLab se incluye un archivo .gitlab-ci.yml en la raíz de cada proyecto. Este archivo define los pasos que se deben seguir para construir, probar y desplegar la aplicación. En este caso, el fichero .gitlab-ci.yml contiene la siguiente sentencia que recupera los pipelines del proyecto ci-pipelines:
include:
- project: 'tfg-gabriel-canals/ci-pipelines'
ref: main
file: '/environment/preproduction/.preproduction-base.yml'
Dentro del proyecto ci-pipelines se encuentran los pipelines de CI/CD para cada entorno, que se ejecutan en función de la rama en la que se realice el commit.
Desglose del pipeline de CI/CD
El pipeline de CI/CD cuenta con etapas particulares para cada entorno. De forma general, el pipeline puede visualizarse como se muestra en la siguiente imagen:

Como puede observarse, al realizar un commit y un push sobre cualquiera de las tres ramas (main, pre o dev), se ejecuta el pipeline de CI/CD correspondiente. Este pipeline incluye las siguientes etapas:
1. quality: Ejecuta escaneos de calidad del código, como análisis estático.
2. security: Realiza análisis de seguridad del código para evitar el uso de dependencias vulnerables o la revelación de secretos.
3. results-scanners: Genera informes de los escaneos realizados en las etapas anteriores.
4. install-dependencies: Instala las dependencias necesarias para el proyecto mediante npm.
5. test: Ejecuta las pruebas unitarias del proyecto para asegurar que el código funciona correctamente y comprueba que se cumplen los requisitos de cobertura.
6. build: Construye el proyecto, generando los archivos necesarios para su despliegue.
7. container-build: Construye las imágenes de contenedor para el frontend y el backend, utilizando Docker y las sube al registro de contenedores de GitLab de su proyecto. El tag de la imagen se establece con el hash del commit, lo que permite identificar de manera única cada versión de la imagen.
8. deploy: Modifica el manifiesto de Kubernetes para el despliegue, actualizando la referencia de la imagen del contenedor con el nuevo tag. Luego, realiza un push del manifiesto actualizado al repositorio de GitLab, lo que desencadena el despliegue en el clúster de Kubernetes correspondiente al entorno a través de ArgoCD.
9. e2e-tests: En el caso del entorno de preproducción, se ejecutan pruebas E2E utilizando Cypress para asegurar que la aplicación funciona correctamente en un entorno real. Estas pruebas cubren las funcionalidades principales de la aplicación, como el registro de usuarios, inicio de sesión, creación y edición de artículos, comentarios, etc.