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

最終更新日:

経緯

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

どうやったか

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

Workflowサンプルコード

name: Deploy Hugo

on:
  push:
    branches:
    - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true 
          fetch-depth: 0

      # quotepathを無効にしないと後述の問題がでる
      - name: Git config quotepath
        run: git config core.quotePath false
        env:
          TZ: 'Asia/Tokyo'

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: '0.91.2'
          extended: true

      - name: Build
        run: hugo --minify

      - name: Deploy
        uses: burnett01/rsync-deployments@5.2
        with: 
          switches: -avzr --delete
          path: public/
          # デプロイ先サーバーのディレクトリ
          remote_path: ${{ secrets.DEPLOY_PATH }}
          # デプロイ先サーバーのIPアドレス、ドメイン名
          remote_host: ${{ secrets.DEPLOY_HOST }}
          # デプロイ先サーバーのSSHポート
          remote_port: ${{ secrets.DEPLOY_PORT }}
          # デプロイ先サーバーのSSHユーザー名
          remote_user: ${{ secrets.DEPLOY_USER }}
          # デプロイ先サーバーのSSH秘密鍵(上記ユーザーの秘密鍵)
          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をちゃんと使ったほうがよさそう。