다음을 통해 공유


자습서: 소스 코드를 커밋할 때 클라우드에서 다단계 컨테이너 워크플로 실행

ACR 작업은 빠른 작업 외에도 소스 코드를 Git 리포지토리에 커밋할 때 자동으로 트리거할 수 있는 다단계 다중 컨테이너 기반 워크플로를 지원합니다.

이 자습서에서는 YAML 파일 예제를 사용하여 소스 코드를 커밋할 때 레지스트리에서 하나 이상의 컨테이너 이미지를 빌드, 실행 및 푸시하는 다단계 작업을 정의하는 방법에 대해 알아봅니다. 코드 커밋 시 단일 이미지 빌드만 자동화하는 작업을 만들려면 자습서: 소스 코드 커밋 시 클라우드에서 컨테이너 이미지 빌드 자동화를 참조하세요. ACR 작업에 대한 개요는 ACR 작업을 사용하여 OS 및 프레임워크 패치 자동화를 참조하세요.

이 자습서에서:

  • YAML 파일을 사용하여 다단계 작업 정의
  • 작업 만들기
  • 필요에 따라 자격 증명을 작업에 추가하여 다른 레지스트리에 액세스할 수 있도록 설정
  • 작업 테스트
  • 태스크 상태 보기
  • 코드 커밋을 사용하여 작업 트리거

이 자습서에서는 이전 자습서의 단계를 이미 완료했다고 가정합니다. 아직 완료하지 않은 경우 계속 진행하기 전에 이전 자습서의 필수 조건 섹션에 있는 단계를 완료하세요.

필수 조건

샘플 코드 가져오기

이 자습서에서는 이전 자습서의 단계를 이미 완료했고, 샘플 리포지토리를 포크 및 복제했다고 가정합니다. 아직 완료하지 않은 경우 계속 진행하기 전에 이전 자습서의 필수 조건 섹션에 있는 단계를 완료하세요.

컨테이너 레지스트리

이 자습서를 완료하려면 Azure 구독에 Azure 컨테이너 레지스트리가 있어야 합니다. 레지스트리가 필요하면 이전 자습서 또는 빠른 시작: Azure CLI를 사용하여 컨테이너 레지스트리 만들기를 참조하세요.

GitHub 개인용 액세스 토큰 만들기

Git 리포지토리에 커밋할 때 작업을 트리거하려면 ACR 작업에서 리포지토리에 액세스하기 위해 PAT(개인 액세스 토큰)가 필요합니다. PAT가 아직 없는 경우 다음 단계에 따라 GitHub에서 하나를 생성합니다.

  1. [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new)에 있는 GitHub의 PAT 만들기 페이지로 이동합니다.

  2. 토큰에 대한 짧은 설명을 입력합니다(예: "ACR 작업 데모").

  3. 리포지토리에 액세스하려면 ACR에 대한 범위를 선택합니다. 이 자습서에서와 같이 공용 리포지토리에 액세스하려면 리포지토리 아래에서 repo: statuspublic_repo를 사용하도록 설정합니다.

    Screenshot of the Personal Access Token generation page in GitHub

    참고 항목

    프라이빗 리포지토리에 액세스하기 위한 PAT를 생성하려면 전체 리포지토리 컨트롤에 대한 범위를 선택합니다.

  4. 토큰 생성 단추를 선택합니다(암호를 확인하라는 메시지가 표시될 수 있음).

  5. 생성된 토큰을 복사하여 보안 위치에 저장합니다. 이 토큰은 다음 섹션에서 작업을 정의할 때 사용합니다.

    Screenshot of the generated Personal Access Token in GitHub

Azure CLI에 대한 환경 준비

다단계 작업 만들기

이제 ACR 작업에서 커밋 상태를 읽고 웹후크를 리포지토리에 만들 수 있도록 설정하는 데 필요한 단계를 완료했으므로 컨테이너 이미지의 빌드, 실행 및 푸시를 트리거하는 작업을 만듭니다.

