次の方法で共有


チュートリアル:Azure Container Apps ジョブを使用してセルフホスト型 CI/CD ランナーとエージェントをデプロイする

GitHub Actions と Azure Pipelines を使うと、セルフホステッド ランナーとエージェントを使って CI/CD ワークフローを実行できます。 イベント ドリブンの Azure Container Apps ジョブを使って、セルフホステッド ランナーとエージェントを実行できます。

セルフホステッド ランナーは、クラウドホステッド ランナーでは使用できないローカル リソースまたはツールへのアクセスを必要とするワークフローを実行する必要がある場合に便利です。 たとえば、ワークフローで Container Apps ジョブのセルフホステッド ランナーを使うと、クラウドホステッド ランナーからはアクセスできないジョブの仮想ネットワーク内のリソースにアクセスできます。

セルフホステッド ランナーをイベント ドリブンのジョブとして実行すると、Azure Container Apps のサーバーレスの性質を利用できます。 ジョブは、ワークフローがトリガーされると自動的に実行して、完了すると終了します。

支払いは、ジョブが実行している時間に対してのみです。

このチュートリアルでは、イベント ドリブンの Container Apps ジョブとして GitHub Actions ランナーを実行する方法について説明します。

  • セルフホステッド ランナーをデプロイするための Container Apps 環境を作成する
  • セルフホステッド ランナーを使用するワークフローを実行するための GitHub リポジトリを作成する
  • GitHub Actions ランナーを実行するコンテナー イメージをビルドする
  • ランナーをジョブとして Container Apps 環境にデプロイする
  • セルフホステッド ランナーを使用するワークフローを作成し、動作することを確認する

重要

セルフホステッド ランナーは、"プライベート" リポジトリの場合にのみ推奨されます。 パブリック リポジトリで使うと、セルフホステッド ランナーで危険なコードが実行される可能性があります。 詳しくは、「セルフホステッド ランナーのセキュリティ」をご覧ください。

このチュートリアルでは、イベント ドリブンの Container Apps ジョブとして Azure Pipelines エージェントを実行する方法について説明します。

  • セルフホステッド エージェントをデプロイするための Container Apps 環境を作成する
  • Azure DevOps 組織とプロジェクトを作成する
  • Azure Pipelines エージェントを実行するコンテナー イメージをビルドする
  • 手動ジョブを使って Container Apps 環境にプレースホルダー エージェントを作成する
  • エージェントをジョブとして Container Apps 環境にデプロイする
  • セルフホステッド エージェントを使用するパイプラインを作成し、動作することを確認する

重要

セルフホステッド エージェントは、"プライベート" プロジェクトの場合にのみ推奨されます。 パブリック プロジェクトで使うと、セルフホステッド エージェントで危険なコードが実行される可能性があります。 詳しくは、セルフホステッド エージェントのセキュリティに関する記事をご覧ください。

Note

Container Apps とジョブでは、コンテナーでの Docker の実行はサポートされていません。 ワークフロー内の Docker コマンドを使うステップは、Container Apps ジョブのセルフホステッド ランナーまたはエージェントで実行すると失敗します。

前提条件

  • Azure DevOps 組織: アクティブなサブスクリプションのある DevOps 組織がない場合は、無料で作成できます

制限事項の一覧については、「ジョブの制限」をご覧ください。

設定

CLI から Azure にサインインするには、次のコマンドを実行し、プロンプトに従って認証プロセスを完了します。

az login

最新バージョンの CLI を実行していることを確認するには、upgrade コマンドを実行します。

az upgrade

次に、CLI 用の Azure Container Apps 拡張機能をインストールまたは更新します。

Azure CLI で az containerapp コマンドを実行したとき、または Azure PowerShell で Az.App モジュールからコマンドレットを実行したときに、パラメーターの不足に関するエラーが表示される場合は、最新バージョンの Azure Container Apps 拡張機能がインストールされていることを確認してください。

az extension add --name containerapp --upgrade

Note

2024 年 5 月以降、Azure CLI 拡張機能では、既定でプレビュー機能が有効になりません。 Container Apps のプレビュー機能にアクセスするには、--allow-preview true を使用して Container Apps 拡張機能をインストールします。

