パイプラインを構成し、更新をプッシュする

この記事では、Azure Developer CLI (azd) を使用して、GitHub アクションや Azure DevOps などの CI/CD パイプラインを介してテンプレートの変更をプッシュする方法について学びます。 この例では、Azure 上で Node.js API と MongoDB を使用した React Web アプリのテンプレートを使用しますが、この記事で学習した原則を任意の Azure Developer CLI テンプレートに適用できます。

Note

azd pipeline config コマンドはまだベータ版です。 アルファ版とベータ版の機能サポートの詳細については、「機能のバージョン管理とリリース戦略」を参照してください。

前提条件

azd テンプレートには、azure-dev.yml と呼ばれる既定の GitHub Actions や Azure DevOps パイプライン構成ファイルが含まれる場合や含まれない場合がありますが、これは、CI/CD のセットアップに必要です。 この構成ファイルは、Azure リソースをプロビジョニングし、コードをメイン ブランチにデプロイします。 azure-dev.yml を見つけることができます。

  • GitHub アクションの場合: .github/workflows ディレクトリ内の
  • Azure DevOps の場合: .azdo/pipelines ディレクトリ内の

構成ファイルをそのまま使用することも、ニーズに合わせて変更することもできます。

Note

azd pipeline config を呼び出す前に、テンプレートにパイプライン定義 (azure-dev.yaml) があることを確認します。 azd では、このファイルは自動作成されません。 以下の「azd 用パイプライン定義を作成」を参照してください。

CI/CD パイプラインを構成するには、azd pipeline config コマンドを使用します。これは次のタスクを処理します。

  • Azure サブスクリプション上にアプリのサービス プリンシパルを作成して構成する。 azd がロールを作成してサービス プリンシパルに割り当てることができるようにするには、Azure サブスクリプション内でユーザーに Owner ロールまたは Contributor + User Access Administrator ロールを付与する必要があります。
  • GitHub または Azure DevOps リポジトリを作成して構成し、それにプロジェクト コードをコミットするワークフローの手順を説明します。 既存のリポジトリを使用することもできます。
  • Azure とリポジトリの間にセキュリティで保護された接続を作成します。
  • ワークフロー ファイルにチェックするときに、GitHub アクションを実行します。

このプロセスをより細かく制御するために、またはユーザーに必要なロールが付与されていない場合は、パイプラインを手動で構成できます。

続行するには、任意のパイプライン プロバイダーを選択します。

Azure にデプロイするための GitHub を承認する

ワークフローを構成するには、GitHub アクションから、代わりに Azure にデプロイするサービス プリンシパルを承認する必要があります。 azd では、サービス プリンシパルとそのフェデレーション資格情報が作成されます。

  1. 次のコマンドを実行して、Azure サービス プリンシパルを作成し、パイプラインを構成します。

    azd pipeline config
    

    必要に応じて、このコマンドは、GitHub リポジトリを作成して、新しいリポジトリにコードをプッシュします。

    Note

    既定では、azd pipeline configOpenID接続 (OIDC) を使用します。これは「フェデレーション資格情報」と呼ばれます。 あえて OIDC を使用したくない場合は、azd pipeline config --auth-type client-credentials を実行します。

    OIDC/フェデレーション資格情報は、Terraform ではサポートされていません

    azd での OIDC サポートの詳細を学びます。

  2. 要求された GitHub 情報を指定します。

  3. ローカルの変更をコミットしてプッシュし、新しい GitHub アクションの実行を開始するかどうかについてプロンプトが表示されたら、y を指定します。

  4. ターミナル ウィンドウで、azd pipeline config コマンドの結果を表示します。 この azd pipeline config コマンドにより、プロジェクトの GitHub リポジトリ名が出力されます。

  5. ブラウザーを使用して、プロジェクトの GitHub リポジトリを開きます。

  6. [アクション] を選択して、ワークフローが実行されているのを確認します。

    GitHub ワークフロー実行中のスクリーンショット。

コード変更を行ってプッシュする

  1. プロジェクトの /src/web/src/layout ディレクトリで、header.tsx を開きます。

  2. <Text variant="xLarge">ToDo</Text> の行を見つけます。

  3. リテラル ToDomyTodo に変更します 。

  4. ファイルを保存します。

  5. 変更を [コミット] します。 変更をコミットすると、GitHub Action パイプラインが開始され、更新プログラムがデプロイされます。

    テストファイルへの変更を行ってコミットするために必要な手順のスクリーンショット。

  6. ブラウザーを使用して、プロジェクトの GitHub リポジトリを開き、以下の両方を表示します。

    • あなたのコミット
    • セットアップ中の GitHub アクションからのコミット。

    GitHubにコミットした変更のスクリーンショット。

  7. [アクション] を選択すると、テストの更新がワークフローに反映されます。

    テストの更新後の GitHub ワークフロー実行中のスクリーンショット。

  8. Web フロントエンド URL にアクセスして、更新プログラムを検査します。

GitHub アクションとしての azd

azd を GitHub アクションとして追加します。 このアクションにより、azd がインストールされます。 それを使用するには、以下を .github\workflows\azure-dev.yml に追加します。

on: [push]

jobs:
   build:
      runs-on: ubuntu-latest
      steps:
         - name: Install azd
         uses: Azure/setup-azd@v0.1.0

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

この記事で作成した Azure リソースが不要になったら、次のコマンドを実行してください。

azd down

高度な機能

次のセクションで説明するように、特定のテンプレート シナリオまたは要件に合わせて azd pipeline config コマンドを拡張できます。

追加のシークレットまたは変数

