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は機能が豊富かつビルドも速く、テーマも豊富なのでおすすめです。