弊社では、事業部ごとの技術ブログを集約する Hub のようなサイトを Azure Static Web Apps で構築しています。
最近、Azure Static Web Apps にデプロイする GitHub Actions がタイムアウトで失敗する現象が頻発するようになったので、対応を行いました。
gooner.hateblo.jp
現象
このサイトは、ビルド時に事業部ごとの技術ブログの RSS フィードを取得し、その結果を静的コンテンツとしてデプロイする仕組みです。そのため、ソースコードの変更に関わらず、Schedule トリガーで毎日デプロイしています。
最近、この GitHub Actions がタイムアウトで失敗する頻度が増えてきました。以前は、数か月に1回くらいの割合でした。

エラーログを見ると、 RSS フィードを取得する際にタイムアウトになっていました。

原因
Azure Static Web Apps の自動ビルドのタイムアウトは、既定で15分に制限されています。試しに build_timeout_in_minutes: 30 を追加して 30分に延長してもタイムアウトになり、対処療法にすらなりませんでした。
learn.microsoft.com
そもそも RSS フィードの取得に 15分以上もかかりません。原因は、ビルドを実行している環境側にあり、Azure Static Web Apps 側のビルドで外部サイトに依存する処理を実行していることにありそうだと考えました。
対応方法
本来は RSS フィードの取得をビルドと分けることが望ましいですが、インパクトの大きな改修が必要になります。今回は、ビルド処理を Azure Static Web Apps 側の自動ビルドから GitHub Actions 側に移すことにします。
name: Azure Static Web Apps CI/CD Timer Trigger on: schedule: - cron: '0 6 * * *' jobs: build_and_deploy_job: runs-on: ubuntu-latest name: Build and Deploy Job env: NODE_OPTIONS: --openssl-legacy-provider steps: - uses: actions/checkout@v4 with: submodules: true - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 18 cache: yarn - name: Install dependencies run: yarn install --frozen-lockfile - name: Build site run: yarn build - name: Build And Deploy id: builddeploy uses: Azure/static-web-apps-deploy@v1 with: azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_MANGO_TREE_0F24E2F00 }} repo_token: ${{ secrets.GITHUB_TOKEN }} action: "upload" app_location: "out" api_location: "" output_location: "" skip_app_build: true
GitHub Actions 側で actions/setup-node を使って Node を固定し、yarn install と yarn build を自前で実行させます。SWA deploy アクションでは skip_app_build: true にして、生成済み out だけをアップロードします。
さらに、RSS フィードの取得状況をログに出力しつつ、取得毎にタイムアウトも設定するようにしています。
修正内容の詳細は、こちらの Pull request を参照してください。
github.com
対応結果
Pull request をマージ後、3日くらい様子を見ましたが、1分半くらいでビルドとデプロイが完了するようになりました。

まとめ
Azure Static Web Apps の自動ビルドがタイムアウトしやすくなった状況に対して、GitHub Actions 側で RSS フィード取得とビルドを行い、Azure Static Web Apps 側では成果物だけをアップロードするようにしました。
今回の件で、Azure Static Web Apps 側の自動ビルドに余計な処理をさせ過ぎてはいけないという学びがありました。