Programación de un trabajo en Jenkins

1. Introducción

En este artículo, cubriremos varias formas de programar trabajos en Jenkins.

Comenzaremos con la programación de un trabajo simple que realiza algo tan simple como imprimir un mensaje de texto sin formato. Y evolucionaremos el ejemplo para programar un trabajo que se activa automáticamente por cambios en un repositorio de SCM como GitHub, Bitbucket, etc.

2. Configuración inicial

Suponemos que JDK y Maven se han instalado en la configuración global de herramientas con nombres como JDK9.0.1 y Maven3.5.2 , respectivamente, en el servidor de Jenkins.

También asume que tenemos acceso a un repositorio de SCM como Bitbucket con un proyecto de Maven configurado correctamente.

3. Programación de un trabajo sencillo

En la página de configuración del trabajo, desplácese hacia abajo directamente a la sección Build Triggers . Dado que tenemos la intención de crear un trabajo sencillo, seleccionemos la casilla de verificación marcada Construir periódicamente . Tan pronto como seleccionamos esta casilla de verificación, se muestra un cuadro de texto con la etiqueta Programación .

Tenemos que proporcionar valor en un formato compatible con Cron . Hay mucha información disponible en la página si hacemos clic en el signo de interrogación al lado del cuadro.

Escriba * / 2 * * * * aquí, que representa un intervalo de dos minutos:

Al salir del cuadro de texto, podemos ver información justo debajo del cuadro. Nos dice cuándo se ejecutará el siguiente trabajo.

Guardemos el trabajo; en unos dos minutos, deberíamos ver el estado de la primera ejecución del trabajo:

Dado que hemos configurado el trabajo para que se ejecute cada dos minutos, deberíamos ver varios números de compilación cuando volvamos al panel de trabajo después de esperar un tiempo.

4. Creación de un trabajo que sondea SCM

Avancemos un paso y creemos un trabajo que extraiga el código fuente del repositorio de SCM, como Bitbucket, y realice una compilación.

Creemos un nuevo trabajo como se explicó en la sección anterior, con algunas modificaciones.

En la sección Generar activadores , en lugar de seleccionar Generar periódicamente , seleccionemos Sondear SCM . Tan pronto como hagamos eso, deberíamos ver un cuadro de texto con Programa de etiquetas .

Escriba * / 5 * * * * en este cuadro, lo que significa que queremos programar el trabajo para que se ejecute cada 5 minutos:

Desplácese hasta la sección Gestión de código fuente . Al seleccionar el botón de radio junto a Git , aparece una nueva sección etiquetada como Repositorios .

Aquí es donde necesitamos configurar los detalles de nuestro repositorio SCM . Escribamos la URL del repositorio de SCM en el campo de texto URL del repositorio :

También necesitamos proporcionar credenciales de usuario para que Jenkins pueda acceder al repositorio.

Hagamos clic en el botón Agregar junto a Credenciales, que mostrará una pantalla emergente para crear las credenciales de usuario.

Seleccionemos el tipo como nombre de usuario con contraseña . Tendremos que escribir el nombre de usuario y la contraseña en los campos de texto designados:

Al hacer clic en el botón Agregar , regresamos a la sección Administración de código fuente .

Seleccionemos esta credencial de usuario en el menú desplegable junto a Credenciales :

Ahora, lo último que debemos hacer es configurar el script de compilación.

Desplácese hacia abajo hasta la sección Compilar , haga clic en Agregar paso de compilación y seleccione Ejecutar Shell . Dado que estamos trabajando en un proyecto de Maven en el repositorio de SCM, necesitamos escribir mvn clean install , que realizará una compilación de Maven.

Intentemos entender lo que hemos hecho aquí.

Hemos creado un trabajo que está programado para ejecutarse cada 5 minutos. El trabajo se configuró para extraer el código fuente de la rama maestra del repositorio de Bitbucket dado .

Utilizará las credenciales de usuario proporcionadas para iniciar sesión en Bitbucket.

Después de extraer el código fuente, el trabajo ejecutará el script que contiene un comando de Maven proporcionado.

