BLOG

Aprende a Montar un Entorno de Integración Continua (V) – Ejecución de Jobs en Jenkins
DevOps-Tecnología

Como vimos en el post anterior, Jenkins es una aplicación web que nos facilita la planificación y ejecución de tareas(Jobs), como por ejemplo descargar programas desde repositorios de código, construir y probar el software o monitorizar la ejecución y resultado de los jobs ejecutados.

En esta nueva entrada vamos a aprender a configurar y ejecutar Jobs en Jenkins. Para ello, crearemos dos tareas:

  • HelloWorldCI-develop: realizará tareas de construcción, test y análisis de código
  • HelloWorldCI -publish: realizará la publicación de un artefacto en Nexus OSS

Configuración de las credenciales de acceso a Git

Antes de empezar a crear los Jobs, es necesario dar permisos a Jenkins para acceder a nuestro repositorio Git, para lo que necesitas configurar unas credenciales de acceso. Para ello, en el menú principal de Jenkins pincha sobre la opción “Credentials”. Verás una tabla donde puedes crear distintos dominios de credenciales. Para nuestro ejemplo usaremos el dominio existente “Global credentials”, por lo que haz click sobre él.

Credenciales Dominio Jenkins

Crea una nueva credencial de tipo Username with password. Ten en cuenta que el usuario y password que configures son los de tu cuenta de Bitbucket.

Jenkins - Credenciales BitBucket

Una vez configuradas las credenciales de acceso a Git, estamos listos para crear nuestro primer job

HelloWorldCI-Develop

El objetivo de este job será comprobar si se han producido cambios en el repositorio Git. En caso afirmativo, realizará una construcción del código y lo analizará. Para crear una nuevo job, en el menú principal de Jenkins encontrarás la opción “Nueva Tarea”. Haz click sobre ella y selecciona la opción “Crear un proyecto maven”.

Jekins - Crear Nueva Tarea Maven

Cuando finalices, pulsa OK para crear el job. A continuación vamos a configurarlo. Para ello accede a la opción de menú “Configurar” y rellena cada uno de los siguientes apartados que se indican a continuación:

  • Descripción: Indicar objetivo y funciones que realizará el job

Objetivos y funciones que realizará el job cuando se ejecute en Jenkins

  • Histórico de ejecuciones: Cada vez que Jenkins ejecuta un job, guarda un histórico con el resultado. Con el fin de optimizar el espacio en disco, es recomendable establecer un número máximo de ejecuciones históricas que serán guardadas. En nuestro caso, indicaremos un máximo de 10 ejecuciones. Para ello, lo primer tendrás que seleccionar el checkDesechar ejecuciones antiguas”.

Número máximo de ejecuciones históricas que registrará Jenkins

  • Repositorio Git: En el apartado “Configurar el origen de código fuente” debes indicar el repositorio Git al que se va a conectar Jenkins para descargar la aplicación:

Configuración del repositorio Git al que se debe conectar Jenkins para descargar la aplicación.

  • Disparadores (Triggers): Aquí vamos a establecer que el job se lance cada vez que se produzca un cambio en el repositorio Git. Por simplicidad, para nuestro ejemplo vamos a realizar un Polling contra el respositorio, realizando consultas periódicas cada 10 minutos para detectar si ha producido algún cambio en el código fuente de nuestra aplicación

Configuración de Triggers en Jenkins

  • Construcción (Build): Indicaremos a Jenkins como realizar la construcción de nuestra aplicación. Dado que estamos construyendo un proyecto Maven, es necesario indicar la ubicación del fichero pom.xml y las fases que queremos ejecutar, que serán clean install, con el objetivo de asegurar que se limpia el workspace antes de realizar la build y que se instalan todos los artefactos en el repositorio local de Maven.

Configuración de las fases de maven que vamos a ejecutar en el Job

  • Análisis de código: Lo siguiente será indicar a Jenkins que ejecute SonarQube para analizar el código fuente tras realizar la build. Para ello, localiza el apartado “Acciones para realizar después”, abre el combo “Añadir una acción” y selecciona la opción SonarQube. Cuando lo hayas hecho, pulsa sobre el botón “Avanzado” para configurar la propiedad -Dsonar.sourceEncoding=UTF-8 con el fin de indicar a SonarQube que los ficheros de código fuente están codificados con UTF-8:

Combo en Jenkins para seleccionar la opción de lanzar SonarQube

Configuración de la propiedad en Sonar para trabajar con UTF-8

Con estos pasos hemos finalizado la configuración de nuestro primer Job. Para ejecutarlo, bien puedes esperar el intervalo de tiempo que configuramos previamente (10 minutos) o bien puedes lanzarlo manualmente desde la opción de menú “Construir ahora”. En la página principal de Jenkins podrás ver el resultado de la ejecución del job. (Recuerda asegurarte de tener levantado el servidor de MySQL y SonarQube antes de lanzar el job o el resultado será fallido).

Resultado ejecución de un job en Jenkins

Si accedes a SonarQube, podrás comprobar el resultado del análisis de código que se realizó tras construcción del código.

Resultado en SonarQube tras lanzar la ejecución de un Job en Jenkins

HelloWorldCI-Publish

El objetivo de este job será realizar la publicación de nuestra aplicación en un repositorio de artefactos como es Nexus OSS. Una vez realizada la publicación, nuestro artefacto estará listo para ser utilizado como dependencia de otros sistemas o ser desplegado en un entorno determinado (CERT, PRE o PRO).

Lo primero que haremos será configurar Maven para que tenga acceso a nuestro Nexus OSS y pueda realizar publicaciones. Para ello asegúrate que en el fichero pom.xml del artefacto que vas a publicar, se indica el repositorio donde se desplegaran las versiones generadas por el proyecto, tanto estables como snapshots. Ten en cuenta que si no especificas el repositorio de snapshots, todas las publicaciones se realizarán sobre el mismo repositorio indicado en el tag repository 

<xml>
	 <distributionManagement>
		<repository>
			<id>nexus</id>
			<url>https://localhost:8081/nexus/content/repositories/releases</url>
		</repository>
		<snapshotRepository>
			<id>nexus</id>			<url>https://localhost:8081/nexus/content/repositories/snapshots/</url>
		</snapshotRepository>
	</distributionManagement>
<xml>
</code>

Para que Maven tenga permisos para publicar en Nexus OSS, tendremos que configurar unas credenciales de acceso. Para simplificar el ejemplo, configuraremos el usuario administrador de Nexus OSS en el fichero settings.xml, ubicado en la carpeta conf/ del directorio de instalación de Maven.

	<servers>
		<server>
			<id>nexus</id>
			<username>admin</username>
			<password>admin123</password>
		</server>
	</servers>

Una vez configurado Maven, ya estamos preparados para crear un nuevo job en Jenkins. A diferencia del job HelloWorldCI-develop, la ejecución de este nuevo será manual. Lo lanzaremos cada vez  que tengamos una versión estable de nuestra aplicación que queramos liberar.

Para generar una versión de nuestra aplicación, usaremos el plugin maven-release-plugin que ejecuta las siguientes fases de Maven antes de realizar la publicación del artefacto:

  • release:prepare, que realiza las siguientes operaciones:
    • Chequea que no haya cambios en los fuentes sin subir a Git
    • Chequea que todas las dependencias del proyecto son releases (no hay SNAPSHOTS)
    • Cambia la versión de todos los artefactos involucrados, quitando el SNAPSHOT
    • Inserta en la sección SCM del POM la información del TAG que se va a realizar
    • Ejecuta todos los test sobre el POM modificado, para asegurar que todo sigue funcionando correctamente
    • Realiza el commit de los POM modificados
    • Marca el código recién subido con una etiqueta que representa la versión que se ha generado
    • Vuelve a modificar la versión en los POM para que sea la siguiente versión a desarrollar, seguida del tag SNAPSHOT
    • Realiza el commit de los POM con la siguiente versión, de manera que los desarrolladores puedan empezar a trabajar en la nueva versión.
  • release:perform, para publicar en el repositorio de artefactos una versión previamente subida al repositorio. Se realizan dos tareas:
    • Se descarga del sistema de control de versiones el último TAG de versión
    • Genera el artefacto y lo sube al repositorio de artefactos (ejecuta mvn deploy)

