Artículos etiquetados con:jenkins
La integración continua actual pasa por pipelines

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.

 

 


Cómo compilar aplicaciones Android con Jenkins

En tiempos de desarrollo de software mediante metodologías ágiles, Scrum e integración continua, donde todos los miembros de un equipo integran su código frecuentemente y pueden realizar varias subidas al día dependiendo de las tareas a desarrollar, resulta imprescindible el uso de herramientas que permitan conocer en todo momento el estado del producto, las diferentes versiones y el estado en que se encuentra.

Cada vez que se realiza una subida de código al repositorio, se realiza una integración que compila el código fuente y verifica que se ha realizado correctamente, obteniendo un ejecutable de la aplicación. Para este proceso, en SDOS nos hemos decantado por el uso de Jenkins, un software gratuito y Open Source escrito en Java y está basado en el proyecto Hudson.

 

¿POR QUÉ JENKINS?

Este sistema soporta herramientas de control de versiones como SVN o GIT y puede ejecutar proyectos basados en Ant y Maven, Gradle, etc. Además, al ser un proyecto Open Source, es el más utilizado por los desarrolladores, contando con una gran comunidad de desarrollo y soporte.

Pero Jenkins no es sólo una herramienta para el equipo de desarrollo, también sirve al equipo de QA: del mismo modo que posibilita la ejecución de test automáticos o incluso el uso de Sonarqube, justo después de cada compilación permite comprobar la calidad de la subida.

 

¿CÓMO USAR JENKINS CON ANDROID?

En el desarrollo Android, Jenkins puede servirnos para generar un .apk cada vez que realicemos una subida de código al repositorio, guardándola en un servidor FTP donde tendremos un listado de todas las versiones generadas.

En este post os contamos cómo completar todo el proceso. ¡Empezamos!

 

1. CREAR UN PROYECTO EN JENKINS

En primer lugar, creamos un nuevo Job en Jenkins.

Paso 1 para compilar un .apk en Jenkins

A continuación, seleccionamos un nuevo proyecto Freestyle para poder configurarlo según nuestras necesidades. Escribimos un nombre y hacemos clic en OK.

Paso 2 para compilar un .apk en Jenkins

 

2. CONFIGURAR LAS SECCIONES DEL JOB

GENERAL

En esta sección definiremos lo siguiente:

  • Proyect name y description. Es recomendable dar un nombre intuitivo al proyecto y una descripción concreta para saber qué Job estamos ejecutando:

Paso 3 para compilar un .apk en Jenkins

  • Cuándo se descargan los builds antiguos. Es importante definir un número máximo de build a guardar ya que no queremos sobrecargar la máquina ni llenar de ejecuciones nuestro Job. Como recomendación, nos quedaremos con las 10 últimas ejecuciones realizadas. Si por necesidad del proyecto necesitamos que sean más, podría aumentarse el número, pero debería ser sólo en casos puntuales.

Paso 4 para compilar un .apk en Jenkins

  • Parámetros para ejecutar el proyecto. En la parte general también definiremos los parámetros necesarios para ejecutar un Job. Para añadirlos tenemos que hacer clic en This project is parameterized y seleccionar un Choice Parameter. Los parámetros para la compilación de una app de Android serán los siguientes:
    • Type. Por defecto en Android siempre aparecen dos tipos, debug y release, pero pueden añadirse tipos personalizados. En nuestro caso añadiremos: Release, Preproduction y Debug.
    • Flavors. Un flavor define una versión customizada de la aplicación. Esto nos permite definir diferentes personalizaciones de la aplicación dependiendo de la variante que necesitemos. Por ejemplo, podríamos tener un flavor para una demo de la aplicación y otro con la aplicación completa de pago.
    • Git Parameter. Definiremos como parámetro la rama que queremos del repositorio concreto. Tendremos que definir un valor por defecto para las ejecuciones automáticas. Si tenemos muchas ramas en un mismo repositorio, podemos hacer un filtro por nombre de rama como, por ejemplo, .*_rc.* (todas las ramas que incluyen _rc, release candidate).

Paso 5 para compilar un .apk en Jenkins

Paso 6 para compilar un .apk en Jenkins

 

Puedes encontrar más información sobre los parámetros en este enlace.

 

SOURCE CODE MANAGEMENT

En esta sección definiremos el tipo de repositorio que queremos usar, en nuestro caso será Git.

Una vez que seleccionamos la opción de Git tenemos que añadir:

  • URL del repositorio. Dónde está guardado el código del proyecto.
  • Credenciales. Usaremos en usuario git previamente añadido en Jenkins.
  • Branch. Especificaremos la rama específica del proyecto que usaremos. Como ya la hemos elegido una con el parámetro Git Parameter, le pasamos el valor de ese parámetro con $Branch.

Paso 7 para compilar un .apk en Jenkins

 

BUILD TRIGGERS

En esta sección definiremos el tipo de activador que necesitamos para ejecutar el build. Si no añadimos ninguno, sólo se ejecutará cuando nosotros lo forcemos. Desde aquí también podemos:

  • Realizar una ejecución remota desde un script.
  • Realizar la ejecución de forma periódica, por ejemplo cada noche a las 00:00.
  • Realizar una ejecución cuando se produzca un push o un new merge request en el repositorio.

