众所周知,懒是第一生产力。

Hexo最标准的使用方式是,hexo new post写篇文章,然后hexo generate && hexo deploy生成静态文件并推送到Git服务器。

看起来并不麻烦,但是我懒 :)

hexo g执行一般需要半秒钟,hexo d视网络状态而定,一般也要一两分钟。那就是说,还有简化空间(确信)

并且,我更希望网站挂在自己的服务器上而不是GitHub Pages,于是步骤又麻烦了点,每次还要把Public打个包再scp扔上去。

于是就有了本文。

Caddy的用法,在先前一篇水文Caddy——从建站到跑路中已有相关介绍,此处从略。http.git插件要装上。

自动化部署的思路,大概是这样的:git push之后,GitHub通过webhook机制通知服务器,Server收到通知后执行git pullhexo g命令。

建立repo啥的不多赘述,需注意的是这里的仓库要覆盖整个Hexo目录。

首先在服务器上执行ssh-keygen -t rsa -C "webmaster@example.com"以生成专用SSH Key,passphrase为空,cat ~/.ssh/id_rsa.pub读取公钥,在GitHub中授权。ssh -T git@github.com测试一下,看到successfully authenticated就成。

安装一下Hexo:

1
2
apt install -y npm nodejs git
npm install -g hexo-cli

Caddyfile中需修改的部分如下:

1
2
3
4
5
6
7
root /www/example.com/public
git ssh://git@github.com:/user/repo.git /www/example.com {
key /root/.ssh/id_rsa
then hexo clean
then hexo g
hook /cgi-bin/webhook "webhook-secret"
}

systemctl restart caddy.service使其生效。

出于安全考虑,这里的webhook地址建议使用随机字符串,webhook秘钥建议使用随机UUID(执行cat /proc/sys/kernel/random/uuid即可)

然后在GitHub仓库设置中启用webhook,设置payload地址和秘钥,Content-Type选application/json,完毕后看到绿色的勾即可。至此,CI设置完毕。

为什么要这样搞?

“简洁”

对于写作者自身来讲,技术细节应当最小化,这样才能集中于文本的质量。这样一套CI使得我在任何地方都可以写点东西——网页版的GitHub就能胜任,而本机写作也得到了相应的简化——写完之后扔进目录,git push即可。相较于之前,现在的部署仅需push一个Markdown文档,节约了不少时间。再比如,很多时候写完推上去,看到一个错别字,改完再重新deploy费心费力,有了自动构建就变得异常方便。

技术总是应该服务于人文。维护一个博客也是同样,乐趣总是来源于写作本身。