【Cloudflare pages】はてなブログの更新を確認してのNext.jsのビルドを走らせる

必要な準備

  • Cloudflare pagesにページをデプロイしていること
  • プロジェクトをGitHubで管理していること
  • はてなブログのAPIキーの用意

設定していく

Webhookの用意

CloudflareのダッシュボードからWorkers & Pages > プロジェクト > Settings > Deploy hooks の順番で進みhooksを作成する

SecretsをGitHub Actionsに用意

Key Value
HATENA_USER_ID はてなブログのユーザーID
HATENA_API_KEY はてなブログのAPIキー (アカウント設定から確認)
HATENA_BLOG_URL はてなブログのURL
CLOUDFLARE_WEBHOOK_URL デプロイするCloudflare pagesのWebhook URL

Workflowの用意

以下のworkflowを追加する。手動実行することもできるが、または毎週月曜に実行されるようになっている。

解説 :

  • はてなブログのAPIを用いて記事一覧を取得し前回取得時の差分と比較する
  • Artifactsを利用して差分のファイルを保持するようにする
name: Check Blog Update

on:
  schedule:
    - cron: '0 0 * * 1'
  workflow_dispatch:

env:
  HATENA_USER_ID: ${{ secrets.HATENA_USER_ID }}
  HATENA_API_KEY: ${{ secrets.HATENA_API_KEY }}
  HATENA_BLOG_URL: ${{ secrets.HATENA_BLOG_URL }}
  CLOUDFLARE_WEBHOOK_URL: ${{ secrets.CLOUDFLARE_WEBHOOK_URL }}

jobs:
  check-blog-update:
    runs-on: ubuntu-latest
    outputs:
      diff: ${{ steps.compare-xml.outputs.diff }}
    steps:
      - name: Download previous xml data
        uses: actions/download-artifact@v3
        with:
          name: xml_data
          path: ./previous.xml
        continue-on-error: true

      - name: Fetch Hatena Xml
        run: |
          curl -u $HATENA_USER_ID:$HATENA_API_KEY https://blog.hatena.ne.jp/$HATENA_USER_ID/$HATENA_BLOG_URL/atom/entry > current_rss.xml

      - name: Compare xml and set output
        id: compare-xml
        run: |
          diff -u ./previous.xml ./current_rss.xml > diff.txt || true
          if [ -s diff.txt ]; then
            echo "diff=true" >> $GITHUB_OUTPUT
          else
            echo "diff=false" >> $GITHUB_OUTPUT
          fi

      - name: Upload xml data
        uses: actions/upload-artifact@v3
        with:
          name: xml_data
          path: ./current_rss.xml

  webhook-to-cloudflare:
    runs-on: ubuntu-latest
    needs: check-blog-update
    steps:
      - name: Send Webhook to Cloudflare
        if: needs.check-blog-update.outputs.diff == 'true'
        env:
          CLOUDFLARE_WEBHOOK_URL: ${{ secrets.CLOUDFLARE_WEBHOOK_URL }}
        run: |
          curl -X POST $CLOUDFLARE_WEBHOOK_URL

感想

作っていて思ったが、これなら週1でビルドを回すようにActionsを設定したらいいなと思った。