Por ahora lo dejaremos por defecto y lo ejecutaremos manualmente.

 

BUILD ENVIROMENT

En esta sección definiremos dos opciones:

  1. Borrar la carpeta del workspace antes de cada ejecución (para realizar una ejecución limpia).
  2. Añadir el timestamp a los logs para tener más información.

Paso 8 para compilar un .apk en Jenkins

 

BUILD

En la sección del Build añadiremos un Execute shell para ejecutar los siguientes comandos:

Paso 9 para compilar un .apk en Jenkins

  • chmod +x gradlew: da permisos de ejecución al fichero gradlew por si no los tiene (por defecto ya los tiene).
  • ./gradlew: ejecuta el fichero gradlew en la máquina donde está Jenkins que es un Linux (¡cuidado con este fichero!).
  • assemble: es la orden para compilar una aplicación Android.
  • $Flavor: flavour elegido para la ejecución. Ponemos $ para que se sustituya el valor del parámetro por el seleccionado del desplegable flavor en la sección general.
  • $Type: type elegido para la ejecución. Ponemos $ para que se sustituya el valor del parámetro por el seleccionado del desplegable type en la sección general.

 

POST-BUILD ACTIONS

Desde esta sección realizaremos principalmente tres acciones:

  • Guardar el artefacto generado. Guardaremos todos los ficheros .apk generados en la compilación del proyecto. Por defecto lo guardaremos en: **/*.apk

Paso 10 para compilar un .apk en Jenkins

  • Enviaremos el fichero .apk dentro de la carpeta /apks/ a un servidor FTP. En nuestro caso, tenemos un servidor llamado NAS1 en el que guardaremos el apk generado en una carpeta ya creada dentro del servidor.Nota: para configurar la conexión con un servidor FTP debemos ir a Manage Jenkins > Configure Jenkins > Publish over FTP, y añadir los datos correspondientes a nuestro servidor.

Paso 11 para compilar un .apk en Jenkins

  • Enviar correo cada vez que termine un Build utilizando la acción post-build Editable Email Notification. La configuración que tendremos será la siguiente:

Paso 12 para compilar un .apk en Jenkins

 

Puedes copiar el contenido del mensaje por defecto de este HTML:

Default Subject

[JENKINS- ${JOB_NAME} ] Result of Build $BUILD_NUMBER ${JOB_NAME} Project.

Default Content

<html>
 
<p> Hello. </p>
 
<p>This mail is auto-generated as part of the Jenkins execution of the project <b>${JOB_NAME}</b> </p>
 
<h2> BUILD DETAILS: </h2>
 
<p>
       <b>Project Name:</b> ${JOB_NAME} <br>
       <b>Build URL:</b> ${BUILD_URL} <br>
       <b> Build Number: </b> ${BUILD_NUMBER} <br>
       <b>Build Status: </b> ${BUILD_STATUS} <br>
       <b>Type: </b> $Type <br>
       <b>Flavor: </b> $Flavor <br>
       <b>Branch: </b> $Branch <br>
       <b>Download APK: </b> ${BUILD_URL}/lastSuccessfulBuild/artifact/apks/ <br>
       <b>Log: </b> The log file is attached into this e-mail. <br>
       <b>Log URL: </b> ${BUILD_URL}${JOB_NAME}/lastBuild/console <br>
       <b>Changes: </b> ${CHANGES, format="List of changes: <li><ul>[%a] %m </ul><ul> [Date:] %d </ul> <ul> [Revision:] %r </ul></li> <br>"} <br>
</p>
 
<p> Thank you & Regards. </p>
 
</html>

 

Esta template es genérica para cualquier proyecto ya que usa las siguientes variables:

  • ${JOB_NAME}. Nombre del Job en el Jenkins.
  • ${BUILD_URL}. URL exacta del Job.
  • ${BUILD_NUMBER}. Número de Build ejecutado.
  • ${BUILD_STATUS}. Estado en el que ha finalizado el Build.
  • $Type. Tipo seleccionado al ejecutar el Build.
  • $Flavor. Flavor seleccionado al ejecutar el Build.
  • $Branch. Branch seleccionada al ejecutar el Build, si no se ha elegido ninguna aparece el nombre de la branch por defecto definida.
  • ${CHANGES}. Muestra los cambios realizados en el commit que ha activado el Build.
    • %a: autor del commit.
    • %m: mensaje del commit.
    • %d: fecha del commit.
    • %r: número de commit.

 

Esto dará lugar a un email como el que se muestra a continuación. Obtenemos así el .apk generado de forma sencilla.

Paso 13 para compilar un .apk en Jenkins

 

Sin lugar a dudas, en los últimos años Jenkins se ha convertido en una herramienta indispensable en el desarrollo de software ágil ya que, además de automatizar el proceso de producción de artefactos, garantiza la calidad en cada uno de ellos tanto para el cliente como para el propio equipo.


Uso de cookies

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continúas navegando estas dando tu consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pincha el enlace para obtener más información.

ACEPTAR
Aviso de cookies