Ejercicio: Creación de un agente de compilación que se ejecuta en Azure

Completado

En esta unidad, para configurar un agente de compilación que pueda usarse en Microsoft Azure Pipelines, se usará una máquina virtual que se ejecute en Microsoft Azure. Proporcionamos una máquina virtual que se puede usar a lo largo de este módulo.

En esta unidad, aprenderá a:

  • Crear una máquina virtual Ubuntu en Azure que actúe como agente de compilación.
  • Crear un grupo de agentes en Microsoft Azure DevOps
  • Crear un token de acceso para autenticar al agente con Azure DevOps.
  • Configurar el agente con el software necesario para compilar el sitio web Space Game
  • Configurar el agente para que se conecte a Azure DevOps a fin de recibir trabajos de compilación.
  • Confirmar que el agente está conectado a Azure DevOps y listo para recibir trabajos de compilación

Hay muchas maneras de crear una máquina virtual en Azure. En esta unidad, creará una máquina virtual Ubuntu con un terminal interactivo llamado Cloud Shell.

Para configurar la máquina virtual, hay varias opciones:

  • En el caso de una máquina virtual Linux, puede conectarse directamente a través de SSH y configurar el sistema de forma interactiva.
  • Para automatizar la implementación, use una plantilla de ARM, Bicep u otra herramienta de aprovisionamiento automatizado.
  • Si necesita implementar muchos agentes de compilación, puede crear una imagen de máquina virtual que tenga todo el software preinstalado.

Configurar un sistema de forma interactiva es una buena manera de empezar, ya que ayuda a comprender el proceso y lo que hace falta. Por simplificar el proceso, conéctese a la máquina virtual Ubuntu a través de SSH y ejecute scripts de shell para configurar el agente de compilación.

Nota:

Si no sabe cómo conectarse o cómo configurar un sistema Linux, simplemente siga los pasos. Puede aplicar los mismos conceptos a los agentes de compilación de Windows.

Creación de una máquina virtual Linux

En esta sección, creará una máquina virtual que ejecuta Ubuntu 20.04 y que actuará como agente de compilación. La máquina virtual aún no está configurada para actuar como agente de compilación ni tiene ninguna de las herramientas necesarias para compilar la aplicación web Space Game. Eso se configurará en breve.

Acceso a Cloud Shell a través de Azure Portal

Importante

Para completar los ejercicios de este módulo, necesita una suscripción de Azure propia.

  1. Abra Azure Portal e inicie sesión.

  2. En el menú, seleccione Cloud Shell. Cuando se le solicite, seleccione la experiencia de Bash.

    A screenshot of the Azure portal showing the location of the Cloud Shell menu item.

    Nota:

    Cloud Shell necesita un recurso de almacenamiento de Azure para conservar los archivos que se creen en Cloud Shell. La primera vez que abra Cloud Shell, se le pedirá que cree un grupo de recursos, una cuenta de almacenamiento y un recurso compartido de Azure Files. Esta configuración se usa automáticamente para todas las sesiones de Cloud Shell futuras.

Selección de una región de Azure

Una región consiste en uno o varios centros de datos de Azure de una ubicación geográfica. Este de EE. UU., Oeste de EE. UU. y Europa del Norte son ejemplos de regiones. A cada recurso de Azure, incluidas las máquinas virtuales de Azure, se le asigna una región.

Para facilitar la ejecución de los comandos, empezaremos seleccionando una región predeterminada. Después de especificar la región predeterminada, los comandos posteriores la usan a menos que especifique otra.

  1. En Cloud Shell, ejecute el siguiente comando az account list-locations para enumerar las regiones que están disponibles en la suscripción de Azure:

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. En la columna Name de la salida, seleccione una región cercana. Por ejemplo, elija eastasia o westus2.

  3. Ejecute az configure para establecer la región predeterminada. Reemplace <REGION> por el nombre de la región que seleccionó:

    az configure --defaults location=<REGION>
    

    En este ejemplo se establece westus2 como la región predeterminada:

    az configure --defaults location=westus2
    

Crear un grupo de recursos

Cree un grupo de recursos para contener los recursos usados en este módulo de formación.

  • Ejecute el siguiente comando az group create para crear un grupo de recursos denominado tailspin-space-game-rg:

    az group create --name tailspin-space-game-rg
    