YAML 파일

YAML 파일에는 다단계 작업에 대한 단계가 정의됩니다. 이 자습서의 첫 번째 다단계 작업은 복제한 GitHub 리포지토리의 루트에 있는 taskmulti.yaml 파일에 정의되어 있습니다.

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 작업 실행 ID가 있는 태그가 지정됩니다.
  2. cmd 단계를 실행하여 임시 컨테이너에서 이미지를 실행합니다. 이 예제에서는 백그라운드에서 장기 실행 컨테이너를 시작하고, 컨테이너 ID를 반환한 다음, 컨테이너를 중지합니다. 실제 시나리오에서는 실행 중인 컨테이너가 올바르게 실행되는지 테스트하는 단계가 포함될 수 있습니다.
  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 작업은 해당 분기의 코드에서 다단계 작업을 실행합니다. 리포지토리 루트의 --file에 지정된 YAML 파일에서 단계를 정의합니다.

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

git push 명령을 실행할 때 GitHub 자격 증명을 제공하라는 메시지가 표시될 수 있습니다. GitHub 사용자 이름을 제공하고, 이전에 암호에 대해 만든 PAT(개인용 액세스 토큰)를 입력합니다.

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

커밋이 리포지토리에 푸시되면 ACR 작업에서 만든 웹후크가 실행되어 Azure Container Registry에서 작업을 시작합니다. 현재 실행 중인 작업에 대한 로그를 표시하여 빌드 진행 상황을 확인하고 모니터링합니다.

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 작업에서 실행한 실행이 표시되고, 가장 최근 작업에 대한 TRIGGER 열에 "Git Commit"(Git 커밋)이 표시됩니다.

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 파일

이 자습서의 두 번째 다단계 작업은 복제한 GitHub 리포지토리의 루트에 있는 taskmulti-multiregistry.yaml 파일에 정의되어 있습니다.

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에서 이미지를 빌드합니다.
    • 첫 번째 단계는 작업이 실행되고 ACR 작업 실행 ID가 있는 태그가 지정된 Run.Registry 레지스트리를 대상으로 합니다.
    • 두 번째 단계는 작업을 만들 때 설정하거나 az acr task create에 전달된 외부 values.yaml 파일을 통해 제공한 regDate의 값으로 식별되는 레지스트리를 대상으로 합니다. 이 이미지는 실행 날짜가 있는 태그로 지정됩니다.
  2. cmd 단계를 실행하여 빌드된 컨테이너 중 하나를 실행합니다. 이 예제에서는 백그라운드에서 장기 실행 컨테이너를 시작하고, 컨테이너 ID를 반환한 다음, 컨테이너를 중지합니다. 실제 시나리오에서는 실행 중인 컨테이너를 테스트하여 올바르게 실행되는지 확인할 수 있습니다.
  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 명령에서 서비스 주체 애플리케이션 ID와 암호를 전달합니다. 로그인 서버 이름 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>

CLI에서 추가한 레지스트리 로그인 서버의 이름을 반환합니다.

다단계 워크플로 테스트

앞의 예제처럼 다단계 작업을 테스트하려면 az acr task run 명령을 실행하여 이 작업을 수동으로 트리거합니다. Git 리포지토리에 대한 커밋을 사용하여 작업을 트리거하려면 커밋을 사용하여 빌드 트리거 섹션을 참조하세요.

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 리포지토리에 커밋할 때 자동으로 트리거되는 다단계 다중 컨테이너 기반 작업을 만드는 방법을 알아보았습니다. 병렬 및 종속 단계 실행을 포함한 다단계 작업의 고급 기능은 ACR 작업 YAML 참조를 참조하세요. 컨테이너 이미지의 기본 이미지가 업데이트될 때 빌드를 트리거하는 작업을 만드는 방법을 알아보려면 다음 자습서로 계속 진행하세요.