Руководство по Запуск многошагового рабочего процесса в облаке при фиксации исходного кода

Помимо быстрых задач, решение "Задачи ACR" поддерживает многошаговые рабочие процессы для нескольких контейнеров, которые могут выполняться автоматически при фиксации исходного кода в репозитории Git.

Из этого руководства вы узнаете, как на основе примеров файлов YAML определить многошаговые задачи, которые компилируют, запускают и отправляют в реестр один или несколько образов контейнеров при фиксации исходного кода. Чтобы создать задачу, которая автоматизирует только сборку одного образа при фиксации кода, воспользуйтесь руководством Автоматизация создания образов контейнеров в облаке при фиксации исходного кода. Обзор решения "Задачи ACR" см. в статье Automate OS and framework patching with ACR Tasks (Автоматизация установки исправлений для ОС и платформы с помощью решения "Задачи ACR").

В этом руководстве рассматриваются следующие темы:

  • определение многошаговой задачи с помощью файла YAML;
  • Создание задачи
  • (необязательно) добавление к задаче учетных данных для доступа к другому реестру;
  • Тестирование задачи
  • Представление состояния задачи
  • Активация задачи с помощью фиксации кода

В этом руководстве предполагается, что вы уже выполнили шаги в предыдущем руководстве. Если вы еще этого не сделали, выполните действия, описанные в разделе Предварительные требования в предыдущем руководстве, прежде чем перед продолжить.

Предварительные требования

Получение примера кода

В этом руководстве предполагается, что вы уже выполнили шаги в предыдущем руководстве, создали вилку и клонировали пример репозитория. Если вы еще этого не сделали, выполните действия, описанные в разделе Предварительные требования в предыдущем руководстве, прежде чем перед продолжить.

Реестр контейнеров

Для выполнения заданий данного руководства необходимо иметь реестр контейнеров Azure в подписке Azure. Если вам нужен реестр, см. сведения в предыдущем руководстве или в статье Краткое руководство. Создание реестра контейнеров с использованием Azure CLI.

Создание личного маркера доступа GitHub

Чтобы инициировать задачу при фиксации кода в репозитории Git, решению "Задачи ACR" требуется личный маркер доступа (PAT) для доступа к репозиторию. Если у вас еще нет личного маркера доступа, выполните следующие действия, чтобы создать его на GitHub.

  1. Перейдите на страницу создания PAT на GitHub по адресу https://github.com/settings/tokens/new.

  2. Введите краткое описание маркера, например "ACR Task Demo".

  3. Выберите области для ACR, чтобы получить доступ к репозиторию. Для доступа к общедоступному репозиторию, как в этом учебнике, в разделе repo включите repo:status и public_repo

    Снимок экрана со страницей создания личного маркера доступа GitHub

    Примечание

    Чтобы создать личный маркер доступа для доступа к репозиторию private, выберите область для полного контроля репозитория.

  4. Нажмите кнопку Generate token (Создать маркер) (может появиться запрос на подтверждение пароля).

  5. Скопируйте и сохраните созданный маркер в защищенном расположении (вы используете этот маркер при определении задачи в следующем разделе).

    Снимок экрана созданного личного маркера доступа на GitHub

Подготовка среды к работе с Azure CLI

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см. в статье Краткое руководство по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в разделе Запуск Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, приведены в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

Создание многошаговой задачи

Теперь, когда вы выполнили шаги, которые позволяют решению "Задачи ACR" получать данные о состоянии фиксации и создавать веб-перехватчики в репозитории, переходите к созданию многошаговой задачи, которая запускает сборку, выполнение и отправку образа контейнера.

Файл YAML

Шаги для многошаговой задачи определяются в YAML-файле. Первый пример многошаговой задачи для этого руководства определен в файле taskmulti.yaml, который размещен в корне клонированного ранее репозитория GitHub:

version: v1.1.0
steps:
# Build target image
- build: -t {{.Run.Registry}}/hello-world:{{.Run.ID}} -f Dockerfile .
# Run image 
- cmd: -t {{.Run.Registry}}/hello-world:{{.Run.ID}}
  id: test
  detach: true
  ports: ["8080:80"]
- cmd: docker stop test
# Push image
- push:
  - {{.Run.Registry}}/hello-world:{{.Run.ID}}

