Samouczek: uruchamianie wieloetapowego przepływu pracy kontenera w chmurze podczas zatwierdzania kodu źródłowego

Oprócz szybkiego zadania usługa ACR Tasks obsługuje wieloetapowe przepływy pracy oparte na wielu kontenerach, które mogą być automatycznie wyzwalane podczas zatwierdzania kodu źródłowego do repozytorium Git.

Z tego samouczka dowiesz się, jak używać przykładowych plików YAML do definiowania zadań wieloetapowych, które kompilują, uruchamiają i wypychają co najmniej jeden obraz kontenera do rejestru podczas zatwierdzania kodu źródłowego. Aby utworzyć zadanie, które automatyzuje tylko pojedynczą kompilację obrazu przy zatwierdzaniu kodu, zobacz Samouczek: automatyzowanie kompilacji obrazu kontenera w chmurze podczas zatwierdzania kodu źródłowego. Aby zapoznać się z omówieniem zadań usługi ACR, zobacz Automatyzowanie poprawek systemu operacyjnego i struktury za pomocą usługi ACR Tasks,

W tym samouczku:

  • Definiowanie zadania wieloetapowego przy użyciu pliku YAML
  • Tworzenie zadania podrzędnego
  • Opcjonalnie dodaj poświadczenia do zadania, aby umożliwić dostęp do innego rejestru
  • Testowanie zadania
  • Wyświetlanie stanu zadania podrzędnego
  • Wyzwalanie zadania po zatwierdzeniu kodu

W samouczku założono, że zostały już wykonane kroki z poprzedniego samouczka. Jeśli nie zostało to jeszcze zrobione, przed kontynuowaniem wykonaj kroki wymienione w poprzednim samouczku w części poświęconej wymaganiom wstępnym.

Wymagania wstępne

Pobieranie przykładowego kodu

W samouczku założono, że zostały już wykonane kroki z poprzedniego samouczka oraz że przykładowe repozytorium zostało rozwidlone i sklonowane. Jeśli nie zostało to jeszcze zrobione, przed kontynuowaniem wykonaj kroki wymienione w poprzednim samouczku w części poświęconej wymaganiom wstępnym.

Rejestr kontenerów

Aby ukończyć ten samouczek, w Twojej subskrypcji platformy Azure musisz posiadać rejestr kontenerów platformy Azure. Jeśli potrzebujesz rejestru, zobacz poprzedni samouczek lub Szybki start: tworzenie rejestru kontenerów za pomocą interfejsu wiersza polecenia platformy Azure.

Tworzenie osobistego tokenu dostępu GitHub

Aby wyzwolić zadanie zatwierdzenia w repozytorium Git, usługa ACR Tasks potrzebuje osobistego tokenu dostępu (PAT), aby uzyskać dostęp do repozytorium. Jeśli nie masz jeszcze pat, wykonaj następujące kroki, aby wygenerować jeden w usłudze GitHub:

  1. Przejdź do strony tworzenia tokenu PAT w witrynie GitHub pod adresem https://github.com/settings/tokens/new

  2. Wprowadź krótki opis dla tokenu, na przykład „Przykładowe zadanie ACR Tasks”

  3. Wybierz zakresy usługi ACR, aby uzyskać dostęp do repozytorium. Aby uzyskać dostęp do publicznego repozytorium, tak jak w tym samouczku, w obszarze repozytorium włącz repozytorium:status i public_repo

    Zrzut ekranu strony generowania osobistego tokenu dostępu w usłudze GitHub

    Uwaga

    Aby wygenerować dostęp do repozytorium prywatnego , wybierz zakres pełnej kontroli repozytorium .

  4. Wybierz przycisk Generate token (Generuj token) (może zostać wyświetlony monit o potwierdzenie hasła)

  5. Skopiuj i zapisz wygenerowany token w bezpiecznej lokalizacji (użyjesz tego tokenu podczas definiowania zadania w następnej sekcji)

    Zrzut ekranu przedstawiający wygenerowany osobisty token dostępu w usłudze GitHub

Przygotowywanie środowiska dla interfejsu wiersza polecenia platformy Azure

Tworzenie zadania wieloetapowego

Po wykonaniu kroków wymaganych do włączenia usługi ACR Tasks odczytywania stanu zatwierdzenia i tworzenia elementów webhook w repozytorium utwórz zadanie wieloetapowe, które wyzwala kompilowanie, uruchamianie i wypychanie obrazu kontenera.

Plik YAML

Kroki dla zadania wieloetapowego można zdefiniować w pliku YAML. Pierwsze przykładowe zadanie wieloetapowe dla tego samouczka jest definiowane w pliku taskmulti.yaml, który znajduje się w katalogu głównym sklonowanego repozytorium 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}}

