Github ActionsでHugoを自動デプロイさせる

経緯

手動でサーバーに向けてHugoで書いた記事のデプロイをするのがめんどくさい。
手元に同一の記事データやテーマファイルがないと色々厳しいため、GithubでHugoのコンテンツをまるっと管理する形にした。
調べてみるとこのようなスタイルでコンテンツを管理している人が結構多く、同時にHugoからの記事のデプロイもGithub Actionsを利用しているケースが散見されたため、自分もGithub Actionsに入門することにした。

どうやったか

Github Actions側のマシンでHugoのコンテンツをビルドしたものをVPSへとrsyncで同期させている。
ビルドしたコンテンツはGithub Pagesとかにデプロイしている人は多いけど、自前のサーバーにデプロイする例がほとんどなかったので以下にWorkflowを書いておく。

Workflowサンプルコード

 1name: Deploy Hugo
 2
 3on:
 4  push:
 5    branches:
 6    - main
 7  workflow_dispatch:
 8
 9jobs:
10  build:
11    runs-on: ubuntu-latest
12    concurrency:
13      group: ${{ github.workflow }}-${{ github.ref }}
14    steps:
15      - uses: actions/checkout@v3
16        with:
17          submodules: true 
18          fetch-depth: 0
19
20      # quotepathを無効にしないと後述の問題がでる
21      - name: Git config quotepath
22        run: git config core.quotePath false
23        env:
24          TZ: 'Asia/Tokyo'
25
26      - name: Setup Hugo
27        uses: peaceiris/actions-hugo@v2
28        with:
29          hugo-version: '0.91.2'
30          extended: true
31
32      - name: Build
33        run: hugo --minify
34
35      - name: Deploy
36        uses: burnett01/rsync-deployments@5.2
37        with: 
38          switches: -avzr --delete
39          path: public/
40          # デプロイ先サーバーのディレクトリ
41          remote_path: ${{ secrets.DEPLOY_PATH }}
42          # デプロイ先サーバーのIPアドレス、ドメイン名
43          remote_host: ${{ secrets.DEPLOY_HOST }}
44          # デプロイ先サーバーのSSHポート
45          remote_port: ${{ secrets.DEPLOY_PORT }}
46          # デプロイ先サーバーのSSHユーザー名
47          remote_user: ${{ secrets.DEPLOY_USER }}
48          # デプロイ先サーバーのSSH秘密鍵(上記ユーザーの秘密鍵)
49          remote_key: ${{ secrets.DEPLOY_KEY }}

一応このままだとやらかしデプロイでデータが飛ぶとかありそうなので、バックアップやブランチ間で挙動を変えるなど色々手を加えても面白いかも。

非ASCIIファイル名におけるlastmodを上手く拾ってくれない問題

Hugoでは記事の最終更新日をgitのコミットログから拾ってくれる機能がある。
しかしgitで追跡させているファイル名が非ASCII文字の場合、Hugoで上手く紐づけできないらしく、gitの設定を変更する必要がある。
https://github.com/gohugoio/hugo/issues/3071で対応方法が出ている。

対応策としては簡単で、git config --global core.quotePath falseを設定すればOK。
(タイムゾーンも忘れずに)

Github Actionsを使ってみて

触る前はクソクソ難しそうなイメージあったけど一回動かせたらとっつきにくいイメージがかなり消えた。
Github Actions初心者の人はめんどくさがらずにsecretsをちゃんと使ったほうがよさそう。