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分/月)
学習コスト低い。
意外と簡単にできた。これ書いてるのがアドベントカレンダー前日。上手くいくと良いな〜。