ごった煮

色々な事を書いてます

GitHub Actions で、PHP のアプリケーションを Azure WebApps にデプロイする

ほぼ静的で一部 PHP が使われているアプリケーションを Web Apps にデプロイする仕組みを GitHub Actions で用意する必要が出たので、備忘録に残します。

やりたいこと

  • 特定のブランチにソースコードが push されたらステージング環境へデプロイ
  • Pull request が通って特定のブランチにマージされたら本番環境へデプロイ

やりたいことと言えば別に簡単な事ですね では、さっそくやってみましょう

Environment に Web Apps の Publish profiles を登録する

始めに Publish profiles を Azure ポータルから取得してください。 次に、下図のように、GitHub の Settings > Environments > New environment で新しい Environment を作ります。

f:id:papemk2:20210219192536p:plain

Environment が作成出来たら、Environment secrets で新しい Secret を登録します。

f:id:papemk2:20210219192807p:plain

シークレットは、適当な名前を付けたうえで、Value に Publish profile の中身を入れてください。

これで、GitHub Actions の YAML 内から、Publish profile が参照できるようになります。

YAML を書く

次のような YAML になります。

name: Deploy PHP

on:
  push:
    branches: 
      - staging
  pull_request:
    branches:
      - master
    types: [closed]

env:
  STAGING_WEBAPP_NAME: 'Your staging web apps name' # ステージングの Web Apps 名
  PRODUCTION_WEBAPP_NAME: 'Your production web apps name' # 本番の Web Apps 名
  AZURE_WEBAPP_PACKAGE_PATH: '.' # デプロイしたい成果物のパス

jobs:
  # ステージングデプロイ用 Job
  deploy-staging:
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/staging'
    steps:
      - uses: actions/checkout@v2
      - name: 'Deploy to staging'
        uses: azure/webapps-deploy@v2
        with:
          app-name: ${{ env.STAGING_WEBAPP_NAME }}
          publish-profile: ${{ secrets.STAGING_PUBLISH_PROFILE }}
          package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}

  # 本番デプロイ用 Job
  deploy-production:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
      - uses: actions/checkout@v2
      - name: 'Deploy to production'
        uses: azure/webapps-deploy@v2
        with:
          app-name: ${{ env.PRODUCTION_WEBAPP_NAME }}
          publish-profile: ${{ secrets.PRODUCTION_PUBLISH_PROFILE }}
          package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}

ワークフローの実行は、staging ブランチに push された場合と、master ブランチへの Pull request がクローズされて且つ、マージされた場合になっています。 GitHub Actions では、明示的に Pull request がマージされたというイベントを取ることが現状出来ないため、

  pull_request:
    branches:
      - master
    types: [closed]

として、Pull request がクローズされた際にワークフローが実行されるようにして、

if: github.event.pull_request.merged == true

で対象の Pull request の状態が merged かどうかを判定して処理を実行しています。 単純に closed だけで取得すると、却下されて closed になった場合などもワークフローが実行されるので注意が必要です。

まとめ

GitHub Actions は、GitHub を使っていると非常に便利です。

Azure Pipelines と比べると、機能的に足りなかったりといった部分もありますが、Approval ワークフローが使えるようになったりと、着実に便利になっているので、 覚えて損は無いと思います。

これだけの設定で、わざわざ毎回手動でデプロイをする必要がなくなる等、ちょっとした面倒な作業を人の手から引き剥がせるのは、とても便利ですね