az extension add --name containerapp --upgrade --allow-preview true

最新の拡張機能またはモジュールがインストールされたので、Microsoft.App および Microsoft.OperationalInsights 名前空間を登録します。

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

環境変数を作成する

Azure CLI のセットアップが完了したところで、この記事全体で使用される環境変数を定義できます。

RESOURCE_GROUP="jobs-sample"
LOCATION="northcentralus"
ENVIRONMENT="env-jobs-sample"
JOB_NAME="github-actions-runner-job"
RESOURCE_GROUP="jobs-sample"
LOCATION="northcentralus"
ENVIRONMENT="env-jobs-sample"
JOB_NAME="azure-pipelines-agent-job"
PLACEHOLDER_JOB_NAME="placeholder-agent-job"

Container Apps 環境を作成する

Azure Container Apps 環境は、コンテナー アプリとジョブを囲む安全な境界として機能するため、同じネットワークを共有したり、相互に通信したりすることができます。

Note

既存の仮想ネットワークと統合された Container Apps 環境の作成については、Azure Container Apps 環境に仮想ネットワークを提供する方法に関するページをご覧ください。

  1. リソース グループを作成するには、次のコマンドを使用します。

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 次のコマンドを使用して、Container Apps 環境を作成します。

    az containerapp env create \
        --name "$ENVIRONMENT" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION"
    

ワークフローを実行するための GitHub リポジトリを作成する

ワークフローを実行するには、ワークフローの定義を含む GitHub リポジトリを作成する必要があります。

  1. GitHub に移動し、サインインします。

  2. 次の値を入力して、新しいリポジトリを作成します。

    設定
    所有者 GitHub のユーザー名を選びます。
    リポジトリ名です リポジトリの名前を入力します。
    表示 [プライベート] を選択します。
    Initialize this repository with (このリポジトリの初期化方法) [README ファイルを追加する] を選択します。

    残りの値は既定の選択のままにします。

  3. [Create repository] (リポジトリの作成) を選択します。

  4. 新しいリポジトリで、[Actions] (アクション) を選びます。

  5. Simple workflow (シンプル ワークフロー) テンプレートを検索して、[Configure] (構成) を選びます。

  6. [Commit changes] (変更のコミット) を選んで、ワークフローをリポジトリに追加します。

ワークフローは、ubuntu-latest GitHub ホステッド ランナーで実行されて、コンソールにメッセージを出力します。 後で、GitHub ホステッド ランナーをセルフホステッド ランナーに置き換えます。

GitHub の個人用アクセス トークンを取得する

セルフホステッド ランナーを実行するには、GitHub で個人用アクセス トークン (PAT) を作成する必要があります。 ランナーが開始するたびに、PAT を使って、GitHub にランナーを登録するためのトークンが生成されます。 PAT は、リポジトリのワークフロー キューを監視し、必要に応じてランナーを開始するために、GitHub Actions ランナー スケール ルールでも使われます。

Note

個人用アクセス トークン (PAT) には有効期限があります。 サービスを中断しないように、トークンを定期的にローテーションして有効な (期限切れではない) 状態を維持します。

  1. GitHub の右上隅にある自分のプロファイル画像を選んで、[Settings] (設定) を選びます。

  2. [Developper settings] (開発者設定) を選択します。

  3. [Personal access tokens] (個人用アクセス トークン) で、[Fine-grained tokens] (詳細なトークン) を選びます。

  4. [新しいトークンの生成] を選択します。

  5. [New fine-grained personal access token] (新しい詳細な個人用アクセス トークン) 画面で、次の値を入力します。

    設定
    トークン名 トークンの名前を入力します。
    [有効期限] [30 days] (30 日) を選びます。
    リポジトリ アクセス [Only select repositories] (リポジトリの選択のみ) を選んで、作成したリポジトリを選びます。

    [Repository permissions] (リポジトリのアクセス許可) に次の値を入力します。

    設定
    アクション [Read-only] (読み取りのみ) を選びます。
    管理 [Read and write] (読み取りと書き込み) を選びます。
    Metadata [Read-only] (読み取りのみ) を選びます。
  6. [Generate token](トークンの生成) を選択します。

  7. トークンの値をコピーします。

  8. 後でランナーとスケール ルールを構成するために使われる変数を定義します。

    GITHUB_PAT="<GITHUB_PAT>"
    REPO_OWNER="<REPO_OWNER>"
    REPO_NAME="<REPO_NAME>"
    

    プレースホルダーを次の値に置き換えます。

    プレースホルダー
    <GITHUB_PAT> 生成した GitHub PAT。
    <REPO_OWNER> 前に作成したリポジトリの所有者。 通常、この値は GitHub のユーザー名です。
    <REPO_NAME> 前に作成したリポジトリの名前。 この値は、[Repository name] (リポジトリ名) フィールドに入力した名前と同じです。

