使用hugo+asciidoctor在GitHub搭建博客

1,392 阅读2分钟

本地写文章的时候直接一行命令启动 hugo,就可以在浏览器预览文章。

hugo server

我们想实现:写完文章后只需要 push 到 GitHub,后面生成文章的过程全部自动化。

现在 GitHub 主流的自动化方式是使用 Github Actions。Repo 收到 push 事件后,触发 GitHub Action。由 GitHub Action 调用 hugo 生成 整个静态网站,然后将生成的所有静态文件提交到 GitHub Pages。

目前 GitHub Pages 有多种机制:

pages-source-choose

博客的 repo 名称为 gfreezy.github.io,属于 User Pages,只支持通过 master 的根目录访问。所以 hugo 生成的文件需要放在 repo 的 根目录。这样一来生成的文件和 hugo 原始的代码文件都混合在 repo 的目录,非常不利于长期维护。既然生成的文件位置没法修改,那我们就把 hugo 代码放在子目录 hugo 里面,根目录只放生成的文件。

这引入了一个新的问题:GitHub Action Market 里面的 hugo action 都只支持在 repo 根目录运行。找了一圈没有合适的,我们只能自己来写 action。

workflow.yml
name: 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
  1. asciidoctor 需要使用 gem 安装。需要准备好 ruby 环境

  2. 生成网站

  3. 将新生成的代码 commit,并 push 到 master

Makefile
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/
  1. 判断 macos 和 linux

  2. 默认执行 build

  3. 每次 build 前,先执行 clean。避免无效的文件影响显示效果

  4. 将所有生成的文件全部删除