Netlify + GitHub ActionsでHugo製ブログの予約投稿

2019-12-07
#hugo #netlify #githubactions #ci
  1. モチベーション
  2. tl;dr
  3. NetlifyのBuild hooks
  4. GitHub Actionsのschedule
  5. 利点
  6. まとめ

モチベーション

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を実行」させてみる。

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分/月)

簡単

学習コスト低い。

まとめ

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