Skip to content
コミットできない
Go back

Astro + GitHub Actions + Cloudflare Pagesで予約投稿

このブログはAstroで書いてGitHubで管理してCloudflare Pagesでホスティングしているのですが、当然ながら静的サイトには予約投稿機能がありません。

GitHub Actionsと組み合わせて擬似的に予約投稿する方法のメモです。 今回の記事も予約投稿をしています。

ただの個人的な備忘録なので、なにか新しい画期的な方法を期待していた方はごめんなさい。

Astro側の設定

Astro側は特に追加設定等は要りません。 一点、記事のFrontmatterのpubDatetimeには投稿(表示)したい日時を指定してください。

author: ...
pubDatetime: 2026-03-16T00:00:00+09:00 # 日本時間の2026年3月16日にこの記事が表示される
title: ...

Cloudflare Pages側の設定

Cloudflare Pagesにホスティングする方法は省略します。 「Cloudflare Pages Astro」で検索すれば山ほど出てきますし、Cloudflare Pagesにも公式でAstroでホスティングするプリセットがあります。

ホスティングの設定が終わったら、設定タブからデプロイ フックを探してください。

デプロイ フック

右側の+ボタンをクリックすると「デプロイ フック名」と「ビルドするブランチ」の入力欄が出てきます。 「デプロイ フック名」には自分にとってわかりやすい名前(「予約投稿」など)、「ビルドするブランチ」には記事のあるメインブランチ名を入力してください。

デプロイ フックの作成

「デプロイ フック」用のURLが表示されます。 次で使うので、これをメモしておきましょう。

デプロイ フックURL

GitHub側の設定

GitHubのブログリポジトリーに、先ほどのURLを登録します。

リポジトリーの “Setting”→“Security”→“Secrets and variables”→“Actions” と進み、“New repository secret”からURLを登録します。 名前はCF_DEPLOY_HOOK_URLとしておきます。

シークレットの登録

GitHub Actionsの設定

ブログのソースコード側に、自動的にデプロイされるように設定を入れます。

.github/workflows/daily-deploy.ymlという名前で以下のようなファイルを作ります。

# 毎日00:00 JSTにデプロイ(予約投稿の反映のため)
name: Daily Deploy

on:
  schedule:
    - cron: '0 15 * * *'  # 15:00UTC

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger Cloudflare Pages Deploy Hook
        run: curl -d "" "${{ secrets.CF_DEPLOY_HOOK_URL }}"

毎日15:00 UTC(00:00 JST)にデプロイフックURLを叩いているだけの簡単なワークフローです。

これで、pubDatetimeを過ぎたら自動的に表示されるようになります。

注意事項

これで8割くらいやりたいことができますが、「擬似的に」と書いた通り、この方法はいくつか制限があります。

指定した時刻ピッタリの投稿はできない

上記の設定は「毎日00:00にデプロイ開始」なので、実際に反映されるまでにタイムラグがあります。 また、例えば昼の12時の予約投稿などには対応していないので、予約投稿の粒度に合わせてcron部分を修正してください。

そしてGitHub Actionsのドキュメントにあるように、デプロイ開始自体が遅延する場合があります。

  • The schedule event can be delayed during periods of high loads of GitHub Actions workflow runs. High load times include the start of every hour. If the load is sufficiently high enough, some queued jobs may be dropped. To decrease the chance of delay, schedule your workflow to run at a different time of the hour.

このブログの運用方針としては多少タイムラグがあっても問題なく、頻度も1日1回で十分なのでこの設定にしています。

予約投稿の記事は「どこからもリンクされていない」だけで、存在はしている

これはAstroの仕様で、pubDatetimeがデプロイ時より未来の場合でも、記事の静的ファイルは作成されます。 単にどこからもリンクされていないだけなので、ファイル名を知っていれば普通にアクセスできてしまいます。 未公開情報を予約投稿する時は注意してください。

多分ビルド時に未来の記事を除外する方法とかあると思いますが、個人的に困っていないのでこのまま運用しています。

更新をサボると自動投稿が無効になる

こちらもGitHub Actionsのドキュメントにありますが、パブリックリポジトリーで管理している場合、60日間更新がないと自動的にワークフローが無効化されるようです。

  • In a public repository, scheduled workflows are automatically disabled when no repository activity has occurred in 60 days. For information on re-enabling a disabled workflow, see Disabling and enabling a workflow.

サボらずに定期的に更新しましょう。


Share this post on:

Previous Post
Node.jsのバージョン管理
Next Post
Kyotifyどすえ