しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Dependabot が作成した Pull Request でも Azure Static Web Apps のプレビュー環境が作成されるようにする

以前に書いた通り Static Web Apps と App Service を組み合わせたアプリケーション向けに、GitHub で Pull Request が作成された時にプレビュー用の環境を作るようにして運用しているのですが、これがかなり便利でレビュアーの負荷を下げるのに非常に強力です。

これまで Static Web Apps を使っているアプリケーションの Pull Request で動作確認を行う際には、Codespaces やローカルにチェックアウトして SWA CLI を使ってフロントエンドとバックエンドを立ち上げて確認していましたが、自動で Azure 上にプレビュー環境が用意されるので簡単にレビュー可能です。

プレビュー環境を Pull Request 単位で作成するようにしていると、依存するパッケージ更新に伴う問題点を発見しやすくなるので、Dependabot を有効化してパッケージ更新自体を自動化したくなります。

GitHub で Dependabot を有効化するには dependabot.yml をリポジトリに含めるだけなので簡単です。最近ではグループ化も行えるので npm 向けにも使いやすくなっています。

最低限の dependabot.yml を作成し、Dependabot が作成した Pull Request に対してもプレビュー環境を作るようにすると、以下のようにデプロイエラーが発生します。

ログを確認すると Secrets 経由で渡しているはずの deployment_token が渡されていないというエラーが出ています。このエラーは Dependabot が作成した Pull Request では発生しますが、自分で作成した Pull Request で発生しないため設定ミスではありません。

これは Dependabot が作成した Pull Request に対して動作する GitHub Actions では Actions 向けに登録した Secrets が参照できないという仕様によるものです。以下のドキュメントにあるように Dependabot 向けの Secrets として登録すれば参照可能ですが、分散して管理するのは避けたいです。

Dependabot がトリガーした場合は Secrets を参照できませんが、Variables の場合は参照できるため、こちらを使うと解決は可能です。しかしシークレット扱いではないため注意が必要です。Variables は Environments 単位でも登録できるので、Secrets と同じように扱えます。

今回のように Deployment Token を使っている場合には Variables に移行するのは非常に難しいですが、Entra ID の Federated Credentials を利用する場合は以下のように Client Id / Tenant Id / Subscription Id の 3 つで済み、シークレット扱いにしなくても多くの場合は問題ないため Variables への移行が容易です。

Federated Credentials を既に使っている場合 Secrets から Variables に移行する際の変更点は最小限で済み、GitHub Actions の azure/login@v2secrets から vars に変更するだけで終わります。

    - name: Azure Login
      uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

Static Web Apps へのデプロイに Deployment Token を使っている場合には、事前に Federated Credentials を使うように書き換える必要があります。方法は以前書いたので以下のエントリを参照してください。

上のエントリのように Federated Credentials を使うように書き換えた上で、必要な認証情報を Secrets から Variables に移行すると Dependabot が作成した Pull Request に対しても、以下のように正しくプレビュー環境が作成されるようになります。

これまで Dependabot がトリガーした場合にも Secrets を参照させるには pull_request_target を使う必要がありましたが、そもそもシークレット扱いが必要ない情報を使うことで上手く回避出来ました。GitHub Actions からのデプロイは全て Federated Credentials で完結していきたいですね。