GitHub Actions ランナーのコンテナー イメージをビルドする

セルフホステッド ランナーを作成するには、ランナーを実行するコンテナー イメージをビルドする必要があります。 このセクションでは、コンテナー イメージをビルドして、コンテナー レジストリにそれをプッシュします。

Note

このチュートリアルでビルドするイメージには、Container Apps ジョブとして実行するのに適した基本的なセルフホステッド ランナーが含まれています。 ワークフローに必要な追加のツールや依存関係を含むようにカスタマイズできます。

  1. コンテナー イメージとレジストリの名前を定義します。

    CONTAINER_IMAGE_NAME="github-actions-runner:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    <CONTAINER_REGISTRY_NAME> を、コンテナー レジストリを作成するための一意の名前に置き換えます。 コンテナー レジストリ名は、"Azure 内で一意" であり、数字と小文字のみを含む 5 文字から 50 文字の長さにする必要があります。

  2. コンテナー レジストリを作成します。

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. マネージド ID を使用してイメージをプルするには、コンテナー レジストリで Azure Resource Manager (ARM) 対象ユーザー トークンを認証に使用できるようにする必要があります。

    次のコマンドを使用して、自分の Azure Container Registry (ACR) に ARM トークンがアクセスできるかどうかを確認します。

    az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"
    

    ARM トークンが許可されている場合、コマンドの出力は次のようになります。

    {
      "status": "enabled"
    }
    

    statusdisabled である場合は、次のコマンドを使用して ARM トークンを許可します。

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. ランナー イメージを作成するための Dockerfile は、GitHub で入手できます。 次のコマンドを実行してリポジトリをクローンし、クラウドで az acr build コマンドを使ってコンテナー イメージを構築します。

    az acr build \
        --registry "$CONTAINER_REGISTRY_NAME" \
        --image "$CONTAINER_IMAGE_NAME" \
        --file "Dockerfile.github" \
        "https://github.com/Azure-Samples/container-apps-ci-cd-runner-tutorial.git"
    

    これで、コンテナー レジストリでイメージを使用できるようになります。

ユーザー割り当てマネージド ID を作成する

