使用GitHub Action实现HEXO的自动编译和发布

经过上一篇的步骤之后,我们已经可以将我们的HEXO站点发布到GitHub上了,并且可以正常访问。但是我们每次更新文章以及站点配置的时候必须先在本地进行编译、然后再部署到GitHub上,也就是每进行一次修改,必须执行以下命令

1
2
3
hexo g
hexo clean
hexo d

那有没有一种方法就是,系统检测到我们发布了新文章,然后自动进行程序的编译和发布呢?
今天部署的这个GitHub Action服务就是解决这个问题的。在上一篇文章中我们在 GitHub上还新建了一个私人仓库,我们今天用这个私人仓库来进行操作。

1.修改本地文件

删除主题文件夹下隐藏的.git文件夹

删除hexo根目录下的.deploy_git文件夹

这两个是我踩过的坑,因为主题文件和hexo deploy git工具是git clone到本地的,所以如果直接上传到GitHub仓库的话,只会上传一个空的指针文件夹,之后进行自动化编译的时候会报错,所以必须删除本地的.git相关信息。

2.将本地HEXO源文件推送到私人仓库

在hexo文件夹中初始化hexo

1
2
hexo init
git init

关联远程仓库

1
git remote add origin git@github.com:miaoyanginfo/hexo-action.git

和远程仓库进行一个同步

1
git pull --rebase origin main

将本地文件添加到暂存库

1
git add .

添加注释

1
git commit -m "init repo"

推送到GitHub私人仓库

1
git push -u origin main

如果一切顺利的话,我们就会在GitHub的私人仓库中看到我们PUSH上去的HEXO文件夹和文件。

3.生成并部署deploy公钥和密钥

定位到本地hexo文件夹运行以下命令创建deploy key:

1
ssh-keygen -f github-deploy-key -C "HEXO CD"

运行完成之后会在hexo根目录下生成github-deploy-key和github-deploy-key.pub两个文件,一个私钥,一个公钥。
进入github我们创建的私人仓库,settings-secrets添加actions secrets。
名字输入 SSH_PRIVATE
value输入生成的github-deploy-key内容,也就是私钥的内容。

进入github我们创建的公开仓库,找到settings-deploy keys,
名字输入 HEXO_DEPLOY_PUB
内容输入github-deploy-key.pub文件内的所有内容,也就是公钥的内容。

4.创建GitHub Action文件

进入GitHub私人仓库页面,切换到Actions选项,创建一个名为deploy.yml的文件,内容复制下面:

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
name: Deploy                      # Actions 显示的名字,随意设置
on: [push] # 监听到 push 事件后触发
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout # 拉取当前执行 Actions 仓库的指定分支
uses: actions/checkout@v2
with:
ref: main # 注意选择私人仓库是main还是master分支

- name: Setup Node # 使用node 14
uses: actions/setup-node@v2
with:
node-version: "14"

- name: NPM INSTALL #安装依赖
run: |
npm install hexo-cli -g
npm install hexo-deployer-git --save
npm install

- name: Add KEY #这里需要提供一个ssh私钥,用你平时常用机器里的 ~/.ssh/id_rsa即可
env:
SSH_PRIVATE: ${{ secrets.SSH_PRIVATE }}
run: |
mkdir -p ~/.ssh/
echo "$SSH_PRIVATE" > ~/.ssh/id_rsa
chmod 700 -R ~/.ssh
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.email "paulmiao@me.com"
git config --global user.name "miaoyanginfo"

- name: Hexo Deploy # hexo deploy 会自动build然后上传到github.io项目中
run: |
hexo clean
hexo deploy

5.测试Action是否正常运行

我们现在私人仓库/source/_posts文件夹下新建一个.md的日志文件,然后切换到Actions选项卡看下自动化执行过程是否有报错,如果运行正常的话,我们进入公开仓库,看下文件的最后修改时间是不是最近几秒钟内。
然后我们再打开我们的github站点地址,看看是不是有新日志已经发布了。

总结

经过两篇文章的操作,我们已经可以实现HEXO在GitHub上面的部署以及使用GitHub的Action功能来实现文章发布时自动编译和部署。如果在部署过程中遇到问题,欢迎和我交流。