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.
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.
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”.
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
- 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 check “Desechar ejecuciones antiguas”.
- 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:
- Lo primero que haremos será acceder a nuestro repositorio BitBucket y obtener la URL de acceso. En mi caso: https://rcrespop@bitbucket.org/rcrespop/helloworldci.git
- Dado que vamos a utilizar las credenciales de acceso que previamente hemos configurado, debes eliminar de la URL el nombre de usuario, de tal forma que quede de esta manera: https://bitbucket.org/rcrespop/helloworldci.git
- No olvides indicar las credenciales de acceso en el combo “Credentials” y guardar los cambios realizados
- 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
- 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.
- 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:
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).
Si accedes a SonarQube, podrás comprobar el resultado del análisis de código que se realizó tras construcción del código.
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
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”.
Y escribe “master” en el campo de texto “Branch name”:
Como en este caso, la ejecución del job será manual, desactivamos todos los disparadores que haya 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.
Por último, elimina la acción posterior de ejecución de Sonar que aparece configurada:
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)
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”.
Cuando guardes los cambios, podrás observar que en el menú de la izquierda aparece una nueva opción llamada “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.
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.
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
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.
6 Responses
Hola, como puedo contar la cantidad de Jobs que tengo en Jenkins?
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?.
Podrías hacerlo sin problema. En los proyectos en los que estoy participando, se está usando Jenkins para desplegar en PRO pero de momento sin automatizar
Saludos
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 🙂
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
Por fin algo de claridad sobre Jenkins y Jobs