ブログ更新する習慣が途切れて1か月以上が経ってしまった。

いろいろ要因はありつつも、とりあえず更新の手間を下げて改善を図ろうと思いたち、GitHubへの移行を決行した。

言いたいこと

  • GitHub ActionsでHugo使いたいときはシンプルにGo Modulesで管理しつつGoのステップを使えばいい
  • Firebase Hostingへのデプロイのワークフローはfirebase init hosting:githubで簡単にセットアップできる

背景

もともとGitLabとGitLab CIで管理・デプロイしていて、glabコマンドを使ったりして工夫はしていた。が、やっぱり日常使いしてるGitHubと違うことで発生する地味なコンテキストスイッチがストレスだった。

リポジトリの移行自体は別にremoteを切り替えるだけなのでどうってことないが、CIの移行はイチからやることになるのでどのようにやったかを残しておく。

GitHub Actions上でHugoを使う

Marketplaceに有志が作ったHugoのActionがかなりあるが、シンプルなビルドだけならactions/setup-go@v2を使えばいい。

そのためにまずHugo自体のバージョン管理も兼ねてGo Modulesの管理下に置く。

go mod init なんか適当なモジュール名
go get github.com/gohugoio/hugo

Go Modulesでビルドツールへの依存を管理するために、おなじみのtools.goを追加する。

//+build tools
package tools

import _ "github.com/gohugoio/hugo"

これで管理下に置いたバージョンのHugoをインストールできるため、GitHub Actions上でも特定のバージョンのHugoを使える。ステップとしてこんな感じになる。

- name: Set up Go
  uses: actions/setup-go@v2
  with:
    go-version: "1.16"

- name: Cache Hugo binary
  id: cache-hugo
  uses: actions/cache@v2
  with:
    path: ~/go/bin/hugo
    key: v1-hugo-${{ hashFiles('go.mod') }}
    restore-keys: v1-go-hugo-

- run: go install github.com/gohugoio/hugo
  if: steps.cache-hugo.outputs.cache-hit != 'true'

- run: hugo

Hugoの実行バイナリをキャッシュするようにしてる。

Firebase Hostingへのデプロイ

ドキュメントにある手順で概ね完結する。

PR作成時にプレビューチャネルへのデプロイもやってくれるワークフローを生成できるのでなかなか便利だ。

デプロイ前のビルドステップは生成されたワークフローに前述のHugo実行までをまるっと入れちゃえばいい。

その他

dependabotを仕込めばHugoのバージョンアップにも追従しやすくなる。firebase-toolsをpackage.jsonで管理していればそちらも追従しやすい。GitHubがすっかり便利になってしまってなんとも感慨深い。