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