Tutorial: Automatización de las compilaciones de imágenes de contenedor en la nube al confirmar código fuente

Además de tareas rápidas, ACR Tasks admite compilaciones de imágenes de contenedor Docker automatizadas en la nube al confirmar el código fuente en un repositorio de Git. Los contextos de Git admitidos para ACR Tasks incluyen GitHub público o privado y Azure Repos.

Nota

Actualmente, ACR Tasks no admite desencadenadores de solicitud de confirmación o de extracción en repositorios de GitHub Enterprise.

En este tutorial, la tarea ACR compila e inserta una única imagen de contenedor especificada en un archivo Dockerfile cuando confirma el código fuente en un repositorio de Git. Para crear una tarea de varios pasos que use un archivo YAML para definir los pasos para compilar, insertar y, opcionalmente, probar varios contenedores durante la confirmación del código, consulte el Tutorial: Ejecución de un flujo de trabajo de contenedor de varios pasos en la nube al confirmar el código fuente. Para información general sobre ACR Tasks, consulte Automatización de la aplicación de revisiones de sistema operativo y plataforma con ACR Tasks.

En este tutorial, aprenderá a:

  • Crea una tarea.
  • Prueba de la tarea
  • Visualización del estado de la tarea
  • Desencadenamiento de la tarea con una confirmación de código

En este tutorial se da por hecho que ya ha realizado los pasos de los tutoriales anteriores. Si aún no lo ha hecho, complete los pasos de la sección Requisitos previos del tutorial anterior antes de continuar.

Requisitos previos

Obtención de código de ejemplo

En este tutorial se da por hecho que ya ha realizado los pasos de los tutoriales anteriores y que ha bifurcado y clonado el repositorio de ejemplo. Si aún no lo ha hecho, complete los pasos de la sección Requisitos previos del tutorial anterior antes de continuar.

Registro de contenedor

Debe tener un registro de contenedor de Azure en la suscripción de Azure para completar este tutorial. Si necesita un registro, consulte el tutorial anterior o esta guía de inicio rápido: Creación de un registro de contenedor con la CLI de Azure.

Creación de un token de acceso personal de GitHub

Para desencadenar una tarea en una confirmación en un repositorio GIT, ACR Tasks necesita un token de acceso personal (PAT) para acceder al repositorio. Si aún no dispone de un PAT, siga estos pasos para generar uno en GitHub:

  1. Vaya a la página de creación del token de acceso personal en GitHub en https://github.com/settings/tokens/new

  2. Escriba una breve descripción para el token, por ejemplo, "ACR Tasks Demo"

  3. Seleccione los ámbitos de ACR para acceder al repositorio. Para acceder a un repositorio público como en este tutorial, en repo, habilite repo:status y public_repo

    Captura de pantalla de la página de generación de un token de acceso personal en GitHub

    Nota

    Para generar un PAT y acceder a un repositorio privado, seleccione el ámbito para el control total del repositorio.

  4. Seleccione el botón Generar token (puede que se le pida que confirme la contraseña)

  5. Copie y guarde el token generado en una ubicación segura (usará este token cuando defina una tarea en la siguiente sección)

    Captura de pantalla del token de acceso personal que se generó en GitHub

Preparación del entorno para la CLI de Azure

Creación de la tarea de compilación

Ahora que ha completado los pasos necesarios para habilitar ACR Tasks para que lea el estado de confirmación y cree webhooks en un repositorio, puede crear una tarea que desencadene una compilación de imagen de contenedor después de las confirmaciones en el repositorio.

Primero, rellene estas variables de entorno de shell con valores adecuados para el entorno. Este paso no es estrictamente necesario, pero hace que la ejecución de los comandos de varias líneas de la CLI de Azure en este tutorial sea un poco más fácil. Si no rellena estas variables de entorno, debe reemplazar manualmente cada valor siempre que aparezca en los comandos de ejemplo.

ACR_NAME=<registry-name>        # The name of your Azure container registry
GIT_USER=<github-username>      # Your GitHub user account name
GIT_PAT=<personal-access-token> # The PAT you generated in the previous section

