Agentes autohospedados en Azure DevOps

Por Rafael Muñoz • 8 de julio de 2022 • 8 min de lectura

Imagen de portada del artículo sobre agentes autohospedados en Azure DevOps

Motivación

En este artículo quiero trasmitir algunos conocimiento que he conseguido creando un agente autohospedado de AzureDevOps. Concretamente, me centraré en cómo crear un agente autohospedado utilizando docker y cómo utilizar Azure para ejecutarlo.

La motivación que me ha llevado a crear un agente autohospedado ha sido utilizar uno con acceso a recursos situados en una red virtual / on-premise, ya que el hospedado por Microsoft no me permitía acceder a dichos recursos.

He creado un repositorio con lo necesario para seguir este artículo y poder implementar dicho agente de forma rápida.

Introducción

Antes de nada empecemos por lo básico, ¿Qué es un agente? Un agente es la infraestructura informática con software que permite ejecutar trabajos desde Azure Pipelines, permitiendo el despliegue y desarrollo continuo.

Por tanto, si en nuestro proyecto vamos a utilizar despliegue y desarrollo continuo utilizando Azure es importante conocerlos y utilizarlos.

Tipos de Agentes de Azure Pipelines

Tenemos varios tipos de agentes, entre los cuales destacan los autohospedados y los hospedados por Microsoft, aportando diferentes ventajas:

Los agentes hospedados por Microsoft:

  • Las actualizaciones y el mantenimiento se realizan automáticamente.
  • Cada vez que se ejecuta una canalización se obtiene una máquina virtual nueva.

Los agentes autohospedados:

  • El agente es completamente configurado por el usuario, lo cual permite tener instalado el software deseado y que no sea necesario ejecutar instalaciones de software en cada ejecución del agente.
  • Se puede ejecutar en cualquier máquina y arquitectura, por lo que podemos implementarlo en una red interna o virtual y tener acceso a recursos que no tendríamos desde una red pública.
  • Los cachés, a nivel de máquina y configuración, persisten de una ejecución a otra, por lo que puede aumentar la velocidad de las tareas.

Guía para crear un agente autohospedado utilizando docker

Crear un token de acceso personal

Es necesario un token de acceso personal con permisos de lectura y gestión para los pools de agentes y permisos de lectura para el registro de auditoría, el cual se utilizará en el dockerfile para especificarlo como una variable de entorno.

Agente ejecutándose y esperando tareas de Azure DevOps
ENV AZP_TOKEN={your_personal_access_token}

Configurar DockerFile

En este paso es necesario modificar las variables de entorno del dockerfile del repositorio, lo que permite que funcione correctamente con el proyecto que vayamos a utilizar.

ENV AZP_URL=https://dev.azure.com/{replace_by_your_organization}
ENV AZP_TOKEN={your_personal_access_token}
ENV AZP_AGENT_NAME={name_wanted_as_your_dockeragentname}

Construir y ejecutar una imagen en el entorno local

Tras realizar estas configuraciones, somos capaces de ejecutar el agente en nuestra máquina local utilizando docker, solo necesitamos construir la imagen y ejecutarla:

docker build --tag dockeragent:latest  .
docker run dockeragent:latest

Una vez ejecutado el comando, vemos que el agente ya está ejecutándose y esperando a que alguna tarea de Azure DevOps lo utilice.

Claves de acceso de Azure Container Registry

Desplegando una imagen en Azure Container Registry

Una vez que nuestro agente es capaz de ejecutarse en local, podemos ejecutarlo en Azure publicando la imagen en Azure Container Registry. Posteriormente, podemos ejecutar una instancia de Azure Container Instance con el contenido de la imagen.

Para hacerlo, tras crear un Azure Container Registry, necesitaremos las claves de acceso al mismo:

Conexión a Azure Container Registry en Azure DevOps

Con estas claves, podremos ejecutar los siguientes comandos:

#Iniciar sesión en nuestro Azure Container Registry con los access keys
az acr login --name {acr_name} --username {AccessKey_username} --password {AccessKey_Password}

# Tagear nuestra imagen de docker creada anteriormente para que apunte al container registry
docker tag dockeragent:latest {acr_name}.azurecr.io/dockeragent:latest

docker push {acr_name}.azurecr.io/dockeragent:latest

Utilizando una imagen de Azure Container Registry para crear una instancia de Azure Container Instance

Ahora podemos crear una instancia de la imagen en un contenedor, de forma que habremos conseguido ejecutar el agente en la nube.

Para ello, podemos hacerlo a través del portal o ejecutando el siguiente comando:

az container create --resource-group {resourcegroup} --name {container_name} --image azurecontainerinstancesample.azurecr.io/dockeragent:latest --os-type Linux --cpu 1 --memory 1.5 --restart-policy OnFailure

Despliegue y desarrollo continuo del repositorio del agente autohospedado

Para automatizar todo el proceso, podemos utilizar pipelines de Azure DevOps e implementar CICD.

El primer paso que debemos realizar es crear una conexión a nuestro Azure Container Registry desde nuestro proyecto de Azure DevOps:

Configuración del servicio de conexión Configuración del pool en release pipelines Configuración del servicio de conexión

Una vez creado, podemos indicar que cuando un cambio ocurra en nuestra rama main, una tarea de construcción y subida de imagen al Azure Container Registry, que acabamos de vincular, se ejecute indicándolo en el azure-pipelines.yml del repositorio.

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
- task: Docker@2
  inputs:
    containerRegistry: '{containerRegistry}'
    repository: 'dockeragent'
    command: 'buildAndPush'
    Dockerfile: '**/Dockerfile'

Utilizando el nuevo agente en Azure DevOps

Tras crear y tener ejecutando el agente de Azure DevOps, solo nos faltaría indicar como utilizarlo en nuestros proyectos, teniendo en cuenta que éstos varían dependiendo de si lo vamos a utilizar en los build pipelines o en los release pipelines.

Configurando build pipelines para utilizar el nuevo agente

Solamente debemos cambiar la parte de azure-pipelines.yml donde se establece el pool, indicando que utilizaremos el pool Default (si no se indica se utiliza el de Microsoft).

Adicionalmente, podemos añadir condiciones que tiene que cumplir el agente para que se ejecute la tarea.

pool
  name: Default
  demands:
    - Agent.Name -equals dockeragent #Optional:

Configurando release pipelines para utilizar el nuevo agente

Para utilizar el nuevo agente en las pipelines de release, solamente debemos cambiar el pool del agente como se muestra en la imagen:

Configuración del pool en release pipelines

Conclusiones

Me gustaría que este artículo proporcione algo de visibilidad a los agentes de Azure DevOps tras haber visto:

  • Qué es un agente de Azure DevOps.
  • Ventajas de los tipos de agentes de Azure DevOps.
  • Cómo crear un agente autohospedado de Azure DevOps con docker.
  • Cómo configurar otros proyectos que quieran utilizar CICD con otro agente diferente al que existe por defecto.

¿Necesitas configurar agentes en Azure DevOps?

Te ayudamos a implementar agentes autohospedados y optimizar tus pipelines de CI/CD para un mejor rendimiento y acceso a recursos específicos.

Consultar servicios Azure DevOps