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 でラベルを使用します。 さまざまなラベルにより、さまざまなワークフローを開始できます。 たとえば、ステージング環境へのデプロイ ワークフローを開始する ステージ ラベルを追加したり、デプロイ先の Microsoft Azure リソースを作成するワークフローを実行する スピンアップ環境 ラベルを追加したりします。 ラベルを使用する場合、ワークフローはこのようになります。

on:
  pull_request:
    types: [labeled]

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

多くの場合、特定の条件が満たされている場合にのみワークフローを実行する必要があります。

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

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

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

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

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

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

シークレットを作成するための GitHub ポータル インターフェイスのスクリーンショット。

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

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

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

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

Azure の検索結果を示す GitHub Marketplace のスクリーンショット。

リポジトリのワークフロー エディターで 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-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-deploy@v1 アクションはデプロイを実行します。 これは、先ほどの 2 つのアクションによって変わります。

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

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

注意

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

1 つの方法として、2つのジョブ (リソースを起動するジョブとリソースを削除するジョブ) を含む新しいワークフローを作成します。 次に、条件を使用して、目的のジョブだけを実行します。 この例では、条件によって pull request でラベルが検索され、ラベルが set-up-azure-resources の場合 ジョブが実行され、ラベルが 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 を使用してコンテナーをデプロイします。