To zadanie wieloetapowe wykonuje następujące czynności:

  1. build Uruchamia krok w celu skompilowania obrazu z pliku Dockerfile w katalogu roboczym. Obraz jest przeznaczony dla Run.Registryelementu , rejestru, w którym jest uruchamiane zadanie, i jest oznaczony unikatowym identyfikatorem uruchomienia zadań usługi ACR.
  2. cmd Uruchamia krok, aby uruchomić obraz w kontenerze tymczasowym. Ten przykład uruchamia długotrwały kontener w tle i zwraca identyfikator kontenera, a następnie zatrzymuje kontener. W rzeczywistym scenariuszu możesz uwzględnić kroki testowania uruchomionego kontenera, aby upewnić się, że działa poprawnie.
  3. push W kroku wypycha obraz skompilowany do rejestru uruchomień.

Polecenie zadania

Najpierw wypełnij te zmienne środowiskowe powłoki przy użyciu wartości odpowiednich dla danego środowiska. Ten krok nie jest ściśle wymagany, ale trochę ułatwia wykonywanie przedstawionych w tym samouczku wielowierszowych poleceń interfejsu wiersza polecenia platformy Azure. Jeśli te zmienne środowiskowe nie zostaną wypełnione, należy ręcznie zastąpić każdą wartość wszędzie tam, gdzie jest wyświetlana w przykładowych poleceniach.

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

Teraz utwórz zadanie, wykonując następujące polecenie 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

To zadanie określa, że za każdym razem, gdy kod jest zatwierdzany w gałęzi głównej w repozytorium określonym przez --contextusługę , usługa ACR Tasks uruchomi zadanie wieloetapowe z kodu w tej gałęzi. Plik YAML określony przez --file katalog główny repozytorium definiuje kroki.

Dane wyjściowe z pomyślnie wykonanego polecenia az acr task create przypominają następujące dane:

{
  "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"
}

Testowanie wieloetapowego przepływu pracy

Aby przetestować zadanie wieloetapowe, uruchom je ręcznie, wykonując polecenie az acr task run :

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

Domyślnie polecenie az acr task run przesyła strumieniowo dane wyjściowe dziennika do konsoli podczas wykonywania polecenia. Dane wyjściowe pokazują postęp uruchamiania każdego z kroków zadania. Poniższe dane wyjściowe są skrócone, aby pokazać kluczowe kroki.

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

Wyzwalanie kompilacji za pomocą zatwierdzenia

Teraz, po przetestowaniu zadania przez jego ręczne uruchomienie, wyzwól je automatycznie za pomocą zmiany kodu źródłowego.

Najpierw upewnij się, że jesteś w katalogu zawierającym lokalny klon repozytorium:

cd acr-build-helloworld-node

Następnie uruchom następujące polecenia do utworzenia, zatwierdzenia i wypchnięcia nowego pliku do rozwidlenia repozytorium w usłudze GitHub:

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

Być może podczas wykonywania polecenia git push będzie konieczne wprowadzenie poświadczeń usługi GitHub. Podaj nazwę użytkownika usługi GitHub i wprowadź osobisty token dostępu (PAT) utworzony wcześniej dla hasła.

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

Po wypchnięciu zatwierdzenia do repozytorium element webhook utworzony przez usługę ACR Tasks zostanie wyzwolony i rozpocznie zadanie w Azure Container Registry. Wyświetl dzienniki dla aktualnie uruchomionego zadania, aby sprawdzić i monitorować postęp kompilacji:

az acr task logs --registry $ACR_NAME

Dane wyjściowe są podobne do następujących danych i przedstawiają aktualnie (lub ostatnio) wykonywane zadanie:

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

[...]

Run ID: cad was successful after 37s

Lista kompilacji

Aby wyświetlić listę przebiegów zadań, które usługa ACR Tasks wykonała dla rejestru, uruchom polecenie az acr task list-runs:

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

Dane wyjściowe polecenia powinny wyglądać podobnie do następujących danych. Wyświetlone zostaną przebiegi wykonane przez usługę ACR Tasks, a dla najnowszego zadania w kolumnie TRIGGER pojawi się pozycja „Git Commit”:

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

Tworzenie zadania wieloetapowego obejmującego wiele rejestrów

Domyślnie usługa ACR Tasks ma uprawnienia do wypychania lub ściągania obrazów z rejestru, w którym jest uruchamiane zadanie. Możesz uruchomić zadanie wieloetapowe, które jest przeznaczone dla co najmniej jednego rejestru oprócz rejestru uruchomień. Na przykład może być konieczne skompilowanie obrazów w jednym rejestrze i przechowywanie obrazów z różnymi tagami w drugim rejestrze, do którego uzyskuje dostęp system produkcyjny. W tym przykładzie pokazano, jak utworzyć takie zadanie i podać poświadczenia dla innego rejestru.