Эта многошаговая задача выполняет следующие действия:

  1. Выполняет шаг build для сборки образа из файла Dockerfile в рабочем каталоге. Этот образ предназначен для реестра Run.Registry, в котором запускается задача, и ему присваивается тег с уникальным идентификатором выполнения, созданным решением "Задачи ACR".
  2. Выполняет шаг cmd для запуска образа во временном контейнере. Этот пример запускает длительно выполняющийся контейнер в фоновом режиме и возвращает идентификатор этого контейнера, а затем останавливает контейнер. Реальный сценарий может включать шаги для тестирования запущенного контейнера, которые позволяют проверить правильность его работы.
  3. На шаге push отправляет скомпилированный образ в реестр выполнения.

Командная строка задачи

Сначала заполните эти переменные среды оболочки значениями, подходящими для вашей среды. Этот шаг не является обязательным, но он упрощает выполнение многолинейных команд Azure CLI в этом руководстве. Если вы не заполните эти переменные среды, вам придется вручную заменять каждое значение в примерах команд.

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

Теперь создайте задачу, выполнив следующую команду az acr task create:

az acr task create \
    --registry $ACR_NAME \
    --name example1 \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file taskmulti.yaml \
    --git-access-token $GIT_PAT

Эта задача указывает, что каждый раз при фиксации кода в главной ветви репозитория, указанной в --context, решение "Задачи ACR" выполняет многошаговую задачу из кода в этой ветви. Шаги этой задачи определяются в YAML-файле --file, расположенном в корне репозитория.

Выходные данные успешно выполненной команды az acr task create имеют следующий вид:

{
  "agentConfiguration": {
    "cpu": 2
  },
  "creationDate": "2020-11-20T03:14:31.763887+00:00",
  "credentials": null,
  "id": "/subscriptions/<Subscription ID>/resourceGroups/myregistry/providers/Microsoft.ContainerRegistry/registries/myregistry/tasks/taskmulti",
  "location": "westus",
  "name": "example1",
  "platform": {
    "architecture": "amd64",
    "os": "linux",
    "variant": null
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "myresourcegroup",
  "status": "Enabled",
  "step": {
    "baseImageDependencies": null,
    "contextAccessToken": null,
    "contextPath": "https://github.com/gituser/acr-build-helloworld-node.git#main",
    "taskFilePath": "taskmulti.yaml",
    "type": "FileTask",
    "values": [],
    "valuesFilePath": null
  },
  "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.git#main",
          "sourceControlAuthProperties": null,
          "sourceControlType": "Github"
        },
        "sourceTriggerEvents": [
          "commit"
        ],
        "status": "Enabled"
      }
    ]
  },
  "type": "Microsoft.ContainerRegistry/registries/tasks"
}

Тестирование многошагового рабочего процесса

Чтобы протестировать многошаговую задачу, запустите ее вручную, выполнив команду ​​az acr task run:

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

По умолчанию при выполнении команда az acr task run передает выходные данные журнала в консоль. В выходных данных отображается ход выполнения каждого шага задачи. Ниже представлен сокращенный пример выходных данных, только с основными шагами.

Queued a run with ID: cab
Waiting for an agent...
2020/11/20 00:03:31 Downloading source code...
2020/11/20 00:03:33 Finished downloading source code
2020/11/20 00:03:33 Using acb_vol_cfe6bd55-3076-4215-8091-6a81aec3d1b1 as the home volume
2020/11/20 00:03:33 Creating Docker network: acb_default_network, driver: 'bridge'
2020/11/20 00:03:34 Successfully set up Docker network: acb_default_network
2020/11/20 00:03:34 Setting up Docker configuration...
2020/11/20 00:03:34 Successfully set up Docker configuration
2020/11/20 00:03:34 Logging in to registry: myregistry.azurecr.io
2020/11/20 00:03:35 Successfully logged into myregistry.azurecr.io
2020/11/20 00:03:35 Executing step ID: acb_step_0. Working directory: '', Network: 'acb_default_network'
2020/11/20 00:03:35 Scanning for dependencies...
2020/11/20 00:03:36 Successfully scanned dependencies
2020/11/20 00:03:36 Launching container with name: acb_step_0
Sending build context to Docker daemon  24.06kB
[...]
Successfully built f669bfd170af
Successfully tagged myregistry.azurecr.io/hello-world:cf19
2020/11/20 00:03:43 Successfully executed container: acb_step_0
2020/11/20 00:03:43 Executing step ID: acb_step_1. Working directory: '', Network: 'acb_default_network'
2020/11/20 00:03:43 Launching container with name: acb_step_1
279b1cb6e092b64c8517c5506fcb45494cd5a0bd10a6beca3ba97f25c5d940cd
2020/11/20 00:03:44 Successfully executed container: acb_step_1
2020/11/20 00:03:44 Executing step ID: acb_step_2. Working directory: '', Network: 'acb_default_network'
2020/11/20 00:03:44 Pushing image: myregistry.azurecr.io/hello-world:cf19, attempt 1
[...]
2020/11/20 00:03:46 Successfully pushed image: myregistry.azurecr.io/hello-world:cf19
2020/11/20 00:03:46 Step ID: acb_step_0 marked as successful (elapsed time in seconds: 7.425169)
2020/11/20 00:03:46 Populating digests for step ID: acb_step_0...
2020/11/20 00:03:47 Successfully populated digests for step ID: acb_step_0
2020/11/20 00:03:47 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 0.827129)
2020/11/20 00:03:47 Step ID: acb_step_2 marked as successful (elapsed time in seconds: 2.112113)
2020/11/20 00:03:47 The following dependencies were found:
2020/11/20 00:03:47
- image:
    registry: myregistry.azurecr.io
    repository: hello-world
    tag: cf19
    digest: sha256:6b981a8ca8596e840228c974c929db05c0727d8630465de536be74104693467a
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git:
    git-head-revision: 1a3065388a0238e52865db1c8f3e97492a43444c