Ahora, si guardamos y esperamos aproximadamente cinco minutos, deberíamos ver la ejecución de la compilación en la sección Historial de compilación en el panel de trabajo.

La salida de la consola debería mostrar la salida de la compilación de Maven. Podemos ver en la salida de la consola que el código fuente se ha extraído de Bitbucket y se ha ejecutado el comando mvn clean install :

Dado que es una compilación de Maven, la salida de la consola puede ser muy larga dependiendo de la cantidad de dependencias de Maven que se descarguen .

Pero al final de la salida, deberíamos ver el mensaje BUILD SUCCESS .

5. Creación de un trabajo que utiliza la canalización como secuencia de comandos

Hasta ahora, hemos visto cómo crear trabajos que se ejecutan a la hora programada predefinida.

Ahora, creemos un trabajo que no esté sujeto a ningún horario en particular. En su lugar, lo configuraremos para que se active automáticamente cada vez que haya una nueva confirmación en el repositorio de SCM.

Volviendo al panel de Jenkins, hagamos clic en Nuevo elemento . Esta vez, en lugar del proyecto Freestyle , seleccionaremos Pipeline . Llamemos a este trabajo PipelineAsScriptJob.

Al hacer clic en el botón Aceptar, se nos llevará a la página de configuración de la canalización. Esta página tiene varias secciones como " General" , " Activadores de compilación" , " Opciones avanzadas del proyecto" y " Canalización" .

Desplácese hacia abajo hasta la sección "Activadores de compilación" y seleccione la casilla de verificación junto a Compilar cuando se envíe un cambio a Bitbucket . Esta opción estará disponible solo si hemos instalado el complemento Bitbucket :

Desplácese hacia abajo hasta la sección Pipeline . Necesitamos seleccionar Pipeline Script en el menú desplegable junto a Definición .

El cuadro de texto que se encuentra justo debajo de este menú desplegable está esperando a que se coloque el script. Hay dos formas de hacerlo.

Podemos escribir todo el script o podemos hacer uso de una utilidad proporcionada por Jenkins, que se conoce como Pipeline Syntax .

Elijamos la segunda opción:

Al hacer clic en Pipeline Syntax , como se resalta en el diagrama anterior, se abre una nueva pestaña en el navegador. Esta es una utilidad útil donde podemos especificar la operación que deseamos realizar, y la herramienta generará el script en Groovy para nosotros. Luego podemos copiar el script y pegarlo en la configuración de la canalización.

Seleccionemos la opción de pago: SCM general en el menú desplegable Paso de muestra . Después de proporcionar la URL del repositorio de SCM y las credenciales de usuario, debemos hacer clic en el botón Generar secuencia de comandos de canalización.

Esto genera el script en el cuadro de texto:

Copiemos este script y guárdelo en algún lugar para su uso posterior.

En la misma página, desplácese hacia arriba y seleccione con Maven: Proporcionar entorno Maven en el menú desplegable Paso de muestra . Debe tenerse en cuenta aquí, que esta opción estará disponible solo si está instalado Pipeline Maven Integration Plugin .

Necesitamos seleccionar los nombres de las instalaciones de Maven y JDK junto a los menús desplegables correspondientes. Necesitamos hacer clic en el botón Generar secuencia de comandos de canalización.

Esto genera el script en el cuadro de texto:

Let's save the script.

There are still a few more scripts that we need to generate. Let's select node: Allocate node in the Sample Step drop-down, type master in the Label text field and click Generate Pipeline Script:

Let's save the script.

And last one.

Let's select stage: Stage in the Sample Step drop-down, type scm in the Stage Name text field and click Generate Pipeline Script:

Let's save it.

It's time to collate all the scripts generated so far and stitch them together:

node('master') { stage('scm') { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'e50f564f-fbb7-4660-9c95-52dc93fa26f7', url: '//[email protected]/projects/springpocrepo.git']]]) } stage('build') { withMaven(jdk: 'JDK9.0.1', maven: 'Maven3.5.2') { sh 'mvn clean install' } } }