Ahora, cree la tarea mediante la ejecución del siguiente comando az acr task create.

Nota

El Dockerfile usado en el ejemplo siguiente depende de una imagen de contenedor de base pública de Docker Hub. Para mejorar la confiabilidad al usar contenido público, importe y administre la imagen en un registro de contenedor privado de Azure y actualice el Dockerfile para usar la imagen base administrada de forma privada. Más información sobre cómo trabajar con imágenes públicas.

az acr task create \
    --registry $ACR_NAME \
    --name taskhelloworld \
    --image helloworld:{{.Run.ID}} \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#master \
    --file Dockerfile \
    --git-access-token $GIT_PAT

Esta tarea determina que siempre que se confirme código en la rama maestra del repositorio especificado por --context, ACR Tasks compilará la imagen de contenedor desde el código de esa rama. La instancia de Dockerfile que especifica --file en la raíz del repositorio se usa para compilar la imagen. El argumento --image especifica un valor parametrizado de {{.Run.ID}} para la porción de la versión de la etiqueta de la imagen, lo que garantiza que la imagen compilada es correlativa a una compilación específica y que está etiquetada de forma exclusiva.

La salida de un comando az acr task create que se ha ejecutado correctamente debe ser parecida a la siguiente:

{
  "agentConfiguration": {
    "cpu": 2
  },
  "creationDate": "2010-11-19T22:42:32.972298+00:00",
  "id": "/subscriptions/<Subscription ID>/resourceGroups/myregistry/providers/Microsoft.ContainerRegistry/registries/myregistry/tasks/taskhelloworld",
  "location": "westcentralus",
  "name": "taskhelloworld",
  "platform": {
    "architecture": "amd64",
    "os": "Linux",
    "variant": null
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "myregistry",
  "status": "Enabled",
  "step": {
    "arguments": [],
    "baseImageDependencies": null,
    "contextPath": "https://github.com/gituser/acr-build-helloworld-node#main",
    "dockerFilePath": "Dockerfile",
    "imageNames": [
      "helloworld:{{.Run.ID}}"
    ],
    "isPushEnabled": true,
    "noCache": false,
    "type": "Docker"
  },
  "tags": null,
  "timeout": 3600,
  "trigger": {
    "baseImageTrigger": {
      "baseImageTriggerType": "Runtime",
      "name": "defaultBaseimageTriggerName",
      "status": "Enabled"
    },
    "sourceTriggers": [
      {
        "name": "defaultSourceTriggerName",
        "sourceRepository": {
          "branch": "main",
          "repositoryUrl": "https://github.com/gituser/acr-build-helloworld-node#main",
          "sourceControlAuthProperties": null,
          "sourceControlType": "GitHub"
        },
        "sourceTriggerEvents": [
          "commit"
        ],
        "status": "Enabled"
      }
    ]
  },
  "type": "Microsoft.ContainerRegistry/registries/tasks"
}

Comprobación de la tarea de compilación

Ahora tiene una tarea que define la compilación. Para probar la canalización de compilación, desencadene una compilación manualmente mediante la ejecución del comando az acr task run:

az acr task run --registry $ACR_NAME --name taskhelloworld

De forma predeterminada, el comando az acr task run hace streaming de la salida del registro a la consola cuando se ejecuta el comando. La salida está condensada para mostrar los pasos principales.

2020/11/19 22:51:00 Using acb_vol_9ee1f28c-4fd4-43c8-a651-f0ed027bbf0e as the home volume
2020/11/19 22:51:00 Setting up Docker configuration...
2020/11/19 22:51:02 Successfully set up Docker configuration
2020/11/19 22:51:02 Logging in to registry: myregistry.azurecr.io
2020/11/19 22:51:03 Successfully logged in
2020/11/19 22:51:03 Executing step: build
2020/11/19 22:51:03 Obtaining source code and scanning for dependencies...
2020/11/19 22:51:05 Successfully obtained source code and scanned for dependencies
Sending build context to Docker daemon  23.04kB
Step 1/5 : FROM node:15-alpine
[...]
Step 5/5 : CMD ["node", "/src/server.js"]
 ---> Running in 7382eea2a56a
Removing intermediate container 7382eea2a56a
 ---> e33cd684027b
Successfully built e33cd684027b
Successfully tagged myregistry.azurecr.io/helloworld:da2
2020/11/19 22:51:11 Executing step: push
2020/11/19 22:51:11 Pushing image: myregistry.azurecr.io/helloworld:da2, attempt 1
The push refers to repository [myregistry.azurecr.io/helloworld]
4a853682c993: Preparing
[...]
4a853682c993: Pushed
[...]
da2: digest: sha256:c24e62fd848544a5a87f06ea60109dbef9624d03b1124bfe03e1d2c11fd62419 size: 1366
2020/11/19 22:51:21 Successfully pushed image: myregistry.azurecr.io/helloworld:da2
2020/11/19 22:51:21 Step id: build marked as successful (elapsed time in seconds: 7.198937)
2020/11/19 22:51:21 Populating digests for step id: build...
2020/11/19 22:51:22 Successfully populated digests for step id: build
2020/11/19 22:51:22 Step id: push marked as successful (elapsed time in seconds: 10.180456)
The following dependencies were found:
- image:
    registry: myregistry.azurecr.io
    repository: helloworld
    tag: da2
    digest: sha256:c24e62fd848544a5a87f06ea60109dbef9624d03b1124bfe03e1d2c11fd62419
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 9-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git:
    git-head-revision: 68cdf2a37cdae0873b8e2f1c4d80ca60541029bf


Run ID: ca6 was successful after 27s

Desencadenamiento de una compilación con una confirmación

Ahora que ha probado la tarea ejecutándola manualmente, desencadénela automáticamente con un cambio en el código fuente.

En primer lugar, asegúrese de que se encuentra en el directorio que contiene el clon local del repositorio:

cd acr-build-helloworld-node

A continuación, ejecute los siguientes comandos para crear, confirmar e insertar un nuevo archivo en la bifurcación del repositorio en GitHub:

echo "Hello World!" > hello.txt
git add hello.txt
git commit -m "Testing ACR Tasks"
git push origin main

Se le pedirá que proporcione sus credenciales de GitHub cuando ejecute el comando git push. Proporcione el nombre de usuario de GitHub y escriba el token de acceso personal (PAT) que creó anteriormente para la contraseña.

Username for 'https://github.com': <github-username>
Password for 'https://githubuser@github.com': <personal-access-token>

Una vez que ha insertado una confirmación en el repositorio, el webhook que creó ACR Tasks activa e inicia una compilación en Azure Container Registry. Muestre los registros de la tarea que se está ejecutando actualmente para comprobar y supervisar el progreso de la compilación:

az acr task logs --registry $ACR_NAME

La salida es parecida a la siguiente, que muestra la tarea que se está ejecutando actualmente (o la última que se ejecutó):

Showing logs of the last created run.
Run ID: ca7

[...]

Run ID: ca7 was successful after 38s

Lista de compilaciones

Para ver una lista de las tareas que ACR Tasks ha completado para el registro, ejecute el comando az acr task list-runs:

az acr task list-runs --registry $ACR_NAME --output table

La salida del comando debe ser parecida a la siguiente. Se muestran las ejecuciones que ha ejecutado ACR Tasks y aparece "Confirmación de Git" en la columna DESENCADENADOR de la tarea más reciente:

RUN ID    TASK            PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------------  ----------  ---------  ---------  --------------------  ----------
ca7       taskhelloworld  linux       Succeeded  Commit     2020-11-19T22:54:34Z  00:00:29
ca6       taskhelloworld  linux       Succeeded  Manual     2020-11-19T22:51:47Z  00:00:24
ca5                       linux       Succeeded  Manual     2020-11-19T22:23:42Z  00:00:23

Pasos siguientes

En este tutorial ha aprendido a usar una tarea que desencadena automáticamente compilaciones de imágenes de contenedor en Azure cuando confirma código fuente en un repositorio Git. Pase al siguiente tutorial para aprender a crear tareas que desencadenan compilaciones cuando se actualiza la imagen base de la imagen de contenedor.