Studioから移したmicroCMS×Astroのサイトで、記事を更新したら自動でビルドできますか?

結論

Studioでは記事を公開すればすぐサイトに出ていました。でも、microCMSとAstroの組み合わせでは、記事の保存とサイトのビルドが別々に動きます。静的生成を行うAstroでは、記事データを取得してHTMLを書き出すビルド処理が欠かせません。そこで、microCMSのWebhookとホスティング側のDeploy Hookを連携させれば、記事の更新に合わせて自動でビルドを起動し、最新ページを公開できます。Cloudflare Pagesで公開しているなら、Cloudflare側でDeploy HookのURLを発行し、それをmicroCMSのWebhookに登録します。

移行先の比較更新日

Cloudflare PagesのDeploy Hookを発行する手順は?

Cloudflare Pagesの管理画面のどこを操作すれば、ビルドを起動するためのURLを取得できるでしょうか。まずは「Workers & Pages」から対象のPagesプロジェクトを選択し、「Settings」タブ内の「Builds」画面を開きます。その中にある「Add deploy hook」をクリックして設定を始めましょう。

設定画面では、フックの識別名とビルド対象とするGitブランチを指定します。名前は「microcms」のように、どこから呼ばれるフックかがわかるものにしてください。ブランチには通常の本番ブランチを指定しますが、ステージング環境で事前にレイアウトを確かめたい場合は確認用ブランチを紐付ける使い分けも役立ちます。保存すると固有のURLが表示されるため、コピーして大切に控えておきます。

この仕組みは、指定URLへHTTP POSTリクエストが届いた際に新しいビルドを開始するもので、Deploy Hooksの紹介記事で案内されています。

microCMSのWebhookでCloudflare Pagesを呼び出すには?

たとえばmicroCMSで新着記事を1本公開したとき、その更新イベントをCloudflare Pagesへ自動で届ける設定を作ります。作業はmicroCMSの管理画面で行い、更新を検知したいAPIごとに設定します。該当APIの画面から「API設定」を開き、「Webhook」のメニューへ進んでください。追加ボタンを押すと連携先の選択肢が表示されます。

一覧から「Cloudflare Pages」を選び、先ほどCloudflare側で取得したフックURLを入力欄へ貼り付けます。続いて通知タイミングを設定しましょう。「コンテンツの公開時・更新時」「コンテンツの公開終了時」「公開中コンテンツの削除時」などから、必要な操作にチェックを入れて保存します。ブログとお知らせでAPIを分けているなら、両方にURLを登録してください。片方だけだと、もう片方を更新してもビルドは始まりません。

設定後は、テスト記事を公開または更新して動作を確かめます。直後にCloudflare Pagesの管理画面を開き、デプロイ履歴を確認しましょう。Source列にDeploy Hookと記録され、新しいビルドとデプロイが走り出していれば連携は成功ですね。ただし、ここで確かめられるのはビルドが始まったところまでです。ビルドが成功して記事がサイトに出たかは、別に見ておく必要があります。また、Webhookの通知仕様では、ネットワークエラーや4xx・5xxエラーで送信に失敗しても再送は行われません。失敗した通知は再送されないので、届かなかったときはホスティング側で手動でビルドを実行してください。

どの操作でビルドを走らせればよいですか?

管理画面で行うすべての操作に対して、毎回ビルドを起動させる必要があるでしょうか。microCMSでは、公開や更新、公開終了、削除、下書き保存など、操作の種類ごとに通知の有無を選べます。

静的サイト運用でビルドを走らせるべき基本の操作は、「公開時・更新時」「公開終了時」「公開中コンテンツの削除時」の3点です。記事を修正して反映したいときはもちろん、掲載終了で記事を取り下げたり、公開中の記事を下書きに戻したりした際も、公開サイトから該当ページを消すために再ビルドが欠かせません。

予約公開を使う人は、もうひとつ設定があります。「公開時・更新時」のなかは、管理画面での操作、API、レビュー、予約で項目が分かれています。管理画面の項目には予約による公開が含まれないため、予約のチェックも入れてください。そうすれば、予約での新規公開や公開済み記事の更新でもビルドが始まります。予約時刻と同時にサイトへ出るわけではなく、ビルドが終わるまで少し遅れますね。