Run ID: cab was successful after 18s

Активация сборки с помощью фиксации

Теперь, когда вы протестировали задачу, выполнив ее вручную, запустите ее автоматически, изменив исходный код.

Сначала перейдите в каталог, содержащий локальный клон вашего репозитория:

cd acr-build-helloworld-node

Затем выполните следующие команды для создания, фиксации и передачи нового файла в вилку вашего репозитория GitHub:

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

Может потребоваться предоставить ваши учетные данные GitHub при выполнении команды git push. Введите свое имя пользователя GitHub и укажите созданный ранее личный маркер доступа в качестве пароля.

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

После отправки фиксации в репозиторий запускается веб-перехватчик, созданный решением "Задачи ACR", который выполняет задачу в Реестре контейнеров Azure. Отобразите журналы текущей задачи, чтобы проверить ее и отслеживать ход ее выполнения:

az acr task logs --registry $ACR_NAME

Выходные данные выглядят следующим образом. Они показывают выполняемую (или последнюю выполненную) задачу:

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

[...]

Run ID: cad was successful after 37s

Вывод списка сборок

Чтобы просмотреть список выполняемых задач, которые решение "Задачи ACR" выполнило в реестре, запустите команду az acr task list-runs:

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

Результат этой команды должен выглядеть примерно следующим образом: Отобразятся сборки, созданные решением "Задачи ACR", а также команда "Git Commit" в столбце TRIGGER для самой последней задачи:

RUN ID    TASK            PLATFORM    STATUS     TRIGGER    STARTED               DURATION
--------  --------------  ----------  ---------  ---------  --------------------  ----------
cad       example1        linux       Succeeded  Commit     2020-11-20T00:22:15Z  00:00:35
cac       taskhelloworld  linux       Succeeded  Commit     2020-11-20T00:22:15Z  00:00:22
cab       example1        linux       Succeeded  Manual     2020-11-20T00:18:36Z  00:00:47

Создание многошаговой задачи для нескольких реестров

Решение "Задачи ACR" по умолчанию имеет разрешения на отправку образов в реестр, в котором выполняется задача, и извлечение образов из него. Может потребоваться, чтобы многошаговая задача работала с одним или несколькими дополнительными реестрами, помимо реестра выполнения. Например, вы хотите компилировать образы в одном реестре и сохранять их с новыми тегами в другом реестре, который используется для рабочей системы. В этом примере показано, как создать такую задачу и указать учетные данные для другого реестра.

Если у вас еще нет второго реестра, создайте его для этого примера. Если вам нужен реестр, см. сведения в предыдущем руководстве или в статье Краткое руководство. Создание реестра контейнеров с использованием Azure CLI.

Чтобы создать задачу, нужно получить для реестра имя сервера входа в формате mycontainerregistrydate.azurecr.io (все символы в нижнем регистре). В нашем примере второй реестр используется для хранения образов с тегами по дате сборки.

Файл YAML

Второй пример многошаговой задачи для этого руководства определен в файле taskmulti-multiregistry.yaml, который размещен в корне клонированного ранее репозитория GitHub:

version: v1.1.0
steps:
# Build target images
- build: -t {{.Run.Registry}}/hello-world:{{.Run.ID}} -f Dockerfile .
- build: -t {{.Values.regDate}}/hello-world:{{.Run.Date}} -f Dockerfile .
# Run image 
- cmd: -t {{.Run.Registry}}/hello-world:{{.Run.ID}}
  id: test
  detach: true
  ports: ["8080:80"]
- cmd: docker stop test
# Push images
- push:
  - {{.Run.Registry}}/hello-world:{{.Run.ID}}
  - {{.Values.regDate}}/hello-world:{{.Run.Date}}

Эта многошаговая задача выполняет следующие действия:

  1. Выполняет два шага build для сборки образов из файла Dockerfile в рабочем каталоге:
    • Первый шаг предназначен для реестра Run.Registry, в котором запускается задача, и ему присваивается тег с уникальным идентификатором выполнения, созданным решением "Задачи ACR".
    • Второй предназначен для реестра, определяемого значением regDate, которое вы задаете при создании задачи (или указываете через внешний файл values.yaml, переданный в az acr task create). Этот образ получает тег с датой выполнения.
  2. Выполняет шаг cmd, чтобы запустить один из скомпилированных контейнеров. Этот пример запускает длительно выполняющийся контейнер в фоновом режиме и возвращает идентификатор этого контейнера, а затем останавливает контейнер. В реальной ситуации может выполняться тестирование запущенного контейнера, которое позволяет проверить правильность его работы.
  3. На шаге push отправляет скомпилированные образы: первый — в реестр выполнения, второй — в реестр, указанный в значении regDate.

Командная строка задачи

Используя определенные ранее переменные среды, создайте задачу, выполнив следующую команду az acr task create. Замените значение mycontainerregistrydate именем реального реестра.

az acr task create \
    --registry $ACR_NAME \
    --name example2 \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file taskmulti-multiregistry.yaml \
    --git-access-token $GIT_PAT \
    --set regDate=mycontainerregistrydate.azurecr.io

Добавление учетных данных задачи

Чтобы передать образы в реестр, указанный в значении regDate, выполните команду az acr task credential add, которая добавляет в задачу учетные данные для входа в этот реестр.

В этом примере мы рекомендуем создать субъект-службу с доступом к реестру, ограниченным ролью AcrPush, и наличием разрешений для отправки образов. Используйте указанный ниже сценарий, чтобы создать субъект-службу.

#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.

# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId

# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

Передайте идентификатор приложения и пароль для субъекта-службы с помощью команды az acr task credential add. Обязательно замените имя сервера для входа mycontainerregistrydate именем второго реестра:

az acr task credential add --name example2 \
    --registry $ACR_NAME \
    --login-server mycontainerregistrydate.azurecr.io \
    --username <service-principal-application-id> \
    --password <service-principal-password>

Интерфейс командной строки вернет имя добавленного сервера входа для реестра.

Тестирование многошагового рабочего процесса

Как и в предыдущем примере, чтобы протестировать многошаговую задачу, запустите ее вручную, выполнив команду ​​az acr task run. Чтобы задача запускалась при фиксации в репозитории Git, выполните инструкции из раздела Trigger a build with a commit (Активация сборки с помощью фиксации).

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

По умолчанию при выполнении команда az acr task run передает выходные данные журнала в консоль. Как и в предыдущем примере, в выходных данных отображается ход выполнения каждого шага задачи. В сокращенном примере выходных данных показаны только основные шаги.

Выходные данные:

