モチベーション

Hugoは静的サイトジェネレータであり,予約投稿というものが無い.これでは「アドベントカレンダーで0時に公開したい」などという時に困るので,どうにかして予約投稿を実現したい.

tl;dr

Hugo製ブログをNetlifyでホスティングしている前提.
NetlifyのBuild hooksGitHub Actionsのscheduleを用いる.

NetlifyのBuild hooks

buildとdeployをトリガーする為のURL.
ダッシュボードの Settings > Build & deploy > Continuous Deployment > Build hooks にある. Add build hookからBuild Hooks URLを作成する.nameは参照用で,Build hooksのリストとdeploy時のメッセージに表示される.
branchはmasterにする.

Add Build Hook
Build Hooks URL
生成されたURLを用いて,端末で以下のようなcurlコマンドを叩くと,Netlifyでbuildとdeployが実行される.

curl -X POST -d '{}' https://api.netlify.com/build_hooks/XXXXXXXXXXXXXXX

GitHub Actionsのschedule

別に他のCIサービスを用いても良いのだが,自分はTravis CIしか使ったことがなかったのと,Travis CIのCron Jobsではdailyが最短なので却下.
そういえばGitHub Actionsなんてものがあったなぁと思って触ってみた.

GitHub Actionsではリポジトリの~/.github/workflows以下にYAML構文でワークフローを定義する.
ワークフローの書き方は Workflow syntax for GitHub Actions を参考にされたい.

今回は「毎時0分にbuild & deployを実行」させてみる.

schedule.yaml

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を追加すればよい.

Secrets

これで完成.ちょうど1時間毎に実行されていることが確認できる.

Scheduler

利点

  • gitが汚染されない
    空commitをmasterにpushすればNetlifyが自動buildしてくれるが,これだとlogが汚れるのでcurlを叩いたほうが綺麗.
  • build頻度が分単位で決定できる
    scheduleを使って POSIX cron 構文 で記述できる.
  • (ほぼ)無料
    Publicレポジトリなら無料,Privateでもこの程度の使用なら無料.(Freeで2,000分/月)
    https://github.com/features/actions
  • 簡単
    学習コスト低い.

まとめ

意外と簡単にできた.これ書いてるのがアドベントカレンダー前日.上手くいくと良いな〜