一方で、通常の下書き保存は通知をオフにしておく運用が適しています。Astroなどの静的サイトはビルド時にAPI経由でデータを読み込みますが、microCMSのステータス仕様では公開中の記事を下書き編集していても、通常の取得処理には公開済みの確定データが返されます。下書き内容は専用キーがないと取得できないため、下書きを保存するたびにビルドを走らせても公開画面は変わりません。作業中の細かな保存でビルドを浪費しないよう、下書き通知は外しておきましょう。ただ、draftKeyや下書き取得の権限を使ってプレビュー用のページを作っている場合は、話が変わってきます。

自動ビルドがうまく動かないときの確認点は?

「microCMSで記事を更新したはずなのに、いつまで経ってもサイトに新しい記事が表示されない」と悩む場面もあるかもしれませんね。自動ビルドが動かないときは、microCMSからの通知送信と、Cloudflare Pages側でのビルド実行のどちらで止まっているかを順に切り分けます。まず確かめたいのが、microCMSのWebhook一覧画面にある切り替えスイッチです。手違いでスイッチが無効になっていると通知そのものが飛びません。

次に、操作内容と通知タイミングの設定が合致しているかを見直します。microCMSの通知条件は操作ごとに分かれており、手動更新だけでなく予約公開やレビュー機能など、今回の操作にチェックが入っていないと通知は行われません。

送信側に問題がなければ、Cloudflare Pagesのデプロイ履歴を確認します。履歴のSource列にDeploy Hookの記録がない場合、登録したフックURLの貼り付けミスが疑われますね。逆に、記録があるのにビルドが失敗しているなら、Cloudflare Pagesのデバッグ手順に従い、DeploymentsからView details、Build logを開いてエラーを確認しましょう。ビルドコマンドや出力フォルダの誤り、APIキーなどの環境変数設定が抜けていないかを点検します。

Astroのサイトでは、環境変数が原因になりがちです。Astroの環境変数ガイドのとおり、Viteの仕組みで読み込む環境変数は、ビルドの時点で値に置き換えられます。microCMSのAPIキーやサービスドメインを手元の.envに書いただけでは、Cloudflareでのビルドには渡りません。Cloudflare Pagesのビルド用環境変数にも同じ値を登録してください。

こんな聞き方も

  • microCMSで記事を更新したらAstroのサイトを自動でビルドできますか?
  • astro microcms webhook 自動 ビルド
  • astro microcms webhook 再ビルド
  • cloudflare pages deploy hook microcms
  • Cloudflare PagesのDeploy HookとmicroCMSのWebhookをつなぐにはどうしますか?
  • microCMSで記事を公開したときにWebhookでAstroのサイトを再ビルドするにはどうしますか?

あわせて知りたい(関連する疑問)

QCloudflare WorkersでもDeploy Hookは使えますか?

PagesではなくCloudflare Workersを使ってサイトを構築している場合でも、同じようにDeploy Hookを活用できるでしょうか。Workersでも使えます。WorkersのDeploy Hooks手順にあるとおり、Workers BuildsでもDeploy Hooksを作れます。特定のブランチにひもづくURLへHTTP POSTを送ると、そのブランチのビルドが始まります。Pagesだけの機能ではなくなったので、Workersで公開しているAstroサイトでも自動ビルドを組めます。

WorkersでDeploy Hookを作成するには、対象WorkerがGitリポジトリと接続されている状態が必要です。設定時は管理画面で対象Workerの「Settings」から「Builds」を開き、「Deploy Hooks」の項目に進みましょう。フックの名前とデプロイ対象のブランチを指定すれば、固有のエンドポイントURLが生成されます。

違いが出るのはmicroCMS側の設定です。通知先の「Cloudflare Pages」はPages向けの連携なので、Workersのときは「カスタム通知」を選びます。カスタム通知は、指定したURLへPOSTリクエストを送る仕組みです。カスタム通知の送信先URLにWorkersのフックURLを設定し、公開や更新などの通知タイミングを指定すれば連携は完了です。

