Hasta ahora hemos visto como crear un pipeline que funciona al hacer clic manualmente en el link de “Construir Ahora” o “Build Now”. Esto funciona pero no es muy conveniente. Todos los equipos tendrían que recordar que después de hacer un commit al repositorio necesitan ir a Jenkins a iniciar un build. Ahora en este post vamos a ver el caso en el que el proceso de un pipeline se inicia automáticamente y, cuando termina, notifica a los miembros del equipo sobre el estado del build.

Triggers de Jenkins

Una acción automática que inicia una compilación es lo que llamamos un pipeline trigger. En Jenkins hay muchas opciones para escoger como llevar a cabo esta acción. En este post mostraré las tres mas importantes:

  • Externo
  • PollingSCM
  • Compilación Programada

Trigger Externo

Los triggers externos son los mas naturales de entender. Se accionan cuando Jenkins inicia una compilación después de que se le notifica que lo haga. Esta notificación puede efectuarse cuando tro pipeline termino o bien el sistema de control de versiones lo requiere (como por ejemplo GitHub) o incluso cualquier script remoto.

Normalmente si esta bien configurado, GitHub efectua un trigger a un endpoint de Jenkins para iniciar el proceso de construcción. Para esto necesitamos los siguientes pasos:

  1. Instalar el plugin de GitHub en Jenkins
  2. Generar una llave para Jenkins
  3. Configurar el web hook y especificar la llave y la dirección de Jenkins

Y si ustedes no usan GitHub, casi todos los proveedores de control de versiones (gitlab, bitbucket, etc…) proveen un plugin de jenkins para realizar este tipo de triggers.

De igual manera, se puede realizar una llamada personalizada al endpoint REST de Jenkins, si tenemos los tokens bien configurados. Simplemente ponemos:

<url_jenkins>/job/<nombre_job>/build?token=<token>

Y asegurarse que la url sea accesible. El simple hecho de llamar a esa URL iniciara el proceso del pipeline desde donde sea.

PollingSCM

Similarmente a los triggers externos, Jenkins puede vigilar un repositorio dado y efectuar un pipeline cada vez que este encuentre un cambio en el mismo.

para esto debemos especificar esta estrategia cuando definimos la configuración del pipeline. Justo despues de la directiva agent, ponemos la directiva “pollSCM”

triggers {
    pollSCM('* * * * *')
}

Despues de correr el pipeline manualmente la primera vez, el trigger automatico se configura. Encontes Jenkins revisa los cambios en GitHub cada minuto, y por cada nuevo commit, inicia un nuevo pipeline.

La sintaxis que recibe la funcion pollSCM no es mas que el estandar para definir crontabs: https://en.wikipedia.org/wiki/Cron

Compilación Programada

La implementación de una compilación programada es exactamente la misma que la de PollingSCM, la unica diferencia es que se utiliza la funcion cron en el trigger. En lugar de revisar si hubo nuevos commits simplemente compila el proyecto cada determinado tiempo. Seguro habran escuchado de los famosos Nightly Builds para algunos proyectos muy activos que reciben muchos cambios a diario.

Notificaciones

Hay dos formas de notificaciones que comunmente se usan para comunicar el resultado de nuestro pipeline.

  1. Correo Electrónico
  2. Chat

Correo Electrónico

Los pre-requisitos para poder mandar notificaciones por medio de correo electronico son:

  • Tener un servidor SMTP configurado
  • Configurar los detalles de autenticación en (Manage Jenkins | Configure System)
  • utilizar la función mail en el pipeline

Si revisan en el post donde configuramos el pipeline definimos una sección que se llamaba post. Esta es la sección que por lo general se usa para notificar.

post {
    always {
        mail to: '[email protected]',
        subject: "Se completo el pipeline: ${currentBuild.fullDisplayName}",
        body: "Se ha terminado la compilación, porfavor revisa: ${env.BUILD_URL}"
    }
}

Cabe notar que done puse “always” pueden ser otras opciones, siendo always la mas ruidosa ya que notifica siempre que termina el proceso. Estas opciones son:

  • always Siempre se notifica
  • changed Notificar solo si el estatus del pipeline cambio (ejemplo: de estable a inestable)
  • failure Notificar solo si fallo
  • success Notificar solo si no fallo
  • unstable Notificar si el pipeline termino inestable. Es decir, fallaron algunos tests o algun quality gate no paso.

Podemos combinar varios por ejemplo si quisieramos failure y success, se pueden configurar los dos y solo cambiar el formato del mensaje.

Chat

En cuanto a chat respecta, los mas famosos son HipChat y Slack. Ambos proveen plugins apropiados para enviar notificaciones desde Jenkins.

Los pre-requisitos para enviar notificaciones desde Jenkins hacia un chat son:

  • Encontrar e instalar el plugin adecuado
  • Configurar un plugin
  • Agregar las instrucciones de envío en el pipeline.

Veamos un ejemplo de como configuraríamos una notificación por Slack despues de una compilación fallida:

post {
    failure {
        slackSend channel: '#ricardogeek-team',
        color: 'danger',
        message: "El pipeline ${currentBuild.fullDisplayName} Fallo."
    }
}

 

Y así es como se completa un pipeline con todo lo de ley en Jenkins. Espero que esta serie de posts les hayan guiado de alguna manera en su camino hacia la cultura DevOps.