GitHub Action 自動化部署 Hugo 網站

使用 GitHub Action 的 CI/CD 讓更新部落格變得更簡單

在今天之前,這個 blog 是用 Wercker 做自動化部署,當時對於 CI/CD 工具沒有太多比較,就直接使用了。

在 2018 年底,GitHub 公開了他們的自有 CI/CD 工具 GitHub Action,並於 2019 年底正式推出。這個工具經過了兩年多的發展,如今也有一定成熟度,社群有很多相關的工具發展起來,當然也不乏 Hugo 的自動化部署。如果 repo 使用 GitHub,那整合 GitHub 自家 CI/CD 當然是最方便的。

因此去年在公司實習時,主管就叫我研究一下 GitHub Action 套用在當時開發的 Rails 專案,我只參考了官方文件並套用了一些社群貢獻的 GitHub Action,就成功完成任務,包含在開 PR 時自動跑 coding style review (rubocop) 以及 push 時跑單元測試 (RSpec)。人生又往 YAML 工程師前進了一步。

正文

這邊就不多介紹 GitHub Action 了,接下來就記錄我如何從 Wercker 搬遷到 GitHub Action(說是搬遷,實際上就是參考原本的 CI/CD 建立一個新的 CI/CD)。

首先我們先來看之前 wercker 設定檔:

把 CI/CD 自動化的事情整理一下:

每次 Push 時:

  • 更新 submodule 把 theme 拉下來(這邊是我修改自 Blackburn 主題的 dw-favored-blackburn
  • hugo 產生靜態網站
  • 把 build 後在 ./public 資料夾內的檔案推到另一個公開 repo

對應的 GitHub Action 如下:

  • actions/checkout,官方 action,checkout repo 讓 workflow 可以存取 code,這邊可以直接設定 checkout 後要連 submodule 一起拉下來
  • peaceiris/actions-hugo,幫你裝 Hugo(之後還是要自己跑 hugo 來產生靜態網站)
  • peaceiris/actions-gh-pages,幫你把某個資料夾下的檔案推到特定分支,也支援推到別的 GitHub repo,完全符合我的需求,只是需要另外在外部 repo 設定 deploy key 讓 action 可以把檔案推過去

把這三個照著 workflow syntax 寫好之後其實就大功告成了:

雖然整體看起來比原本長,不過對於觸發時機以及觸發分支的管理(on push, master)也集中到這個檔案了,就不用再 GitHub 和 Wercker 兩邊跑,全部集中在這個檔案(除了設定一些敏感資訊之外),因此我覺得還是比較方便。

當 push 到 master 分支之後結果如下:

workflow results

關於 Deploy Key

這邊是稍微比較複雜的地方,這個 deploy key 是需要自己產生自己放上 GitHub 的。產生的方法不外乎使用 ssh-keygen

$ ssh-keygen

照著指示做就好,之後會生成一組 public-private key。Private key 是沒有副檔名的,public key 則有附檔名 .pub

Hugo 原始碼的 repo 要放 private key,放在 action secrets 供 action 存取(注意要把整個檔案內容,包含頭尾兩行 -----BEGIN OPENSSH PRIVATE KEY----- 等一起貼上去):

put private key in hugo repo’s action secret

要架設 GitHub Page 的外部 repo 則是要設定 deploy key,把 public key 整個檔案貼過去:

put public key to outer repo’s deploy key