用GitHub Actions自动发布Hexo博客
GitHub Actions是GitHub推出的持续集成服务。
我们可以把一个Action理解为一小段特定功能的脚本,多个Action能够组成一个Workflow,Workflow由各种GitHub的事件触发。我们可以用GitHub Actions来做软件的持续集成(CI)和持续部署(CD)。
在这篇文章里,我向大家介绍我是如何用GitHub Actions来自动化发布我的Hexo博客的。
Hexo和GitHub Pages
我的个人博客刀十一的DevOps小站是用Hexo生成的。想了解Hexo的朋友可以去Hexo官网。
Hexo生成静态文件后,我会把这些文件提交到GitHub Pages的代码仓库。这样就能利用GitHub Pages拥有一个免费的个人博客了。
之前,我一直是在自己电脑上手动完成发布博客的操作,流程如下:
- 在
Hexo库里写博客文章 (https://github.com/yuliji/blog)。 - 用
hexo generate生成静态文件。 - 把静态文件复制到
Pages库(https://github.com/yuliji/yuliji.github.io)。 - 在
Pages库里commit并push代码,发布。
当看到Github Actions的介绍后,我就有了用Github Actions自动发布博客的想法。
用GitHub Actions自动发布博客
我的设计是这样的,所有代码都在Hexo库里。
Hexo库里创建两个Github Actions的workflow:Build Pages和Publish Pages。Build Pages由master分支的push事件触发。他的主要功能就是用hexo generate生成静态文件,把这些静态文件打包、创建并上传到一个新的Github Release里。- 创建release的操作触发
Publish Pages,这个workflow会clone我的Pages库,下载最新的release里的静态文件包,解压到Pages库,commit & push。

具体的实现步骤如下:
- 创建
build.sh脚本。该脚本负责生成静态文件、打包、上传。这个脚本在本地电脑也可以运行。 - 创建
gh_action_build.sh脚本。该脚本在Github Action里运行。主要是调用build.sh,但是事先要安装一些必要的npm库。 - 在https://github.com/settings/tokens 获取一个Personal access token。因为我们的
build.sh里用到了Github CLI工具gh。这个命令需要用到这个token来授权。 - 把这个Personal access token,添加到
Hexo库的secrets里。
- 创建YAML文件定义
Build Pages,这边主要功能就是注入上边的那个token然后调用gh_action_build.sh。完整代码在这里。1
2
3
4
5- name: Generate pages
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }} # 注入token
run: ${GITHUB_WORKSPACE}/bin/gh_action_build.sh # 调用脚本 - 创建
publish脚本。该脚本下载最新的release中的静态文件包,解压到Pages库,commit & push。 - 用
ssh-keygen创建一对秘钥。因为我们在Hexo库的actions里操作Pages库,所以需要授权actions的git命令来修改Pages库。 - 把上边生成的公钥加到
Pages库的deploy key里,并赋予写权限。
- 把上边生成的私钥加到
Hexo库的secrets里。 - 创建YAML文件定义
Publish Pages。这个workflow里需要clone两个代码库,然后调用publish脚本。其中Pages库的ssh key需要用上边设置的私钥。完整代码在这里。1
2
3
4
5- uses: actions/checkout@v2
with:
repository: 'yuliji/yuliji.github.io'
path: 'pages'
ssh-key: ${{ secrets.PAGE_REPO_SSH_KEY }} # 用有写权限的key操作Pages库
完成
这样,我只需要把最新的文章提交到Hexo库的master分支,新文章就自动发布到Github Pages了。
