Site cover image

ふつうのITエンジニアの独り言

本業はAndroidとiPhoneのアプリ開発のエンジニアです。将来はフリーランスで海の近くで妻とのんびり暮らすことを夢見て、幅広くIT技術に触れていきたいと思います。このブログはその備忘録と私のポートフォリオとして活動記録を記すものです。

astro-notion-blogが定期的にビルドされて配信されるようにしたい

目次


自動ビルドの方法を検討する


NotionにWebhook機能が追加されたことにより、特定のデータベースを任意の条件で変更した時に、HTTP POSTリクエストを任意のURLへ送信することができるようだ。

ただ、この機能を自由に使えるかというとそうでもなく、有料でのサービスであった。できるだけコストを掛けずに済ませたいため、他の手段を考えることにする。

オートメーションを選択したところ、アップグレートを要求される。アップグレードには、月額2000円、年払いだと月1650円となる。これを高いと思うかやすいと思うかは人それぞれ。。

ClaudflareでWebhookが使えるということが分かったので、タイマーによる定期実行を使ってGoogle Apps Script(GAS)からHTTP POSTリクエストすることで定期ビルドが実現できるのでは?とかんがえ、以下の構成で自動ビルドを実現することとした。

graph LR
  TRIGER(タイマートリガー) --> GAS(Google Apps Script) --①Webhook-->Cloudflare(CLOUDFLARE)
  Cloudflare -.-> |②DB Read リクエスト|notion
  notion(Notion DB) -.-> |③DB Read レスポンス|Cloudflare
  Cloudflare --デプロイ--> WEB(Webページ)

Cloudflareのデプロイフックを作成


CloudflareでWebhookを作成し、イベントによって自動化することができる。Webhookの作成は次の通り。

  1. Workers & Paged > “ビルドプロジェクト”へ進む
  2. 上部メニューから設定を選択
  3. デブロイフックで、+ボタンを押す
  4. フック名を入力して保存
  5. 表示されるURLを使って使用するため、保存しておく。

Google Apps ScriptからWebhookを利用する


スクリプト作成

GASでプロジェクトを新規作成し、以下のコードを作成した。webhookUrlには、Cloudflareで作成したデプロイフックのURLを設定する。手動で実行したところ、Cloudflare側でビルドが開始されるのを確認できたので、この実装で問題はなさそうである。

function triggerCloudflareBuild() {
	const webhookUrl = 'https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/xxx'; //Webhook 

  const options = {
    method: 'post',
    muteHttpExceptions: true
  };

  UrlFetchApp.fetch(webhookUrl, options);
}
タイマートリガー設定

時間ベースで、毎日午前0時から1時のあいだでトリガーが発火するように設定した。

まとめ


 astro-notion-blogの定義ビルドを、CloudflareのWebhookとGAS+トリガーによって実現した。GASからは、notionのデータベースの情報をリクエストすることも可能であるため、記事が更新されているときだけビルドするようにもできるが、毎日ビルドでも十分要求は満足できているので、今回はここまでとした。

 記事を更新するたびに、手動でビルドする手間がなくなったことから、ブログ更新が楽になって良かった。