次の方法で共有


GitHub Actions を使用した App Service へのデプロイ

GitHub Actions を使用して、GitHub からワークフローの自動化と Azure App Service へのデプロイを実行します。

前提条件

アプリ作成時の GitHub Actions デプロイを設定する

GitHub Actions デプロイは、既定のアプリ作成ウィザードに統合されています。 必要な作業は、[デプロイ] タブで [継続的デプロイ][有効にする] に設定し、必要な組織、リポジトリ、ブランチを構成することだけになります。

App Service 作成ウィザードで GitHub Actions のデプロイを有効にする方法を示すスクリーンショット。

継続的デプロイを有効にすると、アプリ作成ウィザードにより、基本認証の選択に基づいて認証方法が自動的に選択され、お使いのアプリと GitHub リポジトリが適宜構成されます。

基本認証の選択 認証方法
Disable ユーザー割り当て ID (OpenID Connect) (推奨)
有効にする 基本認証

Note

アプリの作成時、お使いの Azure アカウントに特定のアクセス許可がないというエラーが表示された場合、ユーザー割り当て ID の作成と構成に必要なアクセス許可が与えられていない可能性があります。 代替方法については、「デプロイ センターから GitHub Actions デプロイを設定する」を参照してください。

デプロイ センターから GitHub Actions デプロイを設定する

既存のアプリの場合、App Service デプロイ センターを利用することで GitHub Actions の使用を簡単に始めることができます。 面倒な設定の要らないこの方法では、ご利用のアプリケーション スタックに基づいて GitHub Actions ワークフロー ファイルが自動的に生成され、GitHub リポジトリにコミットされます。

デプロイ センターではまた、ユーザー割り当て ID オプションを利用することで、より安全な OpenID Connect 認証を簡単に構成できます。

必要なアクセス許可がお使いの Azure アカウントに与えられている場合、ユーザー割り当て ID の作成を選択できます。 必要なアクセス許可がない場合、[ID] ドロップダウンで既存のユーザー割り当てマネージド ID を選択できます。 Web サイト共同作成者ロールを利用すると、Azure 管理者と共同でユーザー割り当てマネージド ID を作成できます。

詳しくは、「Azure App Service への継続的デプロイ」をご覧ください。

GitHub Actions ワークフローを手動設定する

デプロイ センターを使用せずにワークフローをデプロイすることもできます。 その場合は、次の 3 つの手順を実行する必要があります。

  1. デプロイ資格情報を生成する
  2. GitHub シークレットを構成する
  3. GitHub リポジトリにワークフロー ファイルを追加する

1.デプロイ資格情報を生成する

GitHub Actions 用の Azure App Services での認証で推奨される方法は、Open ID Connect を使用することです。 これは、短期間のトークンを使用する認証方法です。 GitHub Actions を使用して OpenID Connect を設定する場合、より複雑な作業になりますが、セキュリティが強化されます。

代わりに、ユーザー割り当てマネージド ID、サービス プリンシパル、または発行プロファイルを使用して認証することもできます。

