Agentes autohospedados en Azure DevOps
Por Rafael Muñoz • 8 de julio de 2022 • 8 min de lectura
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.
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.
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:
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:
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:
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