准备

  • hugo
  • github
  • nginx/caddy

hugo

注意: 安装 extended 版本, 否则使用第三方主题时会有问题

hugo new site quickstart
cd quickstart
git clone https://github.com/flysnow-org/maupassant-hugo themes/maupassant
echo theme = \"maupassant\" >> config.toml
hugo new posts/my-first-post.md
// 测试
hugo server -D
// 生成静态文件
hugo -D

github

  • 创建 repo

  • 设置 webhook

  • 将上面的 quickstart 文件夹整体进行版本管理(其实只管理 content 也行, 要是为了方便换主题, 可以直接搞整个)

  • 在 server 上启动 webhook server eg.

package main

import (
	"crypto/hmac"
	"crypto/sha1"
	"encoding/hex"
	"fmt"
	"io/ioutil"
	"net/http"
	"os/exec"
)

var (
	key []byte
)

func sha1Data(data []byte) string {
	h := hmac.New(sha1.New, key)
	h.Write(data)
	ret := h.Sum(nil)
	return hex.EncodeToString(ret)
}

func hook(w http.ResponseWriter, req *http.Request) {
	signature := req.Header.Get("X-Hub-Signature")
	body, _ := ioutil.ReadAll(req.Body)
	fmt.Println(sha1Data(body), signature)
	if fmt.Sprintf("sha1=%s", sha1Data(body)) == signature {
		fmt.Println("github hook")
		cmd := exec.Command("/bin/sh", "-c", `cd /workdir && git fetch --all && git reset --hard origin/main && git pull && hugo -D`)
		var result []byte
		var err error
		if result, err = cmd.Output(); err != nil {
			fmt.Println(err)
		}
		fmt.Println(string(result))

		return
	}
	w.WriteHeader(500)
	fmt.Fprintf(w, "error")
}

func startServer() {
	http.HandleFunc("/", hook)
	http.ListenAndServe(":8888", nil)
}

func main() {
	key = []byte("key")
	startServer()
}

Nginx/Caddy

  • 指向 quickstart/public