Creación de la máquina virtual

Para crear la máquina virtual, ejecute el siguiente comando az vm create:

az vm create \
    --name MyLinuxAgent \
    --resource-group tailspin-space-game-rg \
    --image canonical:0001-com-ubuntu-server-focal:20_04-lts:latest \
    --size Standard_DS2_v2 \
    --admin-username azureuser \
    --generate-ssh-keys

La máquina virtual tardará unos minutos en aparecer.

Standard_DS2_v2 especifica el tamaño de la máquina virtual. El tamaño de una máquina virtual define la velocidad de su procesador, la cantidad de memoria, la cantidad inicial de almacenamiento y el ancho de banda de red esperado. Es el mismo tamaño que proporcionan los agentes hospedados por Microsoft. En la práctica, puede elegir un tamaño que proporcione más potencia de proceso o más funcionalidades, como procesamiento de gráficos.

El argumento --resource-group especifica el grupo de recursos que contiene todo lo que hay que crear. Un grupo de recursos permite administrar todas las máquinas virtuales, los discos, las interfaces de red y otros elementos que componen la solución como una unidad.

Crear el grupo de agentes

Recuerde que un grupo de agentes organiza agentes de compilación. En esta sección, creará el grupo de agentes en Azure DevOps. Más adelante se va a especificar el nombre del grupo de agentes al configurar el agente, de modo que se pueda registrar en el grupo correcto.

  1. En Azure DevOps, vaya al proyecto Space Game - web - Agent.

  2. Seleccione Configuración del proyecto.

  3. En Canalizaciones, seleccione Grupos de agentes.

    A screenshot of the project settings in Azure DevOps showing the location of the Agent pools menu item.

  4. Seleccione Agregar grupo.

  5. En la ventana Agregar grupo:

    1. En Pool to link (Grupo que vincular), seleccione Nuevo.
    2. En Pool type (Tipo de grupo), seleccione Autohospedado.
    3. En Nombre, escriba MyAgentPool.

    En la práctica, elegiría un nombre más acorde para el grupo.

  6. Seleccione Crear. El nuevo grupo de agentes aparece en la lista.

Crear un token de acceso personal

Para que el agente de compilación se registre en Azure DevOps, necesita una manera de autenticarse.

A tal efecto, cree un token de acceso personal. Los token de acceso personal, o PAT, son una alternativa a las contraseñas. Un PAT se puede usar para autenticarse en servicios como Azure DevOps.

Importante

Al igual que con una contraseña, asegúrese de conservar el token de acceso en un lugar seguro. En esta sección, almacenará el token de acceso como una variable de entorno para que no aparezca en el script de shell.

  1. En Azure DevOps, abra la configuración de perfil y seleccione Token de acceso personal.

    A screenshot of Azure DevOps showing the location of the Personal access tokens menu item.

  2. Seleccione Nuevo token.

  3. Escriba un nombre para el token, como Agente de compilación.

  4. En Ámbitos, seleccione el vínculo Mostrar todos los ámbitos de la parte inferior.

  5. Busque Grupos de agentes y, después, seleccione Leer y administrar.

  6. Seleccione Crear.

  7. Copie el token en un lugar seguro.

    En breve se va a usar el token para habilitar el agente de compilación a fin de autenticar el acceso a Azure Pipelines.

Conexión a la máquina virtual

En esta sección, se conectará a la máquina virtual Linux a través de SSH para poder configurarla.

Recuerde que no se puede iniciar sesión de forma interactiva en un agente hospedado por Microsoft. Dado que un agente de compilación privado es propio, se puede iniciar sesión y configurarlo del modo que se quiera.

La capacidad de conectar con el agente de compilación permite configurarlo con las herramientas necesarias para compilar el software. También permite solucionar problemas mientras se compila la configuración de la canalización.

  1. Para obtener la dirección IP de la máquina virtual, ejecute az vm show en Cloud Shell:

    IPADDRESS=$(az vm show \
      --name MyLinuxAgent \
      --resource-group tailspin-space-game-rg \
      --show-details \
      --query [publicIps] \
      --output tsv)
    

    Este comando almacena la dirección IP en una variable de Bash denominada IPADDRESS.

  2. Imprima la dirección IP de la máquina virtual en la consola:

    echo $IPADDRESS
    
  3. Cree una conexión SSH a la máquina virtual. En lugar de $IPADDRESS, escriba la dirección IP que recibió en el paso anterior. En la solicitud, indique yes para continuar con la conexión.

    ssh azureuser@$IPADDRESS
    

    Ahora está conectado a la máquina virtual a través de SSH.

    Este comando funciona porque se ha proporcionado la opción --generate-ssh-keys al ejecutar az vm create anteriormente. Esta opción crea un par de claves SSH que permiten iniciar sesión en la máquina virtual.

