En integración continua, como en la vida, hay que renovarse o morir y esto es lo que está pasando con los pipelines y herramientas como Jenkins.

Todos los que hemos utilizado Jenkins como herramienta de interacción continua, sabes lo difícil que resulta mantener los jobs si hay algún cambio a todos los que se tengan. Por ello, pedíamos a voces una herramienta que nos ayudase a gestionar estas actualizaciones de forma centralizada. De aquí es de donde surge la idea de pipelines.

Para empezar, tenemos que ponernos en contexto, ¿qué es eso de los pipelines?

 

PIPELINES: DEFINICIÓN

Un pipeline es una nueva forma de trabajar en el mundo devops en la integración continua. Utilizando pipeline y Jenkins, podemos definir el ciclo de vida completo de una aplicación (descargar código, compilar, test, desplegar, etc.) mediante código.

De esta forma, resulta mucho más sencillo replicar los diferentes pasos con distintas aplicaciones y gestionar mejor los cambios en cada paso.

Un ejemplo de pipeline integrado en herramientas como Jenkins podría ser:

Pipelines stageview - SDOS

 

 

 

¿POR QUÉ USAR PIPELINES?

Uno de los mayores beneficios de usar pipelines y Jenkins es poder hacer los jobs más configurables, fáciles de editar y más durables. También podemos utilizar entradas (input) humanos o esperar la aprobación de otro job para ejecutar el nuestro mediante pipelines.

Pero, además de estas ventajas, el principal valor diferencial de esta nueva estructura es que es versátil y extensible, y podemos crear pipelines para hacer un fork, un bucle, e incluso para ejecutar cosas en paralelo. Además podemos customizarlas todo lo que queramos mediante groovy.

 

MÁS VENTAJAS

Con pipeline podemos:

  • Definir de forma sencilla:
    • Parámetros de entrada
    • Variables de entorno y credenciales
    • Opciones como un timeout, retry o descartar builds
  • Enviar mensajes o hacer alguna acción post-build dependiendo del resultado de la ejecución del pipeline.
  • Saltar alguna fase dependiendo del entorno, la rama que ejecutemos, etc. mediante expresiones boleadas.

 

 

TIPOS DE PIPELINES

Hay dos tipos de pipeline: scripted y declarative.

Nosotros nos centraremos en el declarativo, por ser más novedoso y completo, pero te dejamos una tabla para que compares:

SCRIPTED PIPELINE DESCRIPTED PIPELINE
Modelo de programación imperativo Modelo de programación declarativo
Entorno de programación con todas las funciones Sintaxis más simple y pragmática para la creación de Jenkins pipeline
Gran flexibilidad y extensibilidad Limitado a lo que puede hacer un usuario
Se declara y ejecuta mediante nodos Se declara y ejecuta mediante el comando pipeline y los diferentes stages, stage, steps y step
No hay muchas limitaciones para usuarios expertos y requerimientos complejos La mejor opción para el desarrollo de estrategias de CI y CD con Pipelines
En común:
– Usan Groovy
– Pueden utilizar librerías compartidas
– Pueden utilizar script y shell
– Se guardan en un fichero .jenkinsfile

 

 

¿QUÉ ES UN PIPELINE DECLARATIVO?

Un pipeline declarativo es aquel que podemos crear, editar o configurar mediante una estructura definida que nos ayuda a entender y predecir los pasos del pipeline. Simplifica y da opciones a la sintaxis de los sub-sistemas de pipeline. Al igual que los descriptivos, los pipelines declarativos deben guardarse en un fichero Jenkinsfile para poder ser ejecutados luego por Jenkins.

Un ejemplo de un bloque con un pipeline declarativo podría ser:

pipeline {
    /* insert Declarative Pipeline here */
}

Las reglas básicas para construir un pipeline declarativo válido son las mismas que la sintaxis en groovy, con las siguientes excepciones a tener en cuenta:

  • El nivel más alto de un pipeline debe ser un bloque especificado como pipeline {}
  • No hay ; para separar bloques, cada bloque debe estar en su propia línea.
  • Los bloques sólo pueden contener secciones, directrices, pasos o asignación de bloques.

 

