パイプラインを構成し、更新をプッシュする
この記事では、Azure Developer CLI (azd
) を使用して、GitHub アクションや Azure DevOps などの CI/CD パイプラインを介してテンプレートの変更をプッシュする方法について学びます。 この例では、Azure 上で Node.js API と MongoDB を使用した React Web アプリのテンプレートを使用しますが、この記事で学習した原則を任意の Azure Developer CLI テンプレートに適用できます。
Note
azd pipeline config
コマンドはまだベータ版です。 アルファ版とベータ版の機能サポートの詳細については、「機能のバージョン管理とリリース戦略」を参照してください。
前提条件
- Azure Developer CLI をインストールします。
- Node.js テンプレートをデプロイします。
- Visual Studio Code がインストールされていること。
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 用パイプライン定義を作成」を参照してください。
azd pipeline config
コマンドを使用して CI/CD パイプラインを構成し、次のタスクを処理します。
- Azure サブスクリプション上にアプリのサービス プリンシパルを作成して構成する。 azd でロールを作成してサービス プリンシパルに割り当てることができるようにするには、Azure サブスクリプション内でユーザーに
Owner
ロールまたはContributor + User Access Administrator
ロールを付与する必要があります。 - GitHub または Azure DevOps リポジトリを作成して構成し、それにプロジェクト コードをコミットするワークフローの手順を説明します。 既存のリポジトリを使用することもできます。
- Azure とリポジトリの間にセキュリティで保護された接続を作成します。
- ワークフロー ファイルにチェックするときに、GitHub アクションを実行します。
このプロセスをより細かく制御するために、またはユーザーに必要なロールが付与されていない場合は、パイプラインを手動で構成できます。
続行するには、任意のパイプライン プロバイダーを選択します。
Azure にデプロイするための GitHub を承認する
ワークフローを構成するには、GitHub アクションから、代わりに Azure にデプロイするサービス プリンシパルを承認する必要があります。 azd
では、サービス プリンシパルとそのフェデレーション資格情報が作成されます。
次のコマンドを実行して、Azure サービス プリンシパルを作成し、パイプラインを構成します。
azd pipeline config
必要に応じて、このコマンドは、GitHub リポジトリを作成して、新しいリポジトリにコードをプッシュします。
Note
既定では、
azd pipeline config
は OpenID接続 (OIDC) を使用します。これは「フェデレーション資格情報」と呼ばれます。 あえて OIDC を使用したくない場合は、azd pipeline config --auth-type client-credentials
を実行します。OIDC/フェデレーション資格情報は、Terraform ではサポートされていません。
要求された GitHub 情報を指定します。
ローカルの変更をコミットしてプッシュし、新しい GitHub アクションの実行を開始するかどうかについてプロンプトが表示されたら、
y
を指定します。ターミナル ウィンドウで、
azd pipeline config
コマンドの結果を表示します。 このazd pipeline config
コマンドにより、プロジェクトの GitHub リポジトリ名が出力されます。ブラウザーを使用して、プロジェクトの GitHub リポジトリを開きます。
[アクション] を選択して、ワークフローが実行されているのを確認します。
コード変更を行ってプッシュする
プロジェクトの
/src/web/src/layout
ディレクトリで、header.tsx
を開きます。<Text variant="xLarge">ToDo</Text>
の行を見つけます。リテラル
ToDo
をmyTodo
に変更します 。ファイルを保存します。
変更を [コミット] します。 変更をコミットすると、GitHub Action パイプラインが開始され、更新プログラムがデプロイされます。
ブラウザーを使用して、プロジェクトの GitHub リポジトリを開き、以下の両方を表示します。
- あなたのコミット
- セットアップ中の GitHub アクションからのコミット。
[アクション] を選択すると、テストの更新がワークフローに反映されます。
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 id
、environment name
、region
を作成します。 パイプライン定義は、次の変数を参照します。
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: write
とcontents: 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 }}