Instalar herramientas de compilación en la máquina virtual

En esta sección, configurará la máquina virtual con las herramientas necesarias para compilar el sitio web Space Game.

Recuerde que el proceso de compilación existente usa estas herramientas:

  • SDK de .NET, que se usa para compilar la aplicación
  • Node.js, que se usa para realizar tareas de compilación
  • npm, el administrador de paquetes de Node.js.
  • gulp, un paquete de Node.js que se usa para minimizar archivos JavaScript y CSS

Estas son las herramientas principales que se necesitan el proceso de compilación. Para instalarlas, deberá descargar y ejecutar un script de shell desde GitHub.

Nota:

El proceso de compilación usa otras herramientas, como node-sass para convertir archivos Sass (.scss) en archivos CSS (.css). Pero Node.js instala estas herramientas cuando se ejecuta la compilación.

Vamos a empezar actualizando el administrador de paquetes de Ubuntu, denominado apt. Con esta acción se recupera la información más reciente de los repositorios de paquetes, y suele ser lo primero que se hace al configurar un nuevo sistema Ubuntu.

  1. En la conexión SSH, actualice la memoria caché del administrador de paquetes apt:

    sudo apt-get update
    

    sudo ejecuta el comando con privilegios de administrador o raíz.

  2. Ejecute el siguiente comando para descargar un script de shell denominado build-tools.shcurl desde GitHub:

    curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-tools.sh > build-tools.sh
    
  3. Imprima el script en el terminal de forma que pueda examinar el contenido:

    cat build-tools.sh
    

    Se muestra el siguiente resultado:

    #!/bin/bash
    set -e
    
    # Select a default .NET version if one is not specified
    if [ -z "$DOTNET_VERSION" ]; then
      DOTNET_VERSION=6.0.300
    fi
    
    # Add the Node.js PPA so that we can install the latest version
    curl -sL https://deb.nodesource.com/setup_16.x | bash -
    
    # Install Node.js and jq
    apt-get install -y nodejs
    
    apt-get install -y jq
    
    # Install gulp
    npm install -g gulp
    
    # Change ownership of the .npm directory to the sudo (non-root) user
    chown -R $SUDO_USER ~/.npm
    
    # Install .NET as the sudo (non-root) user
    sudo -i -u $SUDO_USER bash << EOF
    curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin -c LTS -v $DOTNET_VERSION
    EOF
    

    El script instala Node.js, npm, gulp y .NET Core.

    Al establecer la variable de entorno DOTNET_VERSION, se puede especificar la versión de .NET que se va a instalar. Si esta variable no se establece, el script instala la versión que use la configuración de compilación existente. Con fines de aprendizaje, no vamos a establecer esta variable, sino que dejaremos que el script use la versión predeterminada.

  4. Haga ejecutable el script y ejecútelo:

    chmod u+x build-tools.sh
    sudo ./build-tools.sh
    

    El script tarda unos minutos en ejecutarse.

    En la práctica, ahora se podrían ejecutar comandos para comprobar que cada componente de software se ha instalado correctamente.

Instalar el software del agente en la máquina virtual

Es hora de instalar el software del agente en la máquina virtual. Este software permite que la máquina virtual actúe como agente de compilación y reciba trabajos de compilación de Azure Pipelines.

El proceso de registro busca software instalado antes de registrar el agente en Azure Pipelines. Por lo tanto, es importante configurar el agente después de instalar el resto del software. En la práctica, puede registrar al agente una segunda vez si necesita instalar software adicional.

La documentación explica cómo configurar agentes de Linux autohospedados y agentes de macOS y Windows de forma manual. Hay que ejecutar un script de shell para configurar el agente de forma muy similar a cuando se configuraron las herramientas de compilación en la sección anterior.