SINTAXIS BÁSICA DE UN PIPELINE DECLARATIVO

  • Pipeline {} Identificamos dónde empieza y termina el pipeline así como los pasos que tiene
  • Agent. Especificamos cuando se ejecuta el pipeline. Uno de los comandos más utilizados es any, para ejecutar el pipeline siempre y cuando haya un ejecutor libre en Jenkins.
  • Stages. Bloque donde se definen una serie de estados a realizar dentro del pipeline.
  • Stage. Bloque que define una serie de tareas realizadas dentro del pipeline, por ejemplo: Build. test, deploy, etc. Podemos utilizar varios plugins en Jenkins para visualizar el estado o el progreso de estos estados.
  • Steps. Son todos los pasos a realizar dentro de un stage. Podemos definir uno o varios pasos.
  • Step. Es una tarea simple dentro del pipeline. Fundamentalmente es un paso donde se le dice a Jenkins qué hacer en un momento específico o paso del proceso. Por ejemplo, para ejecutar un comando en shell podemos tener un paso en el que tengamos la línea sh “ls” para mostrar el listado de ficheros de una carpeta.

Un ejemplo de un pipeline declarativo podría ser:

pipeline {
	agent any
	stages {
    	stage('Build') {
        	steps {
            	sh 'make'
        	}
    	}
    	stage('Test'){
        	steps {
            	sh 'make check'
            	junit 'reports/**/*.xml'
        	}
    	}
    	stage('Deploy') {
        	steps {
            	sh 'make publish'
        	}
    	}
	}
}

 

 

¿QUÉ ACCIONES PODEMOS HACER EN UN PIPELINE?

Jenkins nos hace bastante fácil el desarrollo de pipelines. Si estamos acostumbrados a utilizar plugins para nuestra integración continua podremos ver en la mayoría de los changelogs de los plugins que utilizamos que ya soportan pipelines.

Si queremos asegurarnos, tenemos que tener un job con pipeline instalado y hacer clic en la sección de pipeline syntax. Ahí podremos ver todos los plugins que tenemos instalados y si tienen o no un script de pipeline asociado que podamos utilizar.

Pipelines syntax - SDOS

 

Pipelines syntax page - SDOS

 

 

CREACIÓN DE UN JOB CON PIPELINES

Para poder utilizar pipeline debemos instalar varios plugins en Jenkins:

Una vez que los tengamos instalados debemos crear un job tipo pipeline:

Pipelines creation - SDOS

 

A continuación tenemos que añadir la configuración siguiente:

  • Parámetros necesarios:
    • Url del repositorio de Git
    • Rama donde tengamos el código
  • En la sección de pipelines:
    • Url del repositorio de Git donde está el pipeline
    • Rama donde tengamos el pipeline
    • Nombre del fichero .jenkinsfile donde tenemos el pipeline definido

Pipelines configuration - SDOS

 

 

¿CÓMO UTILIZAMOS EL PIPELINE EN QA?

Actualmente en nuestro departamento de QA estamos utilizando los pipelines para realizar la integración continua de nuestros test automáticos con Appium.

Primero, y antes de empezar, necesitamos una serie de parámetros de entrada específicos para poder ejecutar los test, estos son:

Pipelines parameters - SDOS

 

Una vez que tenemos estos parámetros configurados por job, tenemos que ver los pasos que podemos hacer. Es decir, ¿qué pasos tenemos configurados en el pipeline con Appium para pruebas móviles en Android?

  • Configuración inicial. Definición y seteo de variables globales.
  • Descarga de código. Descargamos el código del repositorio mediante una URL y rama.
  • Ejecutar ADB Server. Ejecutaremos el ADB para lanzar el emulador.
  • Lanzar el emulador. Lanzaremos el emulador que hemos configurado desde los parámetros.
  • Appium Test. Ejecutaremos los test de appium.
  • Sonarqube. Realizamos el análisis de Sonarqube a nuestro código.
  • Post-build actions. Enviamos un e-mail con los datos de la ejecución así como una notificación al slack.

 

 

¿CÓMO EJECUTAR UN JOB EN JENKINS CON PIPELINES?

Una vez que tenemos nuestro job configurado con el pipeline, simplemente tenemos que ejecutarlo para ver el resultado de las diferentes fases:

Pipelines ejecution - SDOS

 

 

CONSULTA NUESTRO CÓDIGO DE PIPELINE

Te dejamos un enlace a nuestro repositorio de GitHub. Esperamos que te ayude agilizar los test de Appium y que el mantenimiento de tus scripts de automatización de pruebas sea coser y cantar.