本地写文章的时候直接一行命令启动 hugo,就可以在浏览器预览文章。
hugo server
我们想实现:写完文章后只需要 push 到 GitHub,后面生成文章的过程全部自动化。
现在 GitHub 主流的自动化方式是使用 Github Actions。Repo 收到 push 事件后,触发 GitHub Action。由 GitHub Action 调用 hugo 生成 整个静态网站,然后将生成的所有静态文件提交到 GitHub Pages。
目前 GitHub Pages 有多种机制:

博客的 repo 名称为 gfreezy.github.io,属于 User Pages,只支持通过 master 的根目录访问。所以 hugo 生成的文件需要放在 repo 的 根目录。这样一来生成的文件和 hugo 原始的代码文件都混合在 repo 的目录,非常不利于长期维护。既然生成的文件位置没法修改,那我们就把 hugo 代码放在子目录 hugo 里面,根目录只放生成的文件。
这引入了一个新的问题:GitHub Action Market 里面的 hugo action 都只支持在 repo 根目录运行。找了一圈没有合适的,我们只能自己来写 action。
workflow.ymlname: github pages
on:
push:
branches:
- master
jobs:
deploy:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
submodules: true # Fetch Hugo themes
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- uses: actions/setup-ruby@v1 # (1)
- name: Publish Site
run: make # (2)
- name: Deploy
uses: stefanzweifel/git-auto-commit-action@v4.1.2 #(3)
with:
commit_message: hugo publish
-
asciidoctor 需要使用 gem 安装。需要准备好 ruby 环境
-
生成网站
-
将新生成的代码 commit,并 push 到 master
HUGO_VERSION:="0.69.0"
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
BIN:="$(ROOT_DIR)/.bin"
ifeq ($(shell uname), Darwin) # (1)
OS:="macOS"
else
OS:="Linux"
endif
.PHONY: build # (2)
build: clean install # (3)
cd $(ROOT_DIR)/hugo && $(BIN)/hugo
mv $(ROOT_DIR)/hugo/public/* $(ROOT_DIR)/
install: .bin/hugo
.bin/hugo: # (4)
# install asciidoctor
[ $(OS) == "macOS" ] && brew install asciidoctor || gem install asciidoctor
# install hugo
mkdir -p ".bin"
[ -f hugo_extended_$(HUGO_VERSION)_$(OS)-64bit.tar.gz ] || wget https://github.com/gohugoio/hugo/releases/download/v$(HUGO_VERSION)/hugo_extended_$(HUGO_VERSION)_$(OS)-64bit.tar.gz
tar -C .bin -xzvf hugo_extended_$(HUGO_VERSION)_$(OS)-64bit.tar.gz
rm -rf hugo_extended_$(HUGO_VERSION)_$(OS)-64bit.tar.gz
clean: # (4)
ls $(ROOT_DIR) | grep -v -E '^(CNAME|Makefile|hugo|README.md)?' | xargs rm -rf || true
rm -rf $(ROOT_DIR)/hugo/public/
-
判断 macos 和 linux
-
默认执行 build
-
每次 build 前,先执行 clean。避免无效的文件影响显示效果
-
将所有生成的文件全部删除