Руководство. Запуск многоэтапного рабочего процесса контейнера в облаке при фиксации исходного кода
Помимо быстрых задач, решение "Задачи ACR" поддерживает многошаговые рабочие процессы для нескольких контейнеров, которые могут выполняться автоматически при фиксации исходного кода в репозитории Git.
Из этого руководства вы узнаете, как на основе примеров файлов YAML определить многошаговые задачи, которые компилируют, запускают и отправляют в реестр один или несколько образов контейнеров при фиксации исходного кода. Сведения о создании задачи, которая автоматизирует только одну сборку образа при фиксации кода, см. в руководстве . Автоматизация сборок образов контейнеров в облаке при фиксации исходного кода. Обзор решения "Задачи ACR" см. в статье Automate OS and framework patching with ACR Tasks (Автоматизация установки исправлений для ОС и платформы с помощью решения "Задачи ACR").
В этом руководстве рассматриваются следующие темы:
- определение многошаговой задачи с помощью файла YAML;
- Создать задачу
- (необязательно) добавление к задаче учетных данных для доступа к другому реестру;
- Тестирование задачи
- Представление состояния задачи
- Активация задачи с помощью фиксации кода
В этом руководстве предполагается, что вы уже выполнили шаги в предыдущем руководстве. Если вы еще этого не сделали, выполните действия, описанные в разделе Предварительные требования в предыдущем руководстве, прежде чем перед продолжить.
Необходимые компоненты
Получение примера кода
В этом руководстве предполагается, что вы уже выполнили шаги в предыдущем руководстве, создали вилку и клонировали пример репозитория. Если вы еще этого не сделали, выполните действия, описанные в разделе Предварительные требования в предыдущем руководстве, прежде чем перед продолжить.
Реестр контейнеров
Для выполнения заданий данного руководства необходимо иметь реестр контейнеров Azure в подписке Azure. Если вам нужен реестр, см. сведения в предыдущем руководстве или в статье Краткое руководство. Создание реестра контейнеров с использованием Azure CLI.
Создание личного маркера доступа GitHub
Чтобы инициировать задачу при фиксации кода в репозитории Git, решению "Задачи ACR" требуется личный маркер доступа (PAT) для доступа к репозиторию. Если у вас еще нет личного маркера доступа, выполните следующие действия, чтобы создать его на GitHub.
Перейдите на страницу создания PAT на GitHub по адресу https://github.com/settings/tokens/new.
Введите краткое описание маркера, например "ACR Task Demo".
Выберите области для ACR, чтобы получить доступ к репозиторию. Для доступа к общедоступному репозиторию, как в этом учебнике, в разделе repo включите repo:status и public_repo
Примечание.
Чтобы создать личный маркер доступа для доступа к репозиторию private, выберите область для полного контроля репозитория.
Нажмите кнопку Generate token (Создать маркер) (может появиться запрос на подтверждение пароля).
Скопируйте и сохраните созданный маркер в защищенном расположении (вы используете этот маркер при определении задачи в следующем разделе).
Подготовка среды к работе с 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}}
Эта многошаговая задача выполняет следующие действия:
- Выполняет шаг
build
для сборки образа из файла Dockerfile в рабочем каталоге. Этот образ предназначен для реестраRun.Registry
, в котором запускается задача, и ему присваивается тег с уникальным идентификатором выполнения, созданным решением "Задачи ACR". - Выполняет шаг
cmd
для запуска образа во временном контейнере. Этот пример запускает длительно выполняющийся контейнер в фоновом режиме и возвращает идентификатор этого контейнера, а затем останавливает контейнер. Реальный сценарий может включать шаги для тестирования запущенного контейнера, которые позволяют проверить правильность его работы. - На шаге
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}}
Эта многошаговая задача выполняет следующие действия:
- Выполняет два
build
шага для создания образов из Dockerfile в рабочем каталоге:- Первый шаг предназначен для реестра
Run.Registry
, в котором запускается задача, и ему присваивается тег с уникальным идентификатором выполнения, созданным решением "Задачи ACR". - Второй предназначен для реестра, определяемого значением
regDate
, которое вы задаете при создании задачи (или указываете через внешний файлvalues.yaml
, переданный вaz acr task create
). Этот образ получает тег с датой выполнения.
- Первый шаг предназначен для реестра
- Выполняет шаг
cmd
, чтобы запустить один из скомпилированных контейнеров. Этот пример запускает длительно выполняющийся контейнер в фоновом режиме и возвращает идентификатор этого контейнера, а затем останавливает контейнер. В реальной ситуации может выполняться тестирование запущенного контейнера, которое позволяет проверить правильность его работы. - На шаге
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". Перейдите к следующему руководству, чтобы узнать, как создавать задачи, которые активируют сборку при обновлении базового образа контейнера.