以下に、Azure CLI ステートメントを使用して、Active Directory アプリケーション、サービス プリンシパル、およびフェデレーション資格情報を作成する手順について説明します。 Active Directory 作成アプリケーション、サービス プリンシパル、およびフェデレーション資格情報を Azure portal で作成する方法については、「Connect GitHub および Azure」を参照してください。

  1. 既存のアプリケーションがない場合は、リソースにアクセスできる新しい Active Directory アプリケーションとサービス プリンシパルを登録します。 Active Directory アプリケーションを作成します。

    az ad app create --display-name myApp
    

    このコマンドは、appId が自分の client-id である JSON を出力します。 後で AZURE_CLIENT_ID の GitHub シークレットとして使用する値を保存します。

    この objectId 値は、Graph API を使用してフェデレーション資格情報を作成するときに使用し、APPLICATION-OBJECT-ID として参照します。

  2. サービス プリンシパルを作成する。 $appID を、JSON 出力のアプリ ID に置き換えてください。

    このコマンドにより、異なる objectId を持つ JSON 出力が生成され、次のステップで使用されます。 新しい objectIdassignee-object-id です。

    後で AZURE_TENANT_ID の GitHub シークレットとして使用するために、appOwnerTenantId をコピーします。

     az ad sp create --id $appId
    
  3. サブスクリプションとオブジェクト別に新しいロールの割り当てを作成します。 既定では、このロールの割り当ては既定のサブスクリプションに紐づけられます。 $subscriptionId をサブスクリプション ID に、$resourceGroupName をリソース グループ名に、$webappName を Web アプリ名に、$assigneeObjectId を生成された id に置き換えます。 Azure CLI を使用して Azure サブスクリプションを管理する方法について説明します。

    az role assignment create --role contributor --subscription $subscriptionId --assignee-object-id  $assigneeObjectId --scope /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$webappName --assignee-principal-type ServicePrincipal
    
  4. 次のコマンドを実行して、Active Directory アプリケーションの新しいフェデレーション ID 資格情報を作成します。

    • APPLICATION-OBJECT-ID を Active Directory アプリケーションの appId (アプリ作成時に生成) に置き換えてください。
    • 後で参照するには、CREDENTIAL-NAME の値を設定します。
    • subject を設定します。 この値は、以下のようにワークフローに応じて、GitHub によって定義されます。
      • GitHub Actions 環境のジョブ: repo:< Organization/Repository >:environment:< Name >
      • 環境に関連付けられていないジョブの場合は、ワークフローのトリガーに使用される ref パスに基づいて、ブランチ/タグの ref パスを含めます: repo:< Organization/Repository >:ref:< ref path>。 たとえば、repo:n-username/ node_express:ref:refs/heads/my-branch または repo:n-username/ node_express:ref:refs/tags/my-tag です。
      • プル要求イベントによってトリガーされるワークフローの場合: repo:< Organization/Repository >:pull_request
    az ad app federated-credential create --id <APPLICATION-OBJECT-ID> --parameters credential.json
    ("credential.json" contains the following content)
    {
        "name": "<CREDENTIAL-NAME>",
        "issuer": "https://token.actions.githubusercontent.com",
        "subject": "repo:organization/repository:ref:refs/heads/main",
        "description": "Testing",
        "audiences": [
            "api://AzureADTokenExchange"
        ]
    }     
    

2.GitHub シークレットの構成

Azure/ログイン アクションにアプリケーションのクライアント IDテナント IDサブスクリプション ID を指定する必要があります。 これらの値は、ワークフロー内で直接指定するか、GitHub シークレットに格納してワークフローで参照できます。 GitHub シークレットとして値を保存する方がより安全なオプションです。

  1. GitHub リポジトリを開き、[設定] > [セキュリティ] > [シークレットと変数] > [アクション] > [新しいリポジトリ シークレット] の順に移動します。

  2. AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_SUBSCRIPTION_ID のシークレットを作成します。 GitHub シークレットには、Active Directory アプリケーションの次の値を使用します。

    GitHub シークレット Active Directory アプリケーション
    AZURE_CLIENT_ID アプリケーション (クライアント) ID
    AZURE_TENANT_ID ディレクトリ (テナント) ID
    AZURE_SUBSCRIPTION_ID サブスクリプション ID
  3. [Add secret](シークレットの追加) を選択して各シークレットを保存します。

3.GitHub リポジトリにワークフロー ファイルを追加する

ワークフローは、お使いの GitHub リポジトリの /.github/workflows/ パスの YAML (.yml) ファイルによって定義されます。 この定義には、ワークフローを構成するさまざまな手順とパラメーターが含まれます。

少なくとも、ワークフロー ファイルには次の個別の手順が想定されます。

  1. 作成した GitHub シークレットを利用して App Service を認証する
  2. Web アプリを作成します。
  3. Web アプリをデプロイします。

App Service にコードをデプロイするには、azure/webapps-deploy@v3 アクションを使用します。 このアクションでは、Web アプリの名前が app-name に必要となり、また、言語スタックに基づき、デプロイする *.zip、*.war、*.jar、またはフォルダーのパスが package に必要になります。 azure/webapps-deploy@v3 アクションの入力可能値の完全一覧については、action.yml 定義を参照してください。

