Hugoは静的サイトジェネレータであり、予約投稿というものが無い。これでは「アドベントカレンダーで0時に公開したい」などという時に困るので、どうにかして予約投稿を実現したい。
Hugo製ブログをNetlifyでホスティングしている前提。 NetlifyのBuild hooksとGitHub Actionsの scheduleを用いる。
buildとdeployをトリガーする為のURL。 ダッシュボードの Settings > Build & deploy > Continuous Deployment > Build hooks にある。 Add build hookからBuild Hooks URLを作成する。nameは参照用で、Build hooksのリストとdeploy時のメッセージに表示される。 branchはmasterにする。
生成されたURLを用いて、端末で以下のような curl コマンドを叩くと、Netlifyでbuildとdeployが実行される。
curl -X POST -d '{}' https://api.netlify.com/build_hooks/XXXXXXXXXXXXXXX
schedule別に他のCIサービスを用いても良いのだが、自分はTravis CIしか使ったことがなかったのと、Travis CIのCron Jobsでは daily が最短なので却下。 そういえばGitHub Actionsなんてものがあったなぁと思って触ってみた。
GitHub Actionsではリポジトリの ~/.github/workflows 以下にYAML構文でワークフローを定義する。 ワークフローの書き方は Workflow syntax for GitHub Actions を参考にされたい。
今回は「毎時0分にbuild & deployを実行」させてみる。
name: scheduler
on:
schedule:
- cron: '0 * * * *'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Post build hooks
run: curl -X POST -d {} ${{ secrets.BUILD_HOOKS_URL }}
最終行の ${{ secrets.BUILD_HOOKS_URL }} はGitHubの Settings > Secrets に設定した変数を呼び出している。ここに先程Netlifyで生成したBuild Hooks URLを追加すればよい。 
これで完成。ちょうど1時間毎に実行されていることが確認できる。 
空commitをmasterにpushすればNetlifyが自動buildしてくれるが、これだとlogが汚れるので curl を叩いたほうが綺麗。
schedule を使って POSIX cron構文 で記述できる。
Publicリポジトリなら無料、Privateでもこの程度の使用なら無料。(Freeで2,000分/月)
学習コスト低い。
意外と簡単にできた。これ書いてるのがアドベントカレンダー前日。上手くいくと良いな〜。