Hugoで予約投稿をする

こんにちは
気が付けば2023年も終わりに近づいていてビックリしています。
年末といえばアドベントカレンダーですよね。
AdventerなどのサービスでURLを登録しておくと指定した日時になるとURLを公開してくれます。
しかしこれはAdventer上の話であって、登録したブログの記事などに予約投稿機能が無いと指定した期日までの間にも記事が見えてしまいます。
ブログサービスには予約投稿機能のあるものがほとんどだと思いますが、このブログはHugoを使っているのでそんなものは無いです。
ただ、調べてみると簡単な方法で簡易的な予約投稿機能を実現できそうです。

定期的にビルドするアプローチ

Hugoの仕様として

  • buildFuture = false
  • Front matterのdateが未来

だとビルドをしないようです。
なので、ビルドを定期的に実行することでその時点でのdateが過去になったらビルドされる = 公開される
ということになります。

front matterの設定

予約投稿したい記事のFront matterを以下のようにします。
dateは未来の日付にします。
draftはfalseにしないと未来になっても下書きのままになってしまうので、trueにしておきます。

---
title: "Future Test Post"
date: 2023-11-05T00:00:00+09:00 
draft: false
---

未来の日付の記事を開発環境で確認したい場合は

hugo server --buildFuture

で確認することができます。

config.tomlの設定

config.tomlに

buildFuture = false

を追加します。(デフォルトでfalseなのでいらない気もしますが、一応明示しておきます)

Github Actionsの設定

ビルドを定期的に実行するようにします。
僕の場合はGithubActionsでビルドタスクを走らせているので、GithubActionsでやります。
このブログの場合はこんな感じです。
毎日0時に実行したいのでタイムゾーンの関係で9時間引いて15時に指定しています。
(JSTをUTCにしています)

name: build-everyday
on:
    schedule:
        - cron: '0 15 * * *'
jobs:
    build:
        runs-on: ubuntu-20.04
        steps:
          - uses: actions/checkout@v2
            with:
              submodules: true  # Fetch Hugo themes (true OR recursive)
              fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod

          - name: Setup Hugo
            uses: peaceiris/actions-hugo@v2
            with:
              hugo-version: '0.89.2'
              extended: true

          - name: Setup Node
            uses: actions/setup-node@v2
            with:
              node-version: '14'

          - name: Cache dependencies
            uses: actions/cache@v2
            with:
              path: ~/.npm
              key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
              restore-keys: |
                ${{ runner.os }}-node-

          - name: install node_modules
            run: npm ci

          - name: Build
            run: hugo --gc --minify

          - name: Deploy
            uses: cpina/github-action-push-to-another-repository@main
            env:
              API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
            with:
              source-directory: 'public'
              destination-github-username: 'takashiTkg'
              destination-repository-name: 'blog'
              user-email: takashi.develop@gmail.com
              target-branch: main

これでビルドが毎日0時に実行されて指定した日時になると記事が予約投稿されるはずです。

まとめ

  • dateを未来にする
  • draft:false
  • buildFuture = falseを設定
  • 定期的にビルド

をすることで簡易的な予約投稿機能を実装することができました。
Hugoは機能が豊富かつビルドも速く、テーマも豊富なのでおすすめです。

20230705 日記 Adventarの埋め込みをHugoでやる