Crear agentes dinámicos de Jenkins en Microsoft Azure

¿Sabías que puedes desplegar tus agentes de Jenkins de manera dinámica en Microsoft Azure? Si estás a gusto trabajando con esta herramienta aún así puedes aprovecharte de Microsoft Azure de forma súper sencilla. En este artículo te cuento cómo.

Plugins

Dependiendo del tipo de agente que quieras utilizar (maquinas virtuales, Azure Container Instances o Azure Kubernetes Services), tienes dos plugins que puedes utilizar para facilitarte el trabajo:

Ambos puedes instalarlos desde la sección Plugin Manager de Jenkins. En este artículo te cuento cómo montarlo en ACI a modo de ejemplo.

Configuración

La configuración es bastante sencilla y una vez hecha se crearán los recursos bajo demanda, es decir cuando lances una build que los requiera. Accede al apartado Manage Jenkins y dentro de él selecciona Configure System.

Jenkins – Manage Jenkins – Configure System

Una vez allí localiza la sección Cloud y haz clic en el botón Add a new cloud. Si tienes los plugins instalados verás que te aparecen las tres opciones.

Configure System – Cloud – Add a new cloud

Para este ejemplo voy a elegir la primera opción: Azure Container Instance.

La configuración es bastante sencilla: de manera automática el nombre del cloud es Aci (que puedes cambiar si no te gusta). Después debes elegir o crear una configuración con las credenciales de Azure. Esto significa que necesitas un service principal dentro de Azure Active Directory con los permisos suficientes para gestionar recursos dentro de tu suscripción. La manera más sencilla de crear este objeto dentro de Azure AD es a través del siguiente comando con Azure CLI:

az login
az ad sp create-for-rbac --name Jenkins

El resultado de este comando te devolverá todo lo que necesitas para crear una configuración de credenciales a través del botón Add, al lado de Azure Credentials, donde debes elegir la opción Microsoft Azure Service Principal.

  • Suscription ID: el ID de la suscripción donde has otorgado los permisos. Si bien no se devuelve dento del JSON de la creación del service principal, te aparece un poco más arriba, en la cadena Creating a role assignment under the scope of “/subscriptions/ESTE_ES_TU_SUSBSCRIPTION_ID
  • Client ID: se corresponde con el valor que te ha devuelto en la consola para la propiedad appId.
  • Client Secret: es el valor de password.
  • Tenant ID: el id que se corresponde con el valor de la propiedad tenant.

En esa misma ventana, un poco más abajo, tienes un botón llamado Verify Service Principal que te ayudará a comprobar que todo esta OK. Te aconsejo que añadas un nombre identificativo en el campo Description, para que sepas a qué suscripción pertenecen estas credentiales. Una vez guardados los cambios ya puedes seleccionarlas en el combo.

El último paso de la configuración de nuestros futuros agentes es seleccionar un resource group donde irán alojados los contenedores que se creen bajo demanda por Jenkins. Yo he creado uno llamado resources-for-jenkins 🙂 En el combo Add container template selecciona la única plantilla que hay, Aci container template.

Diría que el punto más importante de toda la configuración es la configuración del campo Labels, ya que este será el que nos permita indicar en una build que necesitamos este tipo de agente. En este caso he puesto el valor linux, pero podía ser cualquier otro. Haz clic en Save para guardar los cambios.

Probando los agentes en ACI

Lo único que te queda es probar que al crear una build que requiera este tipo de agente Jenkins se encargará de crear y eliminar un contenedor en ACI. Para ello, haz clic en el apartado New Item y crea un proyecto nuevo (Freestyle project) con el nombre aci-test.

Como solo vamos a probar que todo funciona correctamente solo debes añadir la label linux en el apartado General > Label Expression.

Y en el apartado Build añade un build step del tipo Execute shell con algo parecido a lo siguiente:

Guarda los cambios y haz clic en Build now para encolar una nueva build.

Al encolar una nueva build el agente comienza a crearse en Azure

Verás que el proceso queda pendiente hasta que Jenkins cree un nuevo contenedor en Microsoft Azure, en el grupo de recursos que seleccionaste:

Un nuevo recurso aparece en resource-for-jenkins para la build

Cuando la build finalice, podrás ver en la sección Console Output el resultado ejecutado en el contenedor en ACI.

Así mismo, comprobarás que el recurso se habrá eliminado de manera automática por Jenkins.

¡Saludos!