The first statement, node(‘master') in the script above, indicates that the job will be executed on a node named master, which is the default node on the Jenkins server.

Let's copy the above script to the Text Box in Pipeline section:

Let's save this configuration.

Now, there's only one thing that's left out. We need to configure a Webhook in Bitbucket. The Webhook is responsible for sending out a push notification to Jenkins server, whenever a particular event takes place in Bitbucket.

Let's take a look at how to configure it.

Let's log in to Bitbucket and select a repository. We should see an option Settings on the left-hand side column. Let's click it, and we should see an option Webhooks in WORKFLOW section. Let's create a new Webhook.

We need to provide some name to this webhook in the Title field. We also need to provide a URL for the webhook in the URL field. This URL needs to point to one particular REST API Endpoint provided by Jenkins, and that endpoint is bitbucket-hook.

It must be noted that the URL MUST end with a trailing slash:

While configuring the Webhook above, we've selected option Repository push. This means Bitbucket will send a notification to Jenkins server whenever a push happens.

This behavior can be modified; there are several different options to choose from.

For now, let's go with the default option,i.e., Repository Push.

We can setup webhook in Github, too; here‘s some helpful information on how to configure that.

Long story short: we've created a pipeline script in Groovy language – that should pull the source code from the master branch of the provided SCM repository (using the provided user credentials), whenever there's a push in the repository and then execute mvn clean install command on the Jenkins server.

It must be noted that this job's not going to run at any particular time. Instead, it's going to wait till there's a push in the master branch of the SCM repository.

As soon as there's a new push event, we'll see a new execution in the “Build History” section on the Jenkins job dashboard.

We should see a new build being initiated with a pending status next to it.

In a few seconds, this build should start execution, and we'll be able to see the complete log in Console Output.

The first statement in the console output says “Started by Bitbucket push by..” – this means that the build was triggered automatically when a Push took place in Bitbucket:

If all goes well, the build should complete successfully.

6. Create a Job That Uses Jenkinsfile

It's possible NOT to write any script in the Jenkins pipeline and still achieve build execution being triggered by the Bitbucket Webhook.

To do so, we have to create a new file in Bitbucket and name it as Jenkinsfile. The pipeline script needs to be transferred to this Jenkinsfile with a slight modification. Let's see exacttly how to do that.

We'll create a new pipeline in Jenkins and name it PipelineWithJenkinsfile.

On the pipeline configuration page, we'll select Pipeline script from SCM next to Definition in the Pipeline section. We'll see a drop-down with different options next to SCM. Let's choose Git from the drop-down.

We then have to provide the URL of Bitbucket repository and user credentials. Let's ensure that the text field next to Script Path contains the default value,i.e., Jenkinsfile:

As far as Jenkins is concerned, that's all we need to configure.

However, we have to create the Jenkinsfile in the repository; so, let's create a new text file, name it as Jenkinsfile and use this simple groovy script:

node('master') { stage('scm') { checkout scm } stage('build') { withMaven(jdk: 'JDK9.0.1', maven: 'Maven3.5.2') { sh 'mvn clean install' } } }

This script is almost the same as the pipeline script that we created in the earlier section, with just one modification. The statement in stage(‘scm') doesn't need the URL and user credentials information. Instead, all it needs is checkout scm.

And that's it. The moment we commit this file into Bitbucket, it'll trigger the build in Jenkins – and we should see the build being triggered in the Build History.

The only difference between this section and the earlier one is that we defined the pipeline script in the Bitbucket repository.

Entonces, el script de compilación es parte del código fuente del proyecto que debe compilarse . No mantenemos el guión en Jenkins.

En cambio, Jenkins tiene conocimiento de los detalles del repositorio de SCM y del archivo de script. Siempre que hay un envío a este repositorio, el script en Jenkinsfile se ejecuta en el servidor de Jenkins .

7. Conclusión

En este tutorial, hemos visto cómo se pueden configurar y programar trabajos en Jenkins utilizando varias estrategias.

También hemos visto cómo configurar un trabajo en Jenkins para que se active automáticamente, según ciertas acciones realizadas en el repositorio de SCM, como Bitbucket.