Para facilitar la construcción de este nuevo job, partiremos del que ya teníamos creado (HelloWorldCI-develop), lo clonaremos y asignaremos un nuevo nombre: HelloWorldCI-publish

Clonación de un job en Jenkins

Modifica la descripción del job que acabas de crear para indicar algo de este estilo: “Este job se lanzará manualmente para publicar un nuevo artefacto en el repositorio de artefactos de nexus”

 Localiza el apartado “Configurar el origen del código fuente”. Dentro de esta sección observarás que hay un botón para añadir nuevos comportamientos. Haz click y selecciona “check out to specific local branch”.

Job-SCM new behaviour

Y escribe “master” en el campo de texto “Branch name”:

Job-MasterBranch

Como en este caso, la ejecución del job será manual, desactivamos todos los disparadores que haya seleccionados:

Deshabilitamos los triggers seleccionados

Lo siguiente que haremos será modificar los goals de job. En el apartado Proyecto, encuentra el campo de texto “Goles y opciones” y escribe deploy.

Goal Deploy

Por último, elimina la acción posterior de ejecución de Sonar que aparece configurada:

Eliminar acción sonarQube

Guarda todos los cambios y vuelve al menú principal de Jenkins. Lo siguiente que haremos será instalar el plugin Maven Release Plug-in Plug-in siguiendo los mismos pasos que vimos en el post anterior (Recuerda reiniciar Jenkins después de la instalación)

Maven Release Plugin

Entra de nuevo a la configuración del job y localiza una nueva sección llamada “Entorno de Ejecución” y haz click en el check “Maven reléase build”.

Check Maven Release Build

Cuando guardes los cambios, podrás observar que en el menú de la izquierda aparece una nueva opción llamada “Perform Maven Release”

Nueva opción de menu Perform maven release

Pincha sobre la nueva opción para establecer la versión de publicación que vas a generar así como la siguiente versión sobre la que el equipo de desarrollo comenzará a trabajar. También debes indicar las credenciales de acceso al Git.

Configuración del plugin Perform Maven Release

Haz click sobre el botón “Schedule Maven Release Build” para lanzar una ejecución del job. Asegurate que el servidor de Nexus OSS esté levantando antes de la ejecución. Si todo fue bien, deberías poder ver la nueva reléase publicada en Nexus OSS.

Ejemplo de release publicada en Nexus

Si accedes a tu repositorio Git, comprobaras que Maven ha generado nuevos commits. En este caso, comprobaras que se ha actualizado la versión en el fichero pom.xml

Commit en Git tras realizar una release y publicarla en Nexus

Felicidades!! acabas de publicar tu primer artefacto. Te animo a seguir profundizando y descubriendo nuevas opciones y multitud de posibilidades que nos ofrecen las herramientas del entorno de integración continua que acabas de montar.

Comparte este artículo si te gustó:

6 Responses

  1. Excelente artículo, muchas gracias. Tengo una duda que estoy intentando aclarar, a ver si puedes ayudarme. ¿Has usado Jenkins para gestionar los pasos a producción?.

  2. Muy bien explicado, gracias.
    ¿Como puedo hacer para que cuando le de a «construir ahora» me pregunte que rama del GIT compilar?

    Quiero que automáticamente detecte los cambios en el GIT de cualquier rama, y lo compile, pero cuando ejecute manualmente «construir ahora» me de opción de seleccionar la rama.

    En «Branches tio build» pongo «**», con esto consigo los primero, pero cuando construyo manualmente, se compila la ultima rama compilada automáticamente.

    Gracias 🙂

  3. Hola Roberto, muy didactico los articulos. Segui casi todos los pasos que mencionas para configurar mi ambiente de integracion continua. Sin embargo no logro configurar la parte del publish. Me arroja este error en el job.

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5.2:prepare (default-cli) on project web: Unable to commit files
    [ERROR] Provider message:
    [ERROR] The git-push command failed.
    [ERROR] Command output:
    [ERROR] fatal: could not read Username for ‘https://bitbucket.org’: No such device or address
    [ERROR] -> [Help 1]
    [ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR]
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] https://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

    Agradecere mucho me puedas ayudar con la solucion a este error. Estoy usando Linux 16.04

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.