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

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

前提条件

ワークフロー ファイルの概要

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

このファイルには 3 つのセクションがあります。

Section タスク
認証 1.サービス プリンシパルまたは発行プロファイルを定義します。
2.GitHub シークレットを作成します。
ビルド 1.環境を設定します。
2.Web アプリを作成します。
展開 1.Web アプリをデプロイします。

デプロイ センターを使用する

App Service デプロイ センターを使用して、GitHub Actions の使用をすぐに開始できます。 これにより、アプリケーション スタックに基づくワークフロー ファイルが自動的に生成され、GitHub リポジトリの適切なディレクトリにコミットされます。

  1. Azure portal で自分の Web アプリに移動します。
  2. 左側の [デプロイ センター] をクリックします。
  3. [継続的デプロイ (CI/CD)] で、 [GitHub] を選択します。
  4. 次に、 [GitHub Actions] を選択します。
  5. ドロップダウンを使用して、自分の GitHub リポジトリ、ブランチ、およびアプリケーション スタックを選択します。
    • 選択したブランチが保護されている場合でも、ワークフロー ファイルの追加を続行できます。 続行する前に、ブランチの保護状態を確認してください。
  6. 最後の画面で、選択内容を確認し、リポジトリにコミットされるワークフロー ファイルをプレビューできます。 選択内容が適切であれば、 [完了] をクリックします。

これにより、ワークフロー ファイルがリポジトリにコミットされます。 アプリをビルドしてデプロイするワークフローがすぐに開始されます。

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

デプロイ センターを使用せずにワークフローをデプロイすることもできます。 これを行うには、最初にデプロイ資格情報を生成する必要があります。

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

GitHub Actions 用の Azure App Services での認証で推奨される方法は、発行プロファイルを使用することです。 サービス プリンシパルまたは Open ID Connect を使用して認証することもできますが、プロセスに必要な手順が多くなります。

発行プロファイル資格情報またはサービス プリンシパルを GitHub シークレットとして保存して、Azure で認証します。 ワークフロー内のシークレットにアクセスします。

発行プロファイルは、アプリレベルの資格情報です。 発行プロファイルを GitHub シークレットとして設定します。

  1. Azure portal で、お使いのアプリ サービスに移動します。

  2. [概要] ページで、 [発行プロファイルの取得] オプションを選択します。

  3. ダウンロードしたファイルを保存します。 このファイルの内容を使用して、GitHub シークレットを作成します。

Note

2020 年 10 月の時点では、Linux Web アプリでは、発行プロファイルをダウンロードする前に、アプリ設定 WEBSITE_WEBDEPLOY_USE_SCMtrue に設定する必要があります。 この要件は、今後削除される予定です。

GitHub シークレットの構成

GitHub でリポジトリを参照します。 [設定] > [セキュリティ] > [シークレットと変数] > [アクション] > [新しいリポジトリ シークレット] の順に選択します。

アプリ レベルの資格情報を使用するには、ダウンロードした発行プロファイルのファイルの内容をシークレットの値フィールドに貼り付けます。 シークレットに AZURE_WEBAPP_PUBLISH_PROFILE という名前を付けます。

GitHub ワークフローを構成するときに、Azure Web アプリをデプロイするアクションの中で AZURE_WEBAPP_PUBLISH_PROFILE を使用します。 次に例を示します。

- uses: azure/webapps-deploy@v2
  with:
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

環境をセットアップする

次の設定操作のいずれかを使用し、環境を設定できます。

Language 設定操作
.NET actions/setup-dotnet
ASP.NET actions/setup-dotnet
Java actions/setup-java
JavaScript actions/setup-node
Python actions/setup-python

以下の例は、サポートされているさまざまな言語の環境を設定する方法を示しています。

.NET

    - name: Setup Dotnet 3.3.x
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: '3.3.x'

ASP.NET

    - name: Install Nuget
      uses: nuget/setup-nuget@v1
      with:
        nuget-version: ${{ env.NUGET_VERSION}}

Java

    - name: Setup Java 1.8.x
      uses: actions/setup-java@v1
      with:
        # If your pom.xml <maven.compiler.source> version is not in 1.8.x,
        # change the Java version to match the version in pom.xml <maven.compiler.source>
        java-version: '1.8.x'

JavaScript

env:
  NODE_VERSION: '14.x'                # set this to the node version to use

jobs:
  build-and-deploy:
    name: Build and Deploy
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@main
    - name: Use Node.js ${{ env.NODE_VERSION }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ env.NODE_VERSION }}

Python

    - name: Setup Python 3.x 
      uses: actions/setup-python@v1
      with:
        python-version: 3.x

Web アプリを作成します

Web アプリをビルドして Azure App Service にデプロイするプロセスは、言語に応じて変化します。

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

すべての言語で、working-directory を使用して Web アプリのルート ディレクトリを設定できます。

.NET

環境変数 AZURE_WEBAPP_PACKAGE_PATH で、Web アプリ プロジェクトのパスを設定します。

- name: dotnet build and publish
  run: |
    dotnet restore
    dotnet build --configuration Release
    dotnet publish -c Release --property:PublishDir='${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp' 

ASP.NET

NuGet の依存関係を復元し、run を使用して msbuild を実行できます。

- name: NuGet to restore dependencies as well as project-specific tools that are specified in the project file
  run: nuget restore

- name: Add msbuild to PATH
  uses: microsoft/setup-msbuild@v1.0.2

- name: Run msbuild
  run: msbuild .\SampleWebApplication.sln

Java

- name: Build with Maven
  run: mvn package --file pom.xml