Jeśli nie masz jeszcze drugiego rejestru, utwórz go na potrzeby tego przykładu. Jeśli potrzebujesz rejestru, zobacz poprzedni samouczek lub Szybki start: tworzenie rejestru kontenerów za pomocą interfejsu wiersza polecenia platformy Azure.

Aby utworzyć zadanie, potrzebna jest nazwa serwera logowania rejestru, który ma postać mycontainerregistrydate.azurecr.io (wszystkie małe litery). W tym przykładzie użyjesz drugiego rejestru do przechowywania obrazów oznaczonych datą kompilacji.

Plik YAML

Drugie przykładowe zadanie wieloetapowe dla tego samouczka jest definiowane w pliku taskmulti-multiregistry.yaml, który znajduje się w katalogu głównym sklonowanego repozytorium 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}}

To zadanie wieloetapowe wykonuje następujące czynności:

  1. Uruchamia dwa build kroki tworzenia obrazów z pliku Dockerfile w katalogu roboczym:
    • Pierwszy element jest przeznaczony dla Run.Registry, rejestru, w którym jest uruchamiane zadanie, i jest oznaczony identyfikatorem uruchomienia zadań usługi ACR.
    • Drugi element jest przeznaczony dla rejestru określonego regDateprzez wartość , który został ustawiony podczas tworzenia zadania (lub podaj za pośrednictwem pliku zewnętrznego values.yaml przekazanego do az acr task create). Ten obraz jest oznaczony datą uruchomienia.
  2. Uruchamia krok uruchamiania cmd jednego z utworzonych kontenerów. Ten przykład uruchamia długotrwały kontener w tle i zwraca identyfikator kontenera, a następnie zatrzymuje kontener. W rzeczywistym scenariuszu możesz przetestować uruchomiony kontener, aby upewnić się, że działa prawidłowo.
  3. W kroku push wypycha obrazy, które zostały skompilowane, pierwszy do uruchomionego rejestru, drugi do rejestru zidentyfikowanego przez regDate.

Polecenie zadania

Korzystając ze zdefiniowanych wcześniej zmiennych środowiskowych powłoki, utwórz zadanie, wykonując następujące polecenie az acr task create . Zastąp nazwę rejestru 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

Dodawanie poświadczeń zadania

Aby wypchnąć obrazy do rejestru zidentyfikowane przez wartość regDate, użyj polecenia az acr task credential add , aby dodać poświadczenia logowania dla tego rejestru do zadania.

W tym przykładzie zalecamy utworzenie jednostki usługi z dostępem do rejestru w zakresie roli AcrPush , aby mieć uprawnienia do wypychania obrazów. Aby utworzyć jednostkę usługi, użyj następującego skryptu:

#!/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"

Przekaż identyfikator aplikacji jednostki usługi i hasło w poniższym az acr task credential add poleceniu. Pamiętaj, aby zaktualizować nazwę serwera logowania mycontainerregistrydate nazwą drugiego rejestru:

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

Interfejs wiersza polecenia zwraca nazwę dodanego serwera logowania rejestru.

Testowanie wieloetapowego przepływu pracy

Tak jak w poprzednim przykładzie, aby przetestować zadanie wieloetapowe, wyzwól je ręcznie, wykonując polecenie az acr task run . Aby wyzwolić zadanie z zatwierdzeniem w repozytorium Git, zobacz sekcję Wyzwalanie kompilacji za pomocą zatwierdzenia.

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

Domyślnie polecenie az acr task run przesyła strumieniowo dane wyjściowe dziennika do konsoli podczas wykonywania polecenia. Tak jak wcześniej dane wyjściowe pokazują postęp uruchamiania każdego z kroków zadania. Dane wyjściowe są skondensowane w celu wyświetlenia kluczowych kroków.

Dane wyjściowe:

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

Następne kroki

W tym samouczku przedstawiono sposób tworzenia wieloetapowych zadań opartych na wielu kontenerach, które są wyzwalane automatycznie po zatwierdzeniu kodu źródłowego do repozytorium Git. Aby uzyskać zaawansowane funkcje zadań wieloetapowych, w tym równoległe i zależne wykonywanie kroków, zobacz dokumentację yaML zadań usługi ACR. Przejdź do kolejnego samouczka, aby dowiedzieć się, jak utworzyć zadania, które wyzwalają kompilacje przy aktualizacji obrazu podstawowego obrazu kontenera.