Introducción
Jenkins es un servidor de automatización de código abierto diseñado para automatizar tareas técnicas repetitivas involucradas en la integración y entrega continua de software. Con un sólido ecosistema de complementos y un amplio soporte, Jenkins puede manejar un conjunto diverso de cargas de trabajo para crear, probar e implementar aplicaciones.
En guías anteriores, instalamos Jenkins en un servidor Ubuntu 22.04 y configuramos Jenkins con SSL mediante un proxy inverso Nginx . En esta guía, demostraremos cómo configurar Jenkins para probar automáticamente una aplicación cuando se envían cambios a un repositorio.
En este tutorial, integraremos Jenkins con GitHub para que Jenkins reciba una notificación cuando se envíe código nuevo al repositorio. Cuando Jenkins reciba la notificación, extraerá el código y luego lo probará dentro de los contenedores Docker para aislar el entorno de prueba de la máquina host de Jenkins. Usaremos una aplicación Node.js de ejemplo para mostrar cómo definir el proceso de CI/CD para un proyecto.
Prerrequisitos
Para seguir esta guía, necesitará un servidor Ubuntu 22.04 con al menos 1 GB de RAM configurado con una instalación segura de Jenkins. Para proteger correctamente la interfaz web, deberá asignar un nombre de dominio al servidor Jenkins. Siga estas guías para aprender a configurar Jenkins en el formato esperado:
- Cómo instalar Jenkins en Ubuntu 22.04
- Cómo instalar Nginx en Ubuntu 22.04
- Cómo proteger Nginx con Let’s Encrypt en Ubuntu 22.04
- Cómo configurar Jenkins con SSL usando un proxy inverso Nginx
Para controlar mejor nuestro entorno de pruebas, ejecutaremos las pruebas de nuestra aplicación dentro de contenedores Docker. Una vez que Jenkins esté en funcionamiento, instale Docker en el servidor siguiendo los pasos uno y dos de esta guía:
- Cómo instalar y utilizar Docker en Ubuntu 22.04
Cuando haya completado las guías anteriores, podrá continuar con este artículo.
Agregue el usuario Jenkins al grupo Docker
Después de cumplir con los requisitos previos, tanto Jenkins como Docker estarán instalados en el servidor. Sin embargo, de forma predeterminada, el usuario de Linux responsable de ejecutar el proceso de Jenkins no puede acceder a Docker.
Para solucionar esto, debemos agregar el jenkinsusuario al dockergrupo usando el usermodcomando:
- sudo usermod -aG docker jenkins
Puede enumerar los miembros del dockergrupo para confirmar que el jenkinsusuario se ha agregado correctamente:
- grep docker /etc/group
Outputdocker:x:999:sammy,jenkins
Para que Jenkins utilice su nueva membresía, debe reiniciar el proceso:
- sudo systemctl restart jenkins
Si instaló Jenkins con los complementos predeterminados, es posible que deba verificar que los complementos dockery docker-pipelinetambién estén habilitados. Para ello, haga clic en Administrar Jenkins en la barra lateral y, luego, en Administrar complementos en el siguiente menú. Haga clic en la pestaña Disponible del menú de complementos para buscar nuevos complementos y escriba dockeren la barra de búsqueda. Si se muestran Docker Pipeliney Docker plugincomo opciones y no están seleccionadas, seleccione ambas y, cuando se le solicite, permita que Jenkins se reinicie con los nuevos complementos habilitados.
Esto debería tomar aproximadamente un minuto y la página se actualizará después.
Crear un token de acceso personal en GitHub
Para que Jenkins pueda supervisar sus proyectos de GitHub, deberá crear un token de acceso personal en nuestra cuenta de GitHub.
Para comenzar, visita GitHub e inicia sesión en tu cuenta si aún no lo has hecho. Luego, haz clic en el ícono de usuario en la esquina superior derecha y selecciona Configuración en el menú desplegable:
En la página que sigue, localice la sección Configuración de desarrollador del menú de la izquierda y haga clic en Tokens de acceso personal :
Haga clic en el botón Generar nuevo token en la página siguiente:
Serás llevado a una página donde podrás definir el alcance de tu nuevo token.
En el cuadro de descripción del token , agregue una descripción que le permitirá reconocerlo más tarde:
En la sección Seleccionar ámbitos , marque las casillas repo:status , repo:public_repo y admin:org_hook . Estas permitirán que Jenkins actualice los estados de confirmación y cree webhooks para el proyecto. Si está utilizando un repositorio privado, deberá seleccionar el permiso general del repositorio en lugar de los subelementos del repositorio:
Cuando haya terminado, haga clic en Generar token en la parte inferior.
Serás redirigido nuevamente a la página de índice de tokens de acceso personal y se mostrará tu nuevo token:
Copia el token ahora para que podamos hacer referencia a él más tarde. Como indica el mensaje, no hay forma de recuperar el token una vez que salgas de esta página.
Nota : como se menciona en la captura de pantalla anterior, por razones de seguridad, no hay forma de volver a mostrar el token una vez que abandonas esta página. Si pierdes tu token, elimina el token actual de tu cuenta de GitHub y luego crea uno nuevo.
Ahora que tienes un token de acceso personal para tu cuenta de GitHub, podemos configurar Jenkins para vigilar el repositorio de tu proyecto.
Agregue el token de acceso personal de GitHub a Jenkins
Ahora que tenemos un token, debemos agregarlo a nuestro servidor Jenkins para que pueda configurar webhooks automáticamente. Inicie sesión en su interfaz web de Jenkins con la cuenta administrativa que configuró durante la instalación.
Haga clic en su nombre de usuario en la esquina superior derecha para acceder a su configuración de usuario y, desde allí, haga clic en Credenciales en el menú de la izquierda. :
En la página siguiente, haga clic en la flecha junto a (global) dentro del ámbito de Jenkins . En el cuadro que aparece, haga clic en Agregar credenciales :
Serás llevado a un formulario para agregar nuevas credenciales.
En el menú desplegable Tipo , selecciona Texto secreto . En el campo Secreto , pega tu token de acceso personal de GitHub. Completa el campo Descripción para que puedas identificar esta entrada en una fecha posterior. Puedes dejar el Ámbito como Global y el campo ID en blanco:
Haga clic en el botón Aceptar cuando haya terminado.
Ahora podrá hacer referencia a estas credenciales desde otras partes de Jenkins para facilitar la configuración.
Configurar el acceso de Jenkins a GitHub
De vuelta al panel principal de Jenkins, haga clic en Administrar Jenkins en el menú de la izquierda:
En la lista de enlaces de la siguiente página, haga clic en Configurar sistema :
Desplácese por las opciones de la página siguiente hasta encontrar la sección GitHub . Haga clic en el botón Agregar servidor de GitHub y luego seleccione Servidor de GitHub :
La sección se ampliará para solicitar información adicional. En el menú desplegable Credenciales , seleccione el token de acceso personal de GitHub que agregó en la última sección:
Haga clic en el botón Probar conexión . Jenkins realizará una llamada de API de prueba a su cuenta y verificará la conectividad:
Cuando haya terminado, haga clic en el botón Guardar para implementar los cambios.
Configurar la aplicación de demostración en su cuenta de GitHub
Para demostrar cómo usar Jenkins para probar una aplicación, usaremos un programa de tipo “hola mundo” creado con Hapi.js. Debido a que estamos configurando Jenkins para que reaccione a los envíos al repositorio, necesitas tener tu propia copia del código de demostración.
Visita el repositorio del proyecto y haz clic en el botón Bifurcar en la esquina superior derecha para hacer una copia del repositorio en tu cuenta:
Se agregará una copia del repositorio a su cuenta.
El repositorio contiene un package.jsonarchivo que define las dependencias de desarrollo y de tiempo de ejecución, así como también cómo ejecutar el conjunto de pruebas incluido. Las dependencias se pueden instalar mediante la ejecución npm instally las pruebas se pueden ejecutar mediante npm test.
También hemos agregado un archivo Jenkinsfileal repositorio. Jenkins lee este archivo para determinar las acciones que se ejecutarán en el repositorio para compilar, probar o implementar. Está escrito con la versión declarativa del DSL de Jenkins Pipeline .
El Jenkinsfilecontenido incluido en el hello-hapirepositorio se ve así:
Archivo Jenkins
#!/usr/bin/env groovypipeline { agent { docker { image 'node' args '-u root' } } stages { stage('Build') { steps { echo 'Building...' sh 'npm install' } } stage('Test') { steps { echo 'Testing...' sh 'npm test' } } }}
Contiene pipelinetoda la definición que evaluará Jenkins. En el interior, tenemos una agentsección que especifica dónde se ejecutarán las acciones en el pipeline. Para aislar nuestros entornos del sistema host, realizaremos pruebas en contenedores Docker, especificados por el dockeragente.
Dado que Hapi.js es un marco para Node.js, utilizaremos la nodeimagen de Docker como base. Especificamos el rootusuario dentro del contenedor para que pueda escribir simultáneamente tanto en el volumen adjunto que contiene el código extraído como en el volumen en el que el script escribe su salida.
A continuación, el archivo define dos etapas, es decir, divisiones lógicas del trabajo. Hemos denominado a la primera “Build” y a la segunda “Test”. El paso de build imprime un mensaje de diagnóstico y luego se ejecuta npm installpara obtener las dependencias requeridas. El paso de test imprime otro mensaje y luego ejecuta las pruebas tal como se define en el package.jsonarchivo.
Ahora que tiene un repositorio con un válido Jenkinsfile, podemos configurar Jenkins para vigilar este repositorio y ejecutar el archivo cuando se introduzcan cambios.
Crear una nueva canalización en Jenkins
A continuación, podemos configurar Jenkins para usar el token de acceso personal de GitHub para monitorear nuestro repositorio.
De vuelta al panel principal de Jenkins, haga clic en Nuevo elemento en el menú de la izquierda:
Introduzca un nombre para su nueva tubería en el campo Ingresar un nombre de elemento . A continuación, seleccione Tubería como tipo de elemento:
Haga clic en el botón Aceptar en la parte inferior para continuar.
En la siguiente pantalla, marca la casilla del proyecto de GitHub . En el campo URL del proyecto que aparece, ingresa la URL del repositorio de GitHub de tu proyecto.
Nota : asegúrese de apuntar a su bifurcación de la aplicación Hello Hapi para que Jenkins tenga permiso para configurar webhooks.
A continuación, en la sección Desencadenadores de compilación , marque la casilla Desencadenador de gancho de GitHub para sondeo de GITScm :
En la sección Pipeline , debemos indicarle a Jenkins que ejecute el pipeline definido en Jenkinsfilenuestro repositorio. Cambie el tipo de definición a Script de pipeline desde SCM .
En la nueva sección que aparece, seleccione Git en el menú SCM . En el campo URL del repositorio que aparece, ingrese nuevamente la URL de su bifurcación del repositorio:
Nota : Nuevamente, asegúrese de apuntar a su bifurcación de la aplicación Hello Hapi.
Nota : Nuestro ejemplo hace referencia a un Jenkinsfilerecurso disponible dentro de un repositorio público. Si su proyecto no es de acceso público, deberá usar el botón Agregar credenciales para agregar acceso adicional al repositorio. Puede agregar un token de acceso personal como hicimos con la configuración de los ganchos anteriormente.
Cuando haya terminado, haga clic en el botón Guardar en la parte inferior de la página.
Realización de una compilación inicial y configuración de los webhooks
Jenkins no configura automáticamente los webhooks cuando se define la canalización para el repositorio en la interfaz. Para que Jenkins configure los webhooks adecuados, debemos realizar una compilación manual la primera vez.
En la página principal de su canalización, haga clic en Crear ahora en el menú de la izquierda:
Se programará una nueva compilación. En el cuadro Historial de compilación en la esquina inferior izquierda, debería aparecer una nueva compilación en un momento. Además, comenzará a dibujarse una Vista de etapa en el área principal de la interfaz. Esto hará un seguimiento del progreso de la ejecución de la prueba a medida que se completen las diferentes etapas:
En el cuadro Historial de compilación , haga clic en el número asociado con la compilación para ir a la página de detalles de la compilación. Desde aquí, puede hacer clic en el botón Salida de consola en el menú de la izquierda para ver los detalles de los pasos que se ejecutaron:
Cuando haya terminado, haga clic en el elemento Regresar al proyecto en el menú de la izquierda para regresar a la vista principal del proceso.
Ahora que hemos creado el proyecto una vez, podemos hacer que Jenkins cree los webhooks para nuestro proyecto. Haga clic en Configurar en el menú de la izquierda del pipeline:
No es necesario realizar cambios en esta pantalla, solo haga clic en el botón Guardar en la parte inferior. Ahora que Jenkins tiene información sobre el proyecto a partir del proceso de compilación inicial, registrará un webhook con nuestro proyecto de GitHub cuando guarde la página.
Puedes comprobarlo accediendo a tu repositorio de GitHub y haciendo clic en el botón Configuración . En la página siguiente, haz clic en Webhooks en el menú lateral. Deberías ver el webhook de tu servidor Jenkins en la interfaz principal:
Si por alguna razón Jenkins no pudo registrar el gancho (por ejemplo, debido a cambios en la API ascendente o interrupciones entre Jenkins y Github), puede agregar uno rápidamente usted mismo haciendo clic en Agregar webhook y asegurándose de que la URL de carga útil esté configurada en y el Tipo de contenido esté configurado en , luego haga clic en Agregar webhook nuevamente en la parte inferior del mensaje.https://my-jenkins-server:8080/github-webhookapplication/json
Ahora, cuando envíes nuevos cambios a tu repositorio, Jenkins recibirá una notificación. Luego, extraerá el nuevo código y lo volverá a probar utilizando el mismo procedimiento.
Para aproximarse a esto, en nuestra página de repositorio en GitHub, puede hacer clic en el botón Crear nuevo archivo a la izquierda del botón verde Clonar o descargar :
En la página siguiente, elija un nombre de archivo y algún contenido ficticio:
Haga clic en el botón Confirmar nuevo archivo en la parte inferior cuando haya terminado.
Si regresa a su interfaz de Jenkins, verá que se inicia automáticamente una nueva compilación:
Puedes iniciar compilaciones adicionales realizando confirmaciones en una copia local del repositorio y enviándola de regreso a GitHub.
Conclusión
En esta guía, configuramos Jenkins para que observe un proyecto de GitHub y pruebe automáticamente cualquier cambio nuevo que se confirme. Jenkins extrae el código del repositorio y luego ejecuta los procedimientos de compilación y prueba desde contenedores Docker aislados. El código resultante se puede implementar o almacenar agregando instrucciones adicionales al mismo Jenkinsfile.
Para obtener más información sobre GitHub Actions, consulta la documentación de GitHub .