JavaScript

Node.js の場合、working-directory を設定するか、pushd で npm ディレクトリを変更できます。

- name: npm install, build, and test
  run: |
    npm install
    npm run build --if-present
    npm run test --if-present
  working-directory: my-app-folder # set to the folder with your app if it is not the root directory

Python

- name: Install dependencies
  run: |
    python -m pip install --upgrade pip
    pip install -r requirements.txt

App Service にデプロイする

ご自分のコードを App Service アプリにデプロイするには、azure/webapps-deploy@v2 アクションを使用します。 このアクションには、次の 4 つのパラメーターがあります。

パラメーター 説明
app-name (必須) App Service アプリの名前
publish-profile (オプション) Web 配置のシークレットでプロファイル ファイルの内容を発行する
package (オプション) パッケージまたはフォルダーへのパス。 パスには、*.zip、*.war、*.jar、またはデプロイするフォルダーを含めることができます
slot-name (省略可能) 運用スロット以外の既存のスロットを入力します

.NET Core

Azure 発行プロファイルを使用する .NET Core アプリをビルドして Azure にデプロイします。 publish-profile 入力で、先ほど作成した AZURE_WEBAPP_PUBLISH_PROFILE シークレットを参照します。

name: .NET Core CI

on: [push]

env:
  AZURE_WEBAPP_NAME: my-app-name    # 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: '3.1.x'           # set this to the dot net version to use

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      # Checkout the repo
      - uses: actions/checkout@main
      
      # Setup .NET Core SDK
      - name: Setup .NET Core
        uses: actions/setup-dotnet@v1
        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@v2
        with: 
          app-name: ${{ env.AZURE_WEBAPP_NAME }} # Replace with your app name
          publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE  }} # Define secret variable in repository settings as per action documentation
          package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/myapp'

ASP.NET

NuGet と認証に publish-profile を使用する ASP.NET MVC アプリをビルドしてデプロイします。

name: Deploy ASP.NET MVC App deploy to Azure Web App

on: [push]

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
  NUGET_VERSION: '5.3.x'           # set this to the dot net version to use

jobs:
  build-and-deploy:
    runs-on: windows-latest
    steps:

    - uses: actions/checkout@main  
    
    - name: Install Nuget
      uses: nuget/setup-nuget@v1
      with:
        nuget-version: ${{ env.NUGET_VERSION}}
    - name: NuGet to restore dependencies as well as project-specific tools that are specified in the project file
      run: nuget restore
  
    - name: Add msbuild to PATH
      uses: microsoft/setup-msbuild@v1.0.2

    - name: Run MSBuild
      run: msbuild .\SampleWebApplication.sln
       
    - name: 'Run Azure webapp deploy action using publish profile credentials'
      uses: azure/webapps-deploy@v2
      with: 
        app-name: ${{ env.AZURE_WEBAPP_NAME }} # Replace with your app name
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE  }} # Define secret variable in repository settings as per action documentation
        package: '${{ env.AZURE_WEBAPP_PACKAGE_PATH }}/SampleWebApplication/'

Java

Azure 発行プロファイルを使用する Java Spring アプリをビルドして Azure にデプロイします。 publish-profile 入力で、先ほど作成した AZURE_WEBAPP_PUBLISH_PROFILE シークレットを参照します。

name: Java CI with Maven

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Build with Maven
      run: mvn -B package --file pom.xml
      working-directory: my-app-path
    - name: Azure WebApp
      uses: Azure/webapps-deploy@v2
      with:
        app-name: my-app-name
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: my/target/*.jar

jar ではなく war をデプロイするには、package の値を変更します。

    - name: Azure WebApp
      uses: Azure/webapps-deploy@v2
      with:
        app-name: my-app-name
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: my/target/*.war

JavaScript

アプリの発行プロファイルを使用する Node.js アプリをビルドして Azure にデプロイします。 publish-profile 入力で、先ほど作成した AZURE_WEBAPP_PUBLISH_PROFILE シークレットを参照します。

# File: .github/workflows/workflow.yml
name: JavaScript CI

on: [push]

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

jobs:
  build-and-deploy:
    name: Build and Deploy
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@main
    - name: Use Node.js ${{ env.NODE_VERSION }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ env.NODE_VERSION }}
    - name: npm install, build, and test
      run: |
        # Build and test the project, then
        # deploy to Azure Web App.
        npm install
        npm run build --if-present
        npm run test --if-present
      working-directory: my-app-path
    - name: 'Deploy to Azure WebApp'
      uses: azure/webapps-deploy@v2
      with: 
        app-name: ${{ env.AZURE_WEBAPP_NAME }}
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}

Python

アプリの発行プロファイルを使用する Python アプリをビルドして Azure にデプロイします。 publish-profile 入力で、前に作成した AZURE_WEBAPP_PUBLISH_PROFILE シークレットを参照する方法に注意してください。

name: Python CI

on:
  [push]

env:
  AZURE_WEBAPP_NAME: my-web-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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.x
      uses: actions/setup-python@v2
      with:
        python-version: 3.x
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Building web app
      uses: azure/appservice-build@v2
    - name: Deploy web App using GH Action azure/webapps-deploy
      uses: azure/webapps-deploy@v2
      with:
        app-name: ${{ env.AZURE_WEBAPP_NAME }}
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}

次のステップ

GitHub には、一連のアクションが別々のリポジトリにあります。それぞれには、CI/CD に GitHub を使用し、ご自身のアプリを Azure にデプロイするときに役立つドキュメントとサンプルが含まれています。