Hexo在GitHub Actions上的自动部署

Hexo博客是一个快速、简洁且高效的静态博客框架,每次修改和创作完成后需要部署。它的部署基于Node.js环境,我们可以把这个过程放在GitHub Actions上,配合GitHub自带强大的在线文本编辑和预览功能,可以实现网页上写文章、提交文章、自动部署后在博客上生效的工作流。

现状

我的Hexo博客目前有两个相关的GitHub仓库:一个是Public公开的仓库,设置了GitHub-Pages,就是博客内容展示的实际仓库

另外还有一个Private私有仓库,里面放的是博客的源码,平常写作就是在这个仓库里面。之前每次操作完要部署到线上博客页面时,需要在本地进行这样的操作:

1
2
3
4
npm i
hexo cl
hexo g
hexo d

把整个博客部署到公开的仓库后才会生效。部署的配置在_config.yml文件中,展示如下:

1
2
3
4
5
deploy:
type: git
repo: git@github.com:leoliupei/leoliupei.github.io.git
branch: master
message: HEXO deploy

部署完还需要把博客源码提交到私有仓库中,保存和同步代码。

下文中的私有仓库指的是博客源码仓库,公开仓库指的是博客实际展示的仓库

目标

希望实现这样一个效果,只要我私有仓库的main主分支有变动(往往是进行了文章创作,或者配置改动),就会自动触发部署,然后线上博客页面就发生变化。

触发私有博客仓库的变化方式有很多种,比如和之前一样从本地提交代码;由于GitHub网页版有强大的(支持Markdown)文本编辑器,甚至可以在线编辑修改文章和配置文件,这样我们的博客就成为了一个类似可在线编辑的博客平台了。

方法

以下操作均在Mac OS下进行,只有小部分命令行操作与操作系统相关,大部分无关可直接使用

工作流中核心的部署操作使用了第三方开源的脚本,作者是使用npm而不是yarn,所以你的Hexo最好使用npmpackage-lock.json来进行包管理

生成和配置SSH Key

由于Hexo deploy命令本质是给仓库提代码,所以在我们这就是私有仓库向公开仓库提代码,这个过程需要私有仓库持有公开仓库的私钥。我们先用命令行生成一对公钥和私钥:

1
ssh-keygen -t rsa -C "your@email.com"

这里的your@email.com替换为你GitHub的邮箱

默认情况下会在~/.ssh文件夹下生成一对公钥和私钥文件,名称分别为id_rsa.pubid_rsa

输入如下命令拷贝公钥到剪切板:

1
pbcopy < ~/.ssh/id_rsa.pub

公开仓库设置中添加该公钥,Settings->Security->Deploy Keys->Add deploy key,粘贴后一定要勾选上Allow write access,确定即可。

然后输入如下命令拷贝私钥到剪切板:

1
pbcopy < ~/.ssh/id_rsa

私有仓库设置中添加该私钥,Settings->Security->Secrets->Actions->New repository secret

其中Name字段一定要填这个文案:

1
DEPLOY_KEY

因为后续脚本要调用GitHub的API从项目配置中取到这个Name的值,所以Name名一定只能是这个

Value字段粘贴自剪切板,然后点击Add secret即可

配置Actions

点击私有仓库Actions选项卡,新建一个Custom workflow,这时会进入创建工作流的界面,右侧有一个job市场,可以搜索一些别人写的优秀job。

在市场中搜索Hexo可以找到一个Star最多的job:sma11black/hexo-action

项目的README.md给出了一个完整工作流的demo,我们复制这个工作流,做一些修改即可使用,下面是原版:

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
name: Deploy

on: [push]

jobs:
build:
runs-on: ubuntu-latest
name: A job to deploy blog.
steps:
- name: Checkout
uses: actions/checkout@v1
with:
submodules: true # Checkout private submodules(themes or something else).

# Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.)
- name: Cache node modules
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: npm ci

# Deploy hexo blog website.
- name: Deploy
id: deploy
uses: sma11black/hexo-action@v1.0.3
with:
deploy_key: ${{ secrets.DEPLOY_KEY }}
user_name: your github username # (or delete this input setting to use bot account)
user_email: your github useremail # (or delete this input setting to use bot account)
commit_msg: ${{ github.event.head_commit.message }} # (or delete this input setting to use hexo default settings)
# Use the output from the `deploy` step(use for test action)
- name: Get the output
run: |
echo "${{ steps.deploy.outputs.notify }}"

其中我就改动了一个部分

on的这部分表示触发的条件。我改为只关注main分支的push事件

1
2
3
on: 
push:
branches: [ main ]

其他部分如果你也是用npm做包管理,不再需要任何改动即可正常运行。之前我用yarn然后对脚本进行了一些修改,还是发现会有问题,建议直接用npm就好了

最后提交这个文件到main分支后,进入Actions选项卡就马上可以看到,自动部署已经开始触发。