既定で、azd はパイプラインに対して変数とシークレットを設定します。 たとえば、azd pipeline config コマンドを実行するたびに、このコマンドは、パイプライン変数として、subscription idenvironment nameregion を作成します。 パイプライン定義は、次の変数を参照します。

env:
   AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
   AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
   AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
   AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
   AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}

パイプラインが実行されると、azd は、環境から値を取得します。これは、変数とシークレットにマッピングされます。 テンプレートによっては、環境変数を使用して制御できる設定が存在する場合があります。 たとえば、テンプレート インフラストラクチャ内で Key Vault リソースの名前を定義するように、KEY_VAULT_NAME という名前の環境変数を設定できます。 このような場合は、azure.yaml を使用して、テンプレートで変数とシークレットのリストを定義できます。 たとえば、次のような azure.yaml 構成があるとします。

pipeline:
  variables:
    - KEY_VAULT_NAME
    - STORAGE_NAME
  secrets:
    - CONNECTION_STRING

この構成では、azdは、環境内にいずれかの変数またはシークレットが空でない値を維持しているかチェックします。 次に、azd は、構成内のキーの名前を変数またはシークレットの名前とし、値の環境からの非文字列値として使用しパイプライン用の変数またはシークレットのいずれかを作成します。

の後、azure-dev.yaml パイプライン定義は、そ変数またはシークレットを参照できます。

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      KEY_VAULT_NAME: ${{ variables.KEY_VAULT_NAME }}
      STORAGE_NAME: ${{ variables.STORAGE_NAME }}
      CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}

Note

パイプライン値をリセットするため、azd 用の azure.yaml でシークレットまたは変数の一覧を更新した後に、azd pipeline config を実行する必要があります。

インフラストラクチャ パラメータ

次の Bicep 例について考えてみます。

@secure()
param BlobStorageConnection string

BlobStorageConnection パラメーターには、既定の値が設定されているので、azd はユーザーに値を入力するように求めます。 ただし、CI/CD 中は、対話型プロンプトはありません。 azd は、azd pipeline config 実行時にパラメーターの値を要求し、パイプラインに値を保存してから、パイプライン実行時に値を再度フェッチする必要があります。

azd は、AZD_INITIAL_ENVIRONMENT_CONFIG と呼ばれるパイプライン シークレットを使用して、パイプライン内のすべての必要なパラメーターの値を自動保存および設定します。 このシークレットは、パイプライン内でのみ参照する必要があります。

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}

パイプライン実行時、azd はシークレットからパラメーターの値を取得するため、対話型プロンプトが不要になります。

Note

新しいパラメーターを追加する場合は、azd pipeline config を再実行する必要があります。

パイプライン定義を作成する

azd テンプレートに CI/CD パイプライン定義ファイルがまだない場合は、自分で作成できます。 CI/CD パイプライン定義には、通常、4 つのメイン セクションがあります。

  • トリガー (trigger)
  • アクセス許可
  • オペレーティング システムまたはプール
  • 実行する手順

次の例では、GitHub Actions と Azure Pipelines の定義ファイルと関連する構成を作成する方法を示します。

GitHub Actions で azd を実行するには、次の構成が必要です。

  • id-token: writecontents: read のアクセス スコープを付与します。
  • azd がすでにインストールされている Docker イメージを使用している場合を除き、azd アクションをインストールします

独自のパイプライン定義の開始点として、次のテンプレートを使用できます。

on:
  workflow_dispatch:
  push:
    # Run when commits are pushed to mainline branch (main or master)
    # Set this to the mainline branch you are using
    branches:
      - main
      - master

# Set this permission if you are using a Federated Credential.
permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    # azd build-in variables.
    # This variables are always set by `azd pipeline config`
    # You can set them as global env (apply to all steps) or you can add them to individual steps' environment
    env:
      AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
      AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
      AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
      ## Define the additional variables or secrets that are required globally (provision and deploy)
      # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
      # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}      
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      # using the install-azd action
      - name: Install azd
        uses: Azure/setup-azd@v1.0.0

      # # If you want to use azd-daily build, or install it from a PR, you can remove previous step and
      # # use the next one:
      # - name: Install azd - daily or from PR
      #  # Update this scrip based on the OS - pool of your pipeline. This example is for a linux pipeline installing daily build
      #  run: curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --version daily
      #  shell: pwsh

      # azd set up Federated Credential by default. You can remove this step if you are using Client Credentials
      - name: Log in with Azure (Federated Credentials)
        if: ${{ env.AZURE_CLIENT_ID != '' }}
        run: |
          azd auth login `
            --client-id "$Env:AZURE_CLIENT_ID" `
            --federated-credential-provider "github" `
            --tenant-id "$Env:AZURE_TENANT_ID"
        shell: pwsh

      ## If you set up your pipeline with Client Credentials, remove previous step and uncomment this one
      # - name: Log in with Azure (Client Credentials)
      #   if: ${{ env.AZURE_CREDENTIALS != '' }}
      #   run: |
      #     $info = $Env:AZURE_CREDENTIALS | ConvertFrom-Json -AsHashtable;
      #     Write-Host "::add-mask::$($info.clientSecret)"

      #     azd auth login `
      #       --client-id "$($info.clientId)" `
      #       --client-secret "$($info.clientSecret)" `
      #       --tenant-id "$($info.tenantId)"
      #   shell: pwsh
      #   env:
      #     AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Provision Infrastructure
        run: azd provision --no-prompt
        env:
         #  # uncomment this if you are using infrastructure parameters
         #  AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}
         ## Define the additional variables or secrets that are required only for provision 
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}

      - name: Deploy Application
        run: azd deploy --no-prompt
        env:
         ## Define the additional variables or secrets that are required only for deploy
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}