QDeploy HookのURLが漏れたらどうしますか?

たとえば、ビルド設定のメモを公開リポジトリのREADMEに書いていて、Deploy HookのURLまで載せてしまったとしましょう。Cloudflare PagesのDeploy Hookは、指定URLへHTTP POSTが届くとビルドを始める仕組みなので、URLが外に出ると第三者にビルドを起こされるおそれがあります。VercelのDeploy Hooksも同じ仕組みで、URLは秘密情報として守るよう求められています。

不正に使われたおそれがあるときは、URLを作り直しましょう。

  1. Cloudflare Pagesの「Settings > Builds」を開き、該当のDeploy Hookを削除する。
  2. 「Add deploy hook」から新しい名前とブランチを指定して別の固有URLを発行する。
  3. microCMSの「API設定 > Webhook」に登録してあるフックURLを新しいURLへ差し替えて保存する。
  4. テスト記事を更新し、新しいURL経由でビルドとデプロイが走ることを確認する。

いちばん抜けやすいのが3つめの差し替えです。古いフックを削除した時点で古いURLは使えなくなるため、microCMSの登録を古いまま放っておくと、記事を更新してもビルドが始まりません。APIを複数に分けている場合は、すべてのWebhook設定を書き換えてください。作業後は、チーム内の共有ドキュメント等にURLが直書きされていないかも忘れずに点検しておきましょう。

Q記事をまとめて削除するとビルドが何回も走りますか?

不要になった過去記事を管理画面から何十本もまとめて一括削除した場合、消した件数の分だけビルドが連続して実行されてしまうでしょうか。使っている通知の種類で変わります。microCMSで複数の記事をまとめて削除したり、ステータスを一度に変えたりすると、一部の通知種別では記事の数だけ通知が送られます。その種別はGitHub Actionsとカスタム通知の2つで、Cloudflare Pagesの通知は含まれていません。そのため、何十件削除しても通知が件数分そのまま乱発されるわけではありません。

一方、Cloudflare PagesのDeploy Hookは、リクエストを受け取るたびに新しいビルドを始めます。GitHub Actions経由でビルドしている場合は、ワークフローの同時実行を制限できます。同じグループで待機中の実行を1件に絞り、古い待機実行を取り消す制御が可能です。

大量の記事を整理する際は、事前にmicroCMS側のWebhookスイッチを一時的にオフにしておくのも現実的な工夫です。無効にしている間はWebhookが送られません。そのため、削除が終わってスイッチをオンへ戻したら、ホスティング側で手動でビルドを実行して、サイトを最新の状態に合わせます。

QVercelやNetlifyでも同じことができますか?

Studioからの移行先を決めている段階で、ホスティングをCloudflareにするか、VercelやNetlifyにするかで迷っている人もいるでしょう。microCMSのWebhookは、Cloudflare Pagesのほかに、Vercel、Netlify、AWS Amplifyのビルド開始にも対応しています。どれを選んでも、記事の更新でビルドを始める仕組みは作れます。

サービスmicroCMSに貼るURL使うための条件
Cloudflare PagesDeploy HooksのURLビルドするブランチを指定してフックを作る
VercelDeploy HooksのURLGitリポジトリとの接続が必要。新しいコミットは不要
NetlifyBuild HooksのURLサイトのビルドが有効になっている
AWS AmplifyBuild HooksのURLAmplify側で受信用のWebhookを作る

Netlifyは、NetlifyのBuild hooksを使う前提として、サイトのビルドが止まっていないことが条件です。

設定の手順はどのサービスでも共通です。各サービスの画面でフックURLを発行し、microCMSの「API設定 > Webhook」で対応するサービス(Vercel、Netlify、AWS Amplifyなど)を選択してURLを貼り付けます。あとは「コンテンツの公開時・更新時」などの通知タイミングを指定して保存すれば、記事の更新に合わせて自動でビルドパイプラインが立ち上がります。違いが出るのは、Astroのビルドコマンドや環境変数を登録するホスティング側の画面です。

出典

この内容をChatGPTで相談

無料診断