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をちゃんと使ったほうがよさそう。