GitHub Actions を使用した App Service へのカスタム コンテナーのデプロイ

GitHub Actions を使用すると、自動化されたソフトウェア開発ワークフローを柔軟に構築できます。 Azure Web Deploy アクションを使用すれば、カスタム コンテナーを App Service にデプロイするワークフローを、GitHub Actions を使用して自動化できます。

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

Azure App Service のコンテナー ワークフロー ファイルには、次の 3 つのセクションがあります。

Section タスク
認証 1.サービス プリンシパルまたは発行プロファイルを取得します。
2.GitHub シークレットを作成します。
ビルド 1.環境を作成します。
2.コンテナー イメージをビルドします。
デプロイする 1.コンテナー イメージをデプロイする

前提条件

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

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

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

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

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

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

    Note

    2020 年 10 月の時点で、Linux Web アプリでは、WEBSITE_WEBDEPLOY_USE_SCM、アプリ設定 WEBSITE_WEBDEPLOY_USE_SCMtrue に設定する必要があります。 この要件は、今後削除される予定です。 一般的な Web アプリの設定を構成する方法については、「Azure portal で App Service アプリを構成する」を参照してください。

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

認証用の 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 }}

レジストリ用の GitHub シークレットを構成する

Docker ログイン アクションで使用するシークレットを定義します。 このドキュメントの例では、コンテナー レジストリ用に Azure Container Registry を使用しています。

  1. Azure portal または Docker でお使いのコンテナーにアクセスし、ユーザー名とパスワードをコピーします。 Azure Container Registry のユーザー名とパスワードは、Azure portal の、お使いのレジストリの [設定]>[アクセス キー] で確認できます。

  2. レジストリ ユーザー名のために REGISTRY_USERNAME という名前の新しいシークレットを定義します。

  3. レジストリ パスワードのために REGISTRY_PASSWORD という名前の新しいシークレットを定義します。

コンテナー イメージのビルド

次の例は、Node.js Docker イメージをビルドするワークフローの一部を示しています。 Docker Login を使用してプライベート コンテナー レジストリにログインします。 この例では Azure Container Registry を使用しますが、他のレジストリでも同じアクションを実行できます。

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

また、Docker Login を使用して複数のコンテナー レジストリに同時にサインインすることもできます。 この例には、docker.io を使用した認証用の 2 つの新しい GitHub シークレットが含まれています。 この例は、レジストリのルート レベルに Dockerfile があることを前提としています。

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

App Service コンテナーへのデプロイ

App Service のカスタム コンテナーにイメージをデプロイするには、azure/webapps-deploy@v2 アクションを使用します。 このアクションには 7 つのパラメーターがあります。

パラメーター 説明
app-name (必須) App Service アプリの名前
publish-profile (オプション) Web アプリ (Windows および Linux) および Web アプリ コンテナー (Linux) に適用されます。 複数コンテナー シナリオはサポートされていません。 Web 配置のシークレットでプロファイル (*.publishsettings) ファイルの内容を発行します
slot-name (オプション) 運用スロット以外の既存のスロットを入力します。
package (オプション) Web アプリのみに適用されます。パッケージまたはフォルダーへのパス。 デプロイする *.zip、*.war、*.jar またはフォルダー
images (必須) Web アプリ コンテナーのみに適用されます。完全修飾コンテナー イメージ名を指定します。 たとえば、' myregistry.azurecr.io/nginx:latest ' や ' python:3.7.2-alpine/' などです。 複数コンテナー アプリの場合は、複数のコンテナー イメージ名を指定できます (複数行で区切ります)。
configuration-file (オプション) Web アプリ コンテナーのみに適用されます。Docker-Compose ファイルのパス。 完全修飾パスか、既定の作業ディレクトリを基準とした相対パスのいずれかです。 複数コンテナー アプリの場合は必須です。
スタートアップ コマンド (オプション) スタートアップ コマンドを入力します。 たとえば、dotnet run または dotnet filename.dll
name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'

次のステップ

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