以下の例は、サポートされているさまざまな言語で Web アプリをビルドするワークフローの一部です。

構成したマネージド ID を利用して OpenID Connect でデプロイするには、client-idtenant-idsubscription-id キーで azure/login@v1 アクションを使用し、前に参照した GitHub シークレットを参照します。

name: .NET Core

on: [push]

permissions:
      id-token: write
      contents: read

env:
  AZURE_WEBAPP_NAME: my-app    # set this to your application's name
  AZURE_WEBAPP_PACKAGE_PATH: '.'      # set this to the path to your web app project, defaults to the repository root
  DOTNET_VERSION: '6.0.x'           # set this to the dot net version to use

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Checkout the repo
      - uses: actions/checkout@main
      - uses: azure/login@v1
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      
      # Setup .NET Core SDK
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: ${{ env.DOTNET_VERSION }} 
      
      # Run dotnet build and publish
      - name: dotnet build and publish
        run: |
          dotnet restore
          dotnet build --configuration Release
          dotnet publish -c Release --property:PublishDir='${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp' 
          
      # Deploy to Azure Web apps
      - name: 'Run Azure webapp deploy action using publish profile credentials'
        uses: azure/webapps-deploy@v3
        with: 
          app-name: ${{ env.AZURE_WEBAPP_NAME }} # Replace with your app name
          package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp'
      
      - name: logout
        run: |
          az logout

よく寄せられる質問

Maven プラグインと OpenID Connect を使用して WAR ファイルをデプロイするにはどうすればいいですか

Maven プラグインを使用して Java Tomcat プロジェクトを構成した場合は、このプラグインを使用して Azure App Service にデプロイすることもできます。 Azure CLI GitHub アクションを使用する場合、Azure ログイン資格情報が使用されます。

    - name: Azure CLI script file
      uses: azure/cli@v2
      with:
        inlineScript: |
          mvn package azure-webapp:deploy

Maven プラグインに関する詳細と、その使用および構成方法については、Azure App Service の Maven プラグインに関する Wiki を参照してください。

AZ CLI と OpenID Connect を使用して WAR ファイルをデプロイするにはどうすればいいですか

Azure CLI を使用して App Service にデプロイする場合は、CLI 向け GitHub アクションを使用できます。

    - name: Azure CLI script
      uses: azure/cli@v2
      with:
        inlineScript: |
          az webapp deploy --src-path '${{ github.workspace }}/target/yourpackage.war' --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.RESOURCE_GROUP }}  --async true --type war

CLI 向け GitHub アクションに関する詳細と、その使用および構成方法については、Azure CLI の GitHub アクションに関する記事を参照してください。 az webapp deploy コマンドに関する詳細とその使用方法、およびパラメーターの詳細については、az webapp deploy に関するドキュメントを参照してください。

コンテナーにデプロイするにはどうすればいいですか

Azure Web Deploy アクションを使用すれば、カスタム コンテナーを App Service にデプロイするワークフローを、GitHub Actions を使用して自動化できます。 GitHub Actions を使用してデプロイする手順の詳細については、コンテナーへのデプロイに関する記事を参照してください。

デプロイ後に Tomcat 構成を更新するにはどうすればいいですか

デプロイ後にいずれかの Web アプリ設定を更新する場合は、App Service の設定アクションを使用できます。

    - uses: azure/appservice-settings@v1
      with:
        app-name: 'my-app'
        slot-name: 'staging'  # Optional and needed only if the settings have to be configured on the specific deployment slot
        app-settings-json: '[{ "name": "CATALINA_OPTS", "value": "-Dfoo=bar" }]' 
        connection-strings-json: '${{ secrets.CONNECTION_STRINGS }}'
        general-settings-json: '{"alwaysOn": "false", "webSocketsEnabled": "true"}' #'General configuration settings as Key Value pairs'
      id: settings

このアクションに関する詳細と、その使用および構成方法については、App Service の設定リポジトリを参照してください。

次のステップ

以下のように Azure GitHub Actions とワークフロー上の参照を確認します。