Importante

El script que se va a ejecutar lo hace meramente con fines de aprendizaje. En la práctica, primero hay que saber cómo afecta a todo el sistema cada uno de los comandos de los scripts que compilemos. Al término de este módulo, le recomendaremos documentación donde se describen de forma más completa las posibles opciones.

  1. Ejecute el siguiente comando para descargar un script de shell denominado build-agent.shcurl desde GitHub:

    curl https://raw.githubusercontent.com/MicrosoftDocs/mslearn-tailspin-spacegame-web/main/.agent-tools/build-agent.sh > build-agent.sh
    
  2. Imprima el script en el terminal de forma que pueda examinar el contenido:

    cat build-agent.sh
    

    Se muestra el siguiente resultado:

    #!/bin/bash
    set -e
    
    # Select a default agent version if one is not specified
    if [ -z "$AZP_AGENT_VERSION" ]; then
      AZP_AGENT_VERSION=2.187.2
    fi
    
    # Verify Azure Pipelines token is set
    if [ -z "$AZP_TOKEN" ]; then
      echo 1>&2 "error: missing AZP_TOKEN environment variable"
      exit 1
    fi
    
    # Verify Azure DevOps URL is set
    if [ -z "$AZP_URL" ]; then
      echo 1>&2 "error: missing AZP_URL environment variable"
      exit 1
    fi
    
    # If a working directory was specified, create that directory
    if [ -n "$AZP_WORK" ]; then
      mkdir -p "$AZP_WORK"
    fi
    
    # Create the Downloads directory under the user's home directory
    if [ -n "$HOME/Downloads" ]; then
      mkdir -p "$HOME/Downloads"
    fi
    
    # Download the agent package
    curl https://vstsagentpackage.azureedge.net/agent/$AZP_AGENT_VERSION/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz > $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz
    
    # Create the working directory for the agent service to run jobs under
    if [ -n "$AZP_WORK" ]; then
      mkdir -p "$AZP_WORK"
    fi
    
    # Create a working directory to extract the agent package to
    mkdir -p $HOME/azp/agent
    
    # Move to the working directory
    cd $HOME/azp/agent
    
    # Extract the agent package to the working directory
    tar zxvf $HOME/Downloads/vsts-agent-linux-x64-$AZP_AGENT_VERSION.tar.gz
    
    # Install the agent software
    ./bin/installdependencies.sh
    
    # Configure the agent as the sudo (non-root) user
    chown $SUDO_USER $HOME/azp/agent
    sudo -u $SUDO_USER ./config.sh --unattended \
      --agent "${AZP_AGENT_NAME:-$(hostname)}" \
      --url "$AZP_URL" \
      --auth PAT \
      --token "$AZP_TOKEN" \
      --pool "${AZP_POOL:-Default}" \
      --work "${AZP_WORK:-_work}" \
      --replace \
      --acceptTeeEula
    
    # Install and start the agent service
    ./svc.sh install
    ./svc.sh start
    

    No es necesario saber cómo funciona cada línea, pero este es un breve resumen de lo que hace este script:

    • Descarga el paquete del agente como un archivo .tar.gz y extrae su contenido.
    • En los archivos extraídos, el script hace lo siguiente:
      • Ejecuta un script de shell denominado installdependencies.sh para instalar el software del agente.
      • Ejecuta un script de shell denominado config.sh para configurar el agente y registrarlo en Azure Pipelines.
      • Ejecuta un script de shell denominado svc.sh para instalar e iniciar el servicio del agente.

    El script usa variables de entorno para que pueda proporcionar detalles sobre la organización de Azure DevOps. A continuación, se muestra un resumen:

    Variable de Bash Descripción Valor predeterminado
    AZP_AGENT_VERSION Versión del software del agente que se va a instalar Versión que se ha usado por última vez para probar este módulo
    AZP_URL Dirección URL de la organización de Azure DevOps (Ninguna)
    AZP_TOKEN Token de acceso personal (Ninguna)
    AZP_AGENT_NAME Nombre del agente tal como aparece en Azure DevOps Nombre de host del sistema
    AZP_POOL Nombre del grupo de agentes Predeterminado
    AZP_WORK Directorio de trabajo del agente para realizar tareas de compilación _work

    Si el script no proporciona un valor predeterminado para una variable que no se ha establecido, imprime un mensaje de error y sale inmediatamente.

    En los siguientes pasos, establezca estas variables de entorno:

    • AZP_AGENT_VERSION
    • AZP_URL
    • AZP_TOKEN
    • AZP_AGENT_NAME
    • AZP_POOL

    Por ahora, se recomienda dejar las demás variables sin establecer.

  3. Establezca la variable de entorno AZP_AGENT_NAME para especificar el nombre del agente. Se recomienda MyLinuxAgent.

    export AZP_AGENT_NAME=MyLinuxAgent
    
  4. Establezca la variable de entorno AZP_URL para especificar la dirección URL de la organización de Azure DevOps.

    Reemplace <organization> por la suya. Puede obtener el nombre en la pestaña del explorador que muestra Azure DevOps.

    export AZP_URL=https://dev.azure.com/organization
    
  5. Establezca la variable de entorno AZP_TOKEN para especificar el token de acceso personal (el valor de token largo que copió anteriormente en esta unidad).

    Reemplace <token> por el token.

    export AZP_TOKEN=token
    
  6. Establezca la variable de entorno AZP_POOL para especificar el nombre del grupo de agentes. Anteriormente ha creado un grupo denominado MyAgentPool.

    export AZP_POOL=MyAgentPool
    
  7. Establezca la variable de entorno AZP_AGENT_VERSION para especificar la versión más reciente del agente.

    export AZP_AGENT_VERSION=$(curl -s https://api.github.com/repos/microsoft/azure-pipelines-agent/releases | jq -r '.[0].tag_name' | cut -d "v" -f 2)
    

    Una canalización de YAML en una máquina Linux debe usar la versión más reciente del agente, aun cuando se encuentre en versión preliminar. El software del agente se actualiza constantemente, por lo que se debe aplicar curl a la información de versión en el repositorio de GitHub. El comando usa jq para leer la versión más reciente de la cadena JSON que se devuelve.

  8. Imprima la versión del agente en la consola. Si lo desea, consulte aquí para asegurarse de que es la versión más reciente.

    echo $AZP_AGENT_VERSION
    
  9. Haga ejecutable el script y, a continuación, ejecútelo:

    chmod u+x build-agent.sh
    sudo -E ./build-agent.sh
    

    sudo permite que el script se ejecute como usuario raíz. El argumento -E conserva las variables de entorno actuales, incluidas las que ha establecido, para que estén disponibles para el script.

    Mientras el script se ejecuta, se ve cómo el agente se conecta a Azure DevOps, cómo se ha agregado al grupo de agentes y cómo se ha probado la conexión del agente.

Comprobación de que el agente se está ejecutando

Ha instalado correctamente las herramientas de compilación y el software del agente en la máquina virtual. Como paso de verificación, vaya a Azure DevOps y compruebe que el agente está en el grupo de agentes.

  1. En Azure DevOps, vaya al proyecto Space Game - web - Agent.

  2. Seleccione Configuración del proyecto.

  3. En Canalizaciones, seleccione Grupos de agentes.

  4. Seleccione MyAgentPool.

  5. Seleccione la pestaña Agentes.

    Como se puede ver, el agente está en línea y listo para aceptar trabajos de compilación.

    A screenshot of Azure DevOps showing the status of the private agent. The agent shows as online, idle, and enabled.

    Sugerencia

    Si el agente de compilación se muestra como Sin conexión, espere unos momentos y luego actualice la página.

  6. Seleccione el agente, MyLinuxAgent.

  7. Seleccione la pestaña Funcionalidades.

    Durante la configuración, el proceso de configuración ha examinado el agente de compilación en busca de capacidades de herramientas. Se ve que npm aparece como una de ellas. Recuerde que en la configuración de compilación original se ha especificado que npm debe estar instalado en el agente.

    A screenshot of Azure DevOps showing a few of the agent's capabilities. The npm capability is highlighted.

    Al especificar qué grupo de agentes se va a usar, puede incluir cualquiera de estas entradas en la sección demands. Al incluirlas, se garantiza que Azure Pipelines va a elegir un agente de compilación con el software necesario para compilar la aplicación. También permite crear grupos de agentes con varias configuraciones de software. Azure Pipelines seleccionará la configuración correcta en función de los requisitos existentes.