次の方法で共有


GitHub Actions を使用して App Service にカスタム コンテナーをデプロイする

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

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

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

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

前提条件

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

OpenID Connect を使用して、GitHub Actions 用の Azure App Services で認証することをお勧めします。 サービス プリンシパルまたは発行プロファイルで認証することもできます。

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

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

  1. Azure portal で App Service に移動します。

  2. [ 概要 ] ウィンドウで、[ 発行プロファイルの取得] を選択します。

    Note

    2020 年 10 月から、ユーザーは "ファイルをダウンロードする前に" Linux Web アプリのアプリ設定 WEBSITE_WEBDEPLOY_USE_SCMtrue に設定する必要があります。 一般的な Web アプリ設定を構成する方法については、 Azure portal で App Service アプリを構成する方法に関するページを参照してください。

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

認証用の GitHub シークレットを構成する

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

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

GitHub ワークフローを構成するときは、Azure Web App のデプロイ アクションで 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 ログインを使用してプライベート コンテナー レジストリにサインインします。 この例では 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 サインインを使用して、複数のコンテナー レジストリに同時にサインインすることもできます。 この例には、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 }}     

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

name: Windows Container Workflow
on: [push]
jobs:
  build:
    runs-on: windows-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 サインインを使用して、複数のコンテナー レジストリに同時にサインインすることもできます。 この例には、docker.io を使用した認証用の 2 つの新しい GitHub シークレットが含まれています。 この例は、レジストリのルート レベルに Dockerfile があることを前提にしています。

name: Windows Container Workflow
on: [push]
jobs:
  build:
    runs-on: windows-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 Deploy シークレットを使用してプロファイル \*.publishsettings ファイルの内容を発行します。
slot-name (省略可能)運用スロット以外の既存のスロットを入力します。
package (省略可能)Web アプリでのみ使用: パッケージまたはフォルダーへのパス。 \*.zip\*.war\*.jar、または展開するフォルダー。
images (必須)Web アプリ コンテナーでのみ使用: 完全修飾コンテナー イメージ名を指定します。 たとえば、myregistry.azurecr.io/nginx:latest または python:3.12.12-alpine/ です。 マルチコンテナー アプリの場合、複数のコンテナー イメージ名を指定できます (複数行区切り)。
configuration-file (省略可能)Web アプリ コンテナーでのみ使用: Docker Compose ファイルのパス。 完全修飾パスか、既定の作業ディレクトリを基準とした相対パスのいずれかです。 複数コンテナー アプリの場合は必須です。
startup-command (省略可能)スタートアップ コマンドを入力します。 たとえば、dotnet rundotnet 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 }}'
name: Windows_Container_Workflow

on: [push]

jobs:
  build:
    runs-on: windows-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 にデプロイするのに役立つドキュメントと例が含まれています。