GitHub Actions を使用して Azure にデプロイするには

完了

このユニットでは、GitHub アクションを使用して、コンテナーベースの Web アプリを Microsoft Azure Web Apps にデプロイする方法について説明します。 ワークフローをトリガーするためのいくつかのオプションについて説明します。 次に、ワークフローで条件を使用する方法について学習します。 最後に、GitHub Actions を使用して Azure リソースを作成および削除する方法について学習します。

CD ワークフローをトリガーするためのオプション

CD ワークフローを開始するには、いくつかのオプションがあります。 GitHub Actions を使用した CI に関する前のモジュールでは、ワークフローをプッシュから GitHub リポジトリにトリガーする方法を学習しました。 しかし、CD では、他のイベントでデプロイ ワークフローをトリガーしたい場合があります。

1 つの方法として、ChatOps を使ってワークフローをトリガーします。 ChatOps では、チャット クライアント、チャットボット、リアルタイム通信ツールを使用してタスクが実行されます。 たとえば、ボットを開始できる pull request に特定のコメントを残します。 このボットにより統計が返され、ワークフローが実行されます。

別の方法として、この例で使用しているオプションですが、pull request でラベルを使用します。 さまざまなラベルにより、さまざまなワークフローを開始できます。 たとえば、stage ラベルを追加して、ステージング環境へのデプロイ ワークフローを開始します。 または、spin up environment ラベルを追加して、デプロイ先の Microsoft Azure リソースを作成するワークフローを実行します。 ラベルを使用する場合、ワークフローはこのようになります。

on:
  pull_request:
    types: [labeled]

ジョブ条件付きの実行の制御

特定の条件が true の場合のみワークフローを実行したい場合があります。

このシナリオでは、GitHub ワークフローにより if 条件が提供されます。 この条件では、実行時に評価されるが使用されます。 たとえば、stage ラベルが pull request に追加された場合に、このワークフローを実行します。

if: contains(github.event.pull_request.labels.*.name, 'stage')

GitHub Secrets を使用して資格情報を保存する

ワークフロー ファイル内の機密情報を公開したくはありません。 GitHub のシークレットは、ワークフローに必要な機密情報を格納するための安全な場所です。 次に例を示します。

Azure リソースにデプロイするには、GitHub Actions にリソースにアクセスするためのアクセス許可が必要です。 Azure の資格情報をワークフロー ファイルにあからさまに保存する必要はありません。 代わりに、資格情報を GitHub Secrets に格納できます。

GitHub のシークレットに情報を格納するには、ポータルでシークレットを作成します。

Azure portal interface for creating a secret.

その後、作成したシークレットの名前を、その情報が必要なワークフローで使用します。 たとえば、Azure login アクションの creds: 属性で GitHub のシークレットに格納された Azure 資格情報を使用します。

steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

GitHub Actions を使用した Microsoft Azure へのデプロイ

GitHub Marketplace には、Azure 関連のタスクを自動化するためのいくつかのアクションが用意されています。

The GitHub Marketplace showing search results for Azure.

リポジトリのワークフロー エディターで GitHub Actions を直接検索して参照することもできます。 サイドバーから、特定のアクションの検索、おすすめのアクションの表示、おすすめのカテゴリの閲覧ができます。

アクションを検索するには:

  1. リポジトリ内の編集するワークフロー ファイルを参照します。
  2. ファイル ビューの右上隅にある [編集] アイコンを選択します。
  3. エディターの右側にある GitHub Marketplace サイドバーを使用して、アクションを参照します。

コンテナーベースの Web アプリを Azure Web Apps にデプロイするとします。 GitHub Marketplace を検索すると、これらのアクションが見つかります。

これらのアクションを Deploy-to-Azure ジョブに追加すると、ワークフローは次のようになります。

  Deploy-to-Azure:
    runs-on: ubuntu-latest
    needs: Build-Docker-Image
    name: Deploy app container to Azure
    steps:
      - name: "Login via Azure CLI"
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - uses: azure/docker-login@v1
        with:
          login-server: ${{env.IMAGE_REGISTRY_URL}}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Deploy web app container
        uses: azure/webapps-container-deploy@v1
        with:
          app-name: ${{env.AZURE_WEBAPP_NAME}}
          images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}

      - name: Azure logout
        run: |
          az logout

このジョブは、前のジョブ (Build-Docker-Image) に依存していることに注意してください。 前のジョブでは、デプロイされる成果物が作成されます。

azure/login@v1 アクションでは、デプロイ先の Azure リソースにアクセスできるように、Azure アカウントにサインインするための資格情報が必要です。 ここでは、GitHub のシークレットに格納した資格情報を使用します。

これは、azure/docker-login@v1 アクションにも当てはまります。 コンテナー イメージをデプロイしているため、プライベート コンテナー レジストリにサインインする必要があります。

azure/webapps-container-deploy@v1 アクションによりデプロイが実行されます。 これは、先ほどの 2 つのアクションによって変わります。

GitHub Actions を使用した Azure リソースの作成と削除

CD は自動化されたプロセスであるため、デプロイ先の環境を作成および破棄するためにコードとしてのインフラストラクチャを使用することを既に決定しています。 GitHub Actions を使用すると、これらのタスクを Azure 上で自動化でき、ワークフローにこれらのアクションを含めることができます。

注意

不要な料金が発生しないように、できるだけ早く使用しなくなったリソースを破棄することが重要です。

1 つの方法として、2つのジョブ (リソースを起動するジョブとリソースを削除するジョブ) を含む新しいワークフローを作成します。 次に、条件を使用して、目的のジョブだけを実行します。 この例では、条件によって pull request でラベルが検索され、ラベルが spin up environment (環境を起動) の場合 set-up-azure-resources ジョブが実行され、ラベルが destroy environment (環境を破棄) の場合 destroy-azure-resources ジョブが実行されます。

jobs:
  set-up-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'spin up environment')

    ...

  destroy-azure-resources:
    runs-on: ubuntu-latest

    if: contains(github.event.pull_request.labels.*.name, 'destroy environment')

    ...

ジョブでは、Azure CLI を使用して Azure リソースが作成および破棄されます。 Azure CLI の詳細については、Azure CLI の概要に関するページを参照してください。

set-up-azure-resources ジョブのステップの例を次に示します。

steps:
  - name: Checkout repository
    uses: actions/checkout@v2

  - name: Azure login
    uses: azure/login@v1
    with:
      creds: ${{ secrets.AZURE_CREDENTIALS }}

  - name: Create Azure resource group
    if: success()
    run: |
      az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create Azure app service plan
    if: success()
    run: |
      az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Create webapp resource
    if: success()
    run: |
      az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }}  --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
  - name: Configure webapp to use GitHub Packages
    if: success()
    run: |
      az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}

GitHub アクションを使用してリポジトリをチェックアウトし、Azure にサインインしていることに注意してください。 その後、必要なリソースを作成し、Azure CLI を使用してコンテナーをデプロイします。