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

簡単

学習コスト低い。

まとめ

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