Blog

Carlos Múgica
10 Oct 2023

Las pipeline de madrugada sientan mejor

Tiempo de lectura 3 minutos
  • azure devops
  • CI/CD
  • Integración continua
  • testing

Sumario Planifica en Azure la ejecución tu pipeline más lento para que compañeros de otros proyectos no se vean afectados.

Contexto

La pipeline de compilación y ejecución de los tests puede llegar a alargarse bastante cuando tu proyecto va creciendo, no sólo por el número de tests, sino por la complejidad de los mismos, (levanta una BD, pruébala, levanta el contexto de tu servicio web, lanza peticiones contra él, prueba los timeouts…) y a no ser que tengas infinitos nodos en azure para lanzar pipelines en paralelo, vas a afectar a tus compañeros, tanto de tu proyecto como de otros proyectos, que tendrán que esperar a que termine de ejecutar tu pipeline para que den tiempo a las suyas, pobres proyectos que no tienen ni tests de integración y sólo requieren de un par de minutos para compilar y poder integrar su rama a develop.

Además, se suele dar otro fenómeno, y es que al ser tan largo el proceso de ejecución de todos los tests, los desarrolladores suelen delegar en la pipeline este proceso, haciendo commits sin lanzar los tests y esperando a que sea la pipeline la que les diga si han roto algo, derivando en más de 10 ejecuciones de la pipeline para la misma PR. 

Nuestra solución - 2 pipeline

Para solventar este problema, hemos dividido nuestro pipeline en 2 distintas.  

En la primera, el normal que se ejecuta en las pull requests contra develop hemos excluido los tests de integración y e2e, esto lo hemos hecho vía Maven, ocultándolos tras un perfil, y lo único que hace es compilar y lanzar los tests unitarios.  

Luego hemos creado una nueva pipeline que ejecuta la compilación y todos los tests, esta la hemos planificado para que se ejecute contra develop todos los días a las 2 de la mañana, para ello hemos cogido la pipeline original y le hemos incluido un par de parámetros.  

El primero el Schedule, el cual planifica mediante una expresión cron (sin segundos) la frecuencia de ejecución, en nuestro caso todos los días a las 2 de la madrugada, además, le hemos indicado que sólo se ejecute contra develop.   

schedules: 
  - cron: '0 2 * * *' 
    displayName: Nightly build 
    branches: 
      include: 
      - develop 

El segundo parámetro es para que el CI de Azure no dispare ejecuciones de esta pipeline al detectar cambios en la rama.

trigger: none 

Y con esto ya tendríamos relegados nuestros tests más lentos a la ejecución nocturna, en la que ya no molestamos a nadie.  

Bola extra:  

Hay que tener en cuenta que esto puede llegar a hacer que se cuele algún test fallido en master, cosa que no se debe permitir, para lo cual yo sí que mantendría en los mergeos de la release contra master la pipeline completa activada.  

Aparte, para mantener lo más saneada posible la rama develop, se puede configurar un envío de email cada vez que falle la ejecución del pipeline para rápidamente poder corregir y castigar severamente al culpable. 

Para ello nos vamos a la configuración de azure y añadimos una nueva suscripción a notificación 

Autor

Carlos Múgica
Carlos Múgica

Desarrollador en dev&del

Capitán en Hello, World!

Especializado en desarrollo JAVA.

Carlos es un apasionado de la calidad del Software, pero lo único que le gusta más que meter test son las sentadillas.

¿Estás interesado?

Déjanos tus datos y contactaremos contigo lo antes posible