目前部署 Hexo 的操作比较麻烦,先在本地执行 hexo clean && hexo d 生成博客静态文件并发布到 GitHub 上,然后通过 XShell 登录到服务器,切换到博客站点目录下 git pull 拉取最新的代码,最近网络也不太不稳定,拉取代码也经常超时,更新的时候还得看运气。

有两种方案可以自动更新:GitHub WebHook 和 GitHub Actions。

WebHook 是一种比较简单且常见的方式,在仓库配置一个回调地址并指定需要回调的事件类型即可。

比如指定了 push 事件,往该仓库 push 代码时,GitHub 就会请求配置的回调地址并携带一些信息,通过这些信息就可以检查请求是否合法、是哪个仓库的谁提交了代码,从而决定是否需要更新服务器端的代码。

详情可以看官方的文档:https://docs.github.com/cn/developers/webhooks-and-events/about-webhooks

Actions 是 GitHub 新推出来(快两年,也不算新了)的一种持续集成的方案,将上面这些操作变成一个个的任务(Job)组成工作流,当发生指定事件后触发该工作流,也可以用别人写好的工作流。

更详细的内容可以看 官方文档 和阮老师的 GitHub Actions 入门教程

话不多说,直接贴 GitHub Actions 的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 工作流的名称
name: Hexo Blog CI

# 指定触发的条件,这里是打标签才触发该工作流,你也可以改成 on: push,只要提交代码就触发
on:
push:
tags:
- 'v*'

jobs:
build:
runs-on: ubuntu-latest

steps:

# 检查工作流是否可以访问 actions
- name: Checkout Repository master branch
uses: actions/checkout@master

# 安装 NodeJs
- name: Setup Node.js 12.x
uses: actions/setup-node@master
with:
node-version: "12.x"

# 安装 Hexo 的依赖库
- name: Setup Hexo Dependencies
run: |
npm install hexo-cli -g
npm install

# 设置 Hexo 部署的私钥
- name: Setup Deploy Private Key
env:
HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts

# 设置 Git 信息
- name: Setup Git Infomation
run: |
git config --global user.name "Git 用户名"
git config --global user.email "Git 邮箱"

# 部署 Hexo 静态文件到博客所在的分支
- name: Deploy Hexo
run: |
hexo clean
hexo generate
hexo deploy

# 部署到服务器
- name: Deploy Server
uses: appleboy/ssh-action@master
env:
SITE_DIR: 站点目录(如:/var/www/blog)
with:
host: ${{ secrets.SERVER_IP }}
port: ${{ secrets.SERVER_PORT }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.SERVER_PRIVATE_KEY }}
envs: SITE_DIR
script: |
cd $SITE_DIR
sudo git config --global pull.rebase true
sudo git pull origin master --allow-unrelated-histories

其中 Git 用户名Git 邮箱站点目录 都要替换成你自己的。

首先打开 https://github.com/用户名/仓库名/settings/secrets/actions 新增几个 Action secret,在上面的执行工作流的时候会用到。

需要新增以下几项:

Name Value
SERVER_IP 服务器 IP
SERVER_PORT 服务器端口号
SERVER_USERNAME 用户名
SERVER_PRIVATE_KEY 服务器私钥(服务器的 ~/.ssh/id_rsa)
HEXO_DEPLOY_PRIVATE_KEY 部署私钥(本地的 ~/.ssh/id_rsa)

前三项就不多说,主要讲下后面两项怎么设置。

HEXO_DEPLOY_PRIVATE_KEY 是为了在工作流中能够提交代码到 GitHub,SERVER_PRIVATE_KEY 是为了能在工作流中登录到服务器上执行命令。

工作流被触发后,先生成博客的静态文件,并通过 hexo deploy 提交到博客所在的分支(由 Hexo 配置文件中的 deploy.branch 指定),这里涉及到提交代码,所以要配置 SSH Key。

查看电脑上是否已经生成了密钥对。

1
2
$ ll ~/.ssh
# 输出: id_rsa id_rsa.pub known_hosts

如果为空则执行以下命令,一路回车就可以了:

1
$ ssh-keygen -t rsa -C "你的邮箱"

这时候电脑上就会有两个文件:~/.ssh/id_rsa、~/.ssh/id_rsa.pub,分别是是私钥和公钥。

id_rsa 文件的内容就是 HEXO_DEPLOY_PRIVATE_KEY 的 Value。

然后打开 https://github.com/settings/ssh/new,将 id_rsa.pub 的内容填到 Key 里面,Title 可以随便去,然后保存。

接下来就是 SERVER_PRIVATE_KEY,登录到服务器拿到密钥对,步骤跟上面差不多,没有的话就生成。

服务器中 ~/.ssh/id_rsa 文件的内容就是 SERVER_PRIVATE_KEY 的 Value,然后将 ~/.ssh/id_rsa.pub 的内容追加到 ~/.ssh/authorized_keys 文件中。

需要注意:

  • 服务器中必须已经存在 SITE_DIR 目录,且已经将仓库 clone 下来了。
  • 在服务器上可以免密执行 git pull。

更新博客时只需要打标签,然后将标签推送到云端就会触发工作流。

1
2
$ git tag v1.0.0
$ git push origin v1.0.0

GitHub Actions Log