管理資格情報の使用を避けるために、マネージド ID を認証に使用して Microsoft Azure Container Registry のプライベート リポジトリからイメージをプルできます。 可能な限り、イメージのプルにはユーザー割り当てマネージド ID を使用します。

  1. 「ユーザー割り当てマネージド ID を作成する」の手順を使用して、ユーザー割り当てマネージド ID を作成します。 次のコマンドを実行する前に、マネージド ID の名前を選択し、\<PLACEHOLDER\> をその名前に置き換えます。

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. この ID のリソース ID を取得します。

    IDENTITY_ID=$(az identity show \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    

セルフホステッド ランナーをジョブとしてデプロイする

これで、コンテナー イメージを使うためのジョブを作成できます。 このセクションでは、セルフホステッド ランナーを実行し、前に生成した PAT を使って GitHub での認証を行うジョブを作成します。 このジョブでは、github-runner スケール ルールを使い、保留中のワークフロー実行の数に基づいてジョブの実行を作成します。

  1. Container Apps 環境でジョブを作成します。

    az containerapp job create \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT" \
        --trigger-type Event \
        --replica-timeout 1800 \
        --replica-retry-limit 0 \
        --replica-completion-count 1 \
        --parallelism 1 \
        --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \
        --min-executions 0 \
        --max-executions 10 \
        --polling-interval 30 \
        --scale-rule-name "github-runner" \
        --scale-rule-type "github-runner" \
        --scale-rule-metadata "githubAPIURL=https://api.github.com" "owner=$REPO_OWNER" "runnerScope=repo" "repos=$REPO_NAME" "targetWorkflowQueueLength=1" \
        --scale-rule-auth "personalAccessToken=personal-access-token" \
        --cpu "2.0" \
        --memory "4Gi" \
        --secrets "personal-access-token=$GITHUB_PAT" \
        --env-vars "GITHUB_PAT=secretref:personal-access-token" "GH_URL=https://github.com/$REPO_OWNER/$REPO_NAME" "REGISTRATION_TOKEN_API_URL=https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/actions/runners/registration-token" \
        --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io" \
        --mi-user-assigned "$IDENTITY_ID" \
        --registry-identity "$IDENTITY_ID"
    

    次の表で、コマンドで使われるキー パラメーターについて説明します。

    パラメーター 説明
    --replica-timeout レプリカが実行できる最長時間。
    --replica-retry-limit 失敗したレプリカを再試行する回数。
    --replica-completion-count このレプリカ数が正常に完了すると、ジョブの実行を成功と見なします。
    --parallelism ジョブの実行ごとに開始するレプリカ数。
    --min-executions ポーリング間隔ごとに実行するジョブの実行の最小数。
    --max-executions ポーリング間隔ごとに実行するジョブの実行の最大数。
    --polling-interval スケール ルールを評価するポーリング間隔。
    --scale-rule-name スケール ルールの名前。
    --scale-rule-type 使うスケール ルールの種類。 GitHub ランナー スケーラーについて詳しくは、KEDA のドキュメントをご覧ください。
    --scale-rule-metadata スケール ルールのメタデータ。 GitHub Enterprise を使用している場合は、その API URL を使用して githubAPIURL を更新します。
    --scale-rule-auth スケール ルールの認証。
    --secrets ジョブに使うシークレット。
    --env-vars ジョブに使う環境変数。
    --registry-server ジョブに使うコンテナー レジストリ サーバー。 Azure Container Registry の場合、このコマンドによって認証が自動的に構成されます。
    --mi-user-assigned ジョブに割り当てるユーザー割り当てマネージド ID のリソース ID。
    --registry-identity レジストリ サーバーで認証するためにユーザー名とパスワードの代わりに使用するマネージド ID のリソース ID。 可能な場合は、ID に対して "acrpull" ロールの割り当てが自動的に作成されます。

    スケール ルールの構成によって、監視するイベント ソースを定義します。 ルールはポーリング間隔ごとに評価されて、トリガーするジョブ実行の数を決定します。 詳細については、スケーリング ルールの設定に関する記事を参照してください。

これでイベントドリブン ジョブが Container Apps 環境に作成されました。

ワークフローを実行してジョブを検証する

このジョブは、スケール ルールを 30 秒ごとに評価するように構成されています。 各評価の間に、セルフホステッド ランナーを必要とする保留中のワークフロー実行の数がチェックされ、構成されている最大実行回数の 10 を上限として、保留中のワークフローの新しいジョブ実行が開始されます。

ジョブが正しく構成されたことを確認するため、セルフホステッド ランナーを使うようにワークフローを変更して、ワークフローの実行をトリガーします。 その後、ジョブ実行ログを表示して、ワークフローの実行を確認できます。

  1. GitHub リポジトリで、前に生成したワークフローに移動します。 これは、.github/workflows ディレクトリ内の YAML ファイルです。

  2. [Edit in place] (インプレース編集) を選びます。

  3. runs-on プロパティを self-hosted に更新します。

    runs-on: self-hosted
    
  4. [変更をコミットする] を選択します。

  5. [変更点のコミット] を選択します。

  6. [Actions] (アクション) タブに移動します。

    新しいワークフローがキューに登録されました。 30 秒以内にジョブの実行が開始され、その後すぐにワークフローが完了します。

    アクションが完了するまで待ってから、次のステップに進みます。

  7. ジョブの実行の一覧を表示し、ジョブの実行が正常に作成されて完了したことを確認します。

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output table \
        --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
    

Azure DevOps のプロジェクトとリポジトリを作成する

パイプラインを実行するには、Azure DevOps のプロジェクトとリポジトリが必要です。

  1. Azure DevOps に移動し、アカウントにサインインします。

  2. 既存の組織を選ぶか、新しく作成します。

  3. 組織の概要ページで、[新しいプロジェクト] を選んで次の値を入力します。

    設定 [値]
    プロジェクト名 プロジェクトの名前を入力します。
    表示 [プライベート] を選択します。
  4. [作成] を選択します。

  5. サイド ナビゲーションから、[リポジトリ] を選びます。

  6. [Initialize main branch with a README or .gitignore] (README または .gitignore を使用してメイン ブランチを初期化する) で、[Add a README] (README の追加) を選びます。

  7. 残りの値は既定値のままにして、[初期化] を選びます。

新しいエージェント プールを作成する

セルフホステッド ランナーを実行するための新しいエージェント プールを作成します。

  1. Azure DevOps プロジェクトで、左側のナビゲーション バーを展開し、[プロジェクトの設定] を選びます。

    Azure DevOps プロジェクト設定ボタンのスクリーンショット。

  2. [プロジェクトの設定] ナビゲーション メニューの [パイプライン] セクションで、[エージェント プール] を選びます。

    Azure DevOps エージェント プール ボタンのスクリーンショット。

  3. [プールの追加] を選んで、次の値を入力します。

    設定
    リンクするプール 新規をクリックします。
    プールの種類 [セルフホステッド] を選びます。
    名前 container-apps」と入力します。
    すべてのパイプラインへのアクセス許可を与える このチェック ボックスをオンにします。
  4. [作成] を選択します。

Azure DevOps の個人用アクセス トークンを取得する

セルフホステッド ランナーを実行するには、Azure DevOps で個人用アクセス トークン (PAT) を作成する必要があります。 PAT は、Azure DevOps でランナーの認証を行うために使われます。 また、スケール ルールによって、保留中のパイプライン実行の数を特定し、新しいジョブの実行をトリガーするためにも使われます。

[!注意]

個人用アクセス トークン (PAT) には有効期限があります。 サービスを中断しないように、トークンを定期的にローテーションして有効な (期限切れではない) 状態を維持します。

  1. Azure DevOps で、右上隅にあるユーザーのプロファイル画像の横の [ユーザー設定] を選びます。

  2. [Personal access tokens] (個人用アクセス トークン) を選択します。

  3. [個人用アクセス トークン] ページで [新しいトークン] を選び、次の値を入力します。

    設定
    名前 トークンの名前を入力します。
    組織 前に選択または作成した組織を選びます。
    スコープ [カスタム定義] を選びます。
    すべてのスコープを表示する [すべてのスコープを表示する] をオンにします。
    エージェント プール (読み取り、管理) [エージェント プール (読み取り、管理)] をオンにします。

    その他のスコープはすべてオフのままにします。

  4. [作成] を選択します。

  5. トークンの値を安全な場所にコピーします。

    ページを離れた後はトークンを取得できません。

  6. 後で Container Apps ジョブを構成するために使われる変数を定義します。

    AZP_TOKEN="<AZP_TOKEN>"
    ORGANIZATION_URL="<ORGANIZATION_URL>"
    AZP_POOL="container-apps"
    REGISTRATION_TOKEN_API_URL="<YOUR_REGISTRATION_TOKEN_API_URL>"
    

    プレースホルダーを次の値に置き換えます。

    プレースホルダー 説明
    <AZP_TOKEN> 生成した Azure DevOps の PAT。
    <ORGANIZATION_URL> Azure DevOps 組織の URL。 URL の末尾に / が存在していないことを確認します。 たとえば、https://dev.azure.com/myorg または https://myorg.visualstudio.com です。
    <YOUR_REGISTRATION_TOKEN_API_URL> entrypoint.sh ファイル内の登録トークン API URL。 たとえば、'https://myapi.example.com/get-token' です

Azure Pipelines エージェントのコンテナー イメージをビルドする

セルフホステッド エージェントを作成するには、エージェントを実行するコンテナー イメージをビルドする必要があります。 このセクションでは、コンテナー イメージをビルドして、コンテナー レジストリにそれをプッシュします。

Note

このチュートリアルでビルドするイメージには、Container Apps ジョブとして実行するのに適した基本的なセルフホステッド エージェントが含まれています。 パイプラインに必要な追加のツールや依存関係を含むようにカスタマイズできます。

  1. ターミナルに戻り、コンテナー イメージとレジストリの名前を定義します。

    CONTAINER_IMAGE_NAME="azure-pipelines-agent:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    <CONTAINER_REGISTRY_NAME> を、コンテナー レジストリを作成するための一意の名前に置き換えます。

    コンテナー レジストリ名は、"Azure 内で一意" であり、数字と小文字のみを含む 5 文字から 50 文字の長さにする必要があります。

  2. コンテナー レジストリを作成します。

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic \
        --admin-enabled true
    
  3. ランナー イメージを作成するための Dockerfile は、GitHub で入手できます。 次のコマンドを実行してリポジトリをクローンし、クラウドで az acr build コマンドを使ってコンテナー イメージを構築します。

    az acr build \
        --registry "$CONTAINER_REGISTRY_NAME" \
        --image "$CONTAINER_IMAGE_NAME" \
        --file "Dockerfile.azure-pipelines" \
        "https://github.com/Azure-Samples/container-apps-ci-cd-runner-tutorial.git"
    

    これで、コンテナー レジストリでイメージを使用できるようになります。

プレースホルダーのセルフホステッド エージェントを作成する

新しいエージェント プールでセルフホステッド エージェントを実行するには、その前にプレースホルダー エージェントを作成する必要があります。 プレースホルダー エージェントは、エージェント プールが使用可能であることを保証します。 プレースホルダー エージェントがない場合、エージェント プールを使うパイプラインは失敗します。

手動ジョブを実行して、オフライン プレースホルダー エージェントを登録できます。 ジョブは 1 回実行され、削除できます。 プレースホルダー エージェントは、Azure Container Apps または Azure DevOps のリソースを消費しません。

  1. プレースホルダー エージェントを作成する Container Apps 環境で手動ジョブを作成します。

    az containerapp job create -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP" --environment "$ENVIRONMENT" \
        --trigger-type Manual \
        --replica-timeout 300 \
        --replica-retry-limit 0 \
        --replica-completion-count 1 \
        --parallelism 1 \
        --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \
        --cpu "2.0" \
        --memory "4Gi" \
        --secrets "personal-access-token=$AZP_TOKEN" "organization-url=$ORGANIZATION_URL" \
        --env-vars "AZP_TOKEN=secretref:personal-access-token" "AZP_URL=secretref:organization-url" "AZP_POOL=$AZP_POOL" "AZP_PLACEHOLDER=1" "AZP_AGENT_NAME=placeholder-agent" \
        --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"
    

    次の表で、コマンドで使われるキー パラメーターについて説明します。

    パラメーター 説明
    --replica-timeout レプリカが実行できる最長時間。
    --replica-retry-limit 失敗したレプリカを再試行する回数。
    --replica-completion-count このレプリカ数が正常に完了すると、ジョブの実行を成功と見なします。
    --parallelism ジョブの実行ごとに開始するレプリカ数。
    --secrets ジョブに使うシークレット。
    --env-vars ジョブに使う環境変数。
    --registry-server ジョブに使うコンテナー レジストリ サーバー。 Azure Container Registry の場合、このコマンドによって認証が自動的に構成されます。

    AZP_PLACEHOLDER 環境変数を設定すると、ジョブを実行せずにオフライン プレースホルダー エージェントとして登録するように、エージェント コンテナーが構成されます。

  2. 手動ジョブを実行してプレースホルダー エージェントを作成します。

    az containerapp job start -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP"
    
  3. ジョブの実行の一覧を表示し、ジョブの実行が正常に作成されて完了したことを確認します。

    az containerapp job execution list \
        --name "$PLACEHOLDER_JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output table \
        --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
    
  4. プレースホルダー エージェントが Azure DevOps に作成されたことを確認します。

    1. Azure DevOps で、お使いのプロジェクトに移動します。
    2. [プロジェクトの設定]>[エージェント プール]>container-apps>[エージェント] を選びます。
    3. placeholder-agent という名前のプレースホルダー エージェントが一覧に表示され、その状態がオフラインであることを確認します。
  5. このジョブはもう必要ありません。 これは削除することができます。

    az containerapp job delete -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP"
    

セルフホステッド エージェントをイベント ドリブン ジョブとして作成する

プレースホルダー エージェントができたので、セルフホステッド エージェントを作成できます。 このセクションでは、パイプラインがトリガーされたらセルフホステッド エージェントを実行するイベント ドリブン ジョブを作成します。

az containerapp job create -n "$JOB_NAME" -g "$RESOURCE_GROUP" --environment "$ENVIRONMENT" \
    --trigger-type Event \
    --replica-timeout 1800 \
    --replica-retry-limit 0 \
    --replica-completion-count 1 \
    --parallelism 1 \
    --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \
    --min-executions 0 \
    --max-executions 10 \
    --polling-interval 30 \
    --scale-rule-name "azure-pipelines" \
    --scale-rule-type "azure-pipelines" \
    --scale-rule-metadata "poolName=$AZP_POOL" "targetPipelinesQueueLength=1" \
    --scale-rule-auth "personalAccessToken=personal-access-token" "organizationURL=organization-url" \
    --cpu "2.0" \
    --memory "4Gi" \
    --secrets "personal-access-token=$AZP_TOKEN" "organization-url=$ORGANIZATION_URL" \
    --env-vars "AZP_TOKEN=secretref:personal-access-token" "AZP_URL=secretref:organization-url" "AZP_POOL=$AZP_POOL" \
    --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"

次の表では、コマンドで使われるスケール ルールのパラメーターについて説明します。

パラメーター 説明
--min-executions ポーリング間隔ごとに実行するジョブの実行の最小数。
--max-executions ポーリング間隔ごとに実行するジョブの実行の最大数。
--polling-interval スケール ルールを評価するポーリング間隔。
--scale-rule-name スケール ルールの名前。
--scale-rule-type 使うスケール ルールの種類。 Azure Pipelines のスケーラーについて詳しくは、KEDA のドキュメントをご覧ください。
--scale-rule-metadata スケール ルールのメタデータ。
--scale-rule-auth スケール ルールの認証。

スケール ルールの構成によって、監視するイベント ソースを定義します。 ルールはポーリング間隔ごとに評価されて、トリガーするジョブ実行の数を決定します。 詳細については、スケーリング ルールの設定に関する記事を参照してください。

これでイベントドリブン ジョブが Container Apps 環境に作成されました。

パイプラインを実行してジョブを検証する

セルフホステッド エージェント ジョブを構成したら、パイプラインを実行し、正常に動作していることを検証できます。

  1. Azure DevOps プロジェクトの左側のナビゲーションで、[パイプライン] に移動します。

  2. [パイプラインを作成] を選択します。

  3. コードの場所として [Azure Repos Git] を選択します。

  4. 以前に選択したリポジトリを選択します。

  5. [スタート パイプライン] を選択します。

  6. パイプラインの YAML で、poolvmImage: ubuntu-latest から name: container-apps に変更します。

    pool:
      name: container-apps
    
  7. [保存および実行] を選択します。

    パイプラインは、実行すると、Container Apps 環境で作成したセルフホステッド エージェント ジョブを使います。

  8. ジョブの実行の一覧を表示し、ジョブの実行が正常に作成されて完了したことを確認します。

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output table \
        --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
    

ヒント

問題がある場合は、 GitHub の Azure Container Apps リポジトリでイシューを開いて、お知らせください。

リソースをクリーンアップする

完了したら、次のコマンドを実行して、Container Apps のリソースを含むリソース グループを削除します。

注意事項

次のコマンドを実行すると、指定されたリソース グループとそれに含まれるすべてのリソースが削除されます。 指定したリソース グループにこのチュートリアルの範囲外のリソースが含まれている場合、それらも削除されます。

az group delete \
    --resource-group $RESOURCE_GROUP

GitHub リポジトリの削除については、「リポジトリの削除」をご覧ください。

次のステップ