Queued a run with ID: cf1g
Waiting for an agent...
2020/11/20 04:33:39 Downloading source code...
2020/11/20 04:33:41 Finished downloading source code
2020/11/20 04:33:42 Using acb_vol_4569b017-29fe-42bd-83b2-25c45a8ac807 as the home volume
2020/11/20 04:33:42 Creating Docker network: acb_default_network, driver: 'bridge'
2020/11/20 04:33:43 Successfully set up Docker network: acb_default_network
2020/11/20 04:33:43 Setting up Docker configuration...
2020/11/20 04:33:44 Successfully set up Docker configuration
2020/11/20 04:33:44 Logging in to registry: mycontainerregistry.azurecr.io
2020/11/20 04:33:45 Successfully logged into mycontainerregistry.azurecr.io
2020/11/20 04:33:45 Logging in to registry: mycontainerregistrydate.azurecr.io
2020/11/20 04:33:47 Successfully logged into mycontainerregistrydate.azurecr.io
2020/11/20 04:33:47 Executing step ID: acb_step_0. Working directory: '', Network: 'acb_default_network'
2020/11/20 04:33:47 Scanning for dependencies...
2020/11/20 04:33:47 Successfully scanned dependencies
2020/11/20 04:33:47 Launching container with name: acb_step_0
Sending build context to Docker daemon  25.09kB
[...]
Successfully tagged mycontainerregistry.azurecr.io/hello-world:cf1g
2020/11/20 04:33:55 Successfully executed container: acb_step_0
2020/11/20 04:33:55 Executing step ID: acb_step_1. Working directory: '', Network: 'acb_default_network'
2020/11/20 04:33:55 Scanning for dependencies...
2020/11/20 04:33:56 Successfully scanned dependencies
2020/11/20 04:33:56 Launching container with name: acb_step_1
Sending build context to Docker daemon  25.09kB
[...]
Successfully tagged mycontainerregistrydate.azurecr.io/hello-world:20190503-043342z
2020/11/20 04:33:57 Successfully executed container: acb_step_1
2020/11/20 04:33:57 Executing step ID: acb_step_2. Working directory: '', Network: 'acb_default_network'
2020/11/20 04:33:57 Launching container with name: acb_step_2
721437ff674051b6be63cbcd2fa8eb085eacbf38d7d632f1a079320133182101
2020/11/20 04:33:58 Successfully executed container: acb_step_2
2020/11/20 04:33:58 Executing step ID: acb_step_3. Working directory: '', Network: 'acb_default_network'
2020/11/20 04:33:58 Launching container with name: acb_step_3
test
2020/11/20 04:34:09 Successfully executed container: acb_step_3
2020/11/20 04:34:09 Executing step ID: acb_step_4. Working directory: '', Network: 'acb_default_network'
2020/11/20 04:34:09 Pushing image: mycontainerregistry.azurecr.io/hello-world:cf1g, attempt 1
The push refers to repository [mycontainerregistry.azurecr.io/hello-world]
[...]
2020/11/20 04:34:12 Successfully pushed image: mycontainerregistry.azurecr.io/hello-world:cf1g
2020/11/20 04:34:12 Pushing image: mycontainerregistrydate.azurecr.io/hello-world:20190503-043342z, attempt 1
The push refers to repository [mycontainerregistrydate.azurecr.io/hello-world]
[...]
2020/11/20 04:34:19 Successfully pushed image: mycontainerregistrydate.azurecr.io/hello-world:20190503-043342z
2020/11/20 04:34:19 Step ID: acb_step_0 marked as successful (elapsed time in seconds: 8.125744)
2020/11/20 04:34:19 Populating digests for step ID: acb_step_0...
2020/11/20 04:34:21 Successfully populated digests for step ID: acb_step_0
2020/11/20 04:34:21 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.009281)
2020/11/20 04:34:21 Populating digests for step ID: acb_step_1...
2020/11/20 04:34:23 Successfully populated digests for step ID: acb_step_1
2020/11/20 04:34:23 Step ID: acb_step_2 marked as successful (elapsed time in seconds: 0.795440)
2020/11/20 04:34:23 Step ID: acb_step_3 marked as successful (elapsed time in seconds: 11.446775)
2020/11/20 04:34:23 Step ID: acb_step_4 marked as successful (elapsed time in seconds: 9.734973)
2020/11/20 04:34:23 The following dependencies were found:
2020/11/20 04:34:23
- image:
    registry: mycontainerregistry.azurecr.io
    repository: hello-world
    tag: cf1g
    digest: sha256:75354e9edb995e8661438bad9913deed87a185fddd0193811f916d684b71a5d2
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git:
    git-head-revision: 9d9023473c46a5e2c315681b11eb4552ef0faccc
- image:
    registry: mycontainerregistrydate.azurecr.io
    repository: hello-world
    tag: 20190503-043342z
    digest: sha256:75354e9edb995e8661438bad9913deed87a185fddd0193811f916d684b71a5d2
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git:
    git-head-revision: 9d9023473c46a5e2c315681b11eb4552ef0faccc

Run ID: cf1g was successful after 46s

Дальнейшие действия

Из этого руководства вы узнали, как создавать многошаговые задачи для нескольких контейнеров, которые автоматически запускаются при фиксации исходного кода в репозитории Git. Расширенные возможности многошаговых задач, включая параллельное и зависимое выполнение шагов, описаны в справочнике по YAML для решения "Задачи ACR". Перейдите к следующему руководству, чтобы узнать, как создавать задачи, которые активируют сборку при обновлении базового образа контейнера.