Hexo在GitHub Actions上的自动部署
Hexo博客是一个快速、简洁且高效的静态博客框架,每次修改和创作完成后需要部署。它的部署基于Node.js环境,我们可以把这个过程放在GitHub Actions上,配合GitHub自带强大的在线文本编辑和预览功能,可以实现网页上写文章、提交文章、自动部署后在博客上生效的工作流。
现状
我的Hexo博客目前有两个相关的GitHub仓库:一个是Public
公开的仓库,设置了GitHub-Pages,就是博客内容展示的实际仓库。
另外还有一个Private
私有仓库,里面放的是博客的源码,平常写作就是在这个仓库里面。之前每次操作完要部署到线上博客页面时,需要在本地进行这样的操作:
1 | npm i |
把整个博客部署到公开的仓库后才会生效。部署的配置在_config.yml
文件中,展示如下:
1 | deploy: |
部署完还需要把博客源码提交到私有仓库中,保存和同步代码。
下文中的
私有仓库
指的是博客源码仓库,公开仓库
指的是博客实际展示的仓库
目标
希望实现这样一个效果,只要我私有仓库的main
主分支有变动(往往是进行了文章创作,或者配置改动),就会自动触发部署,然后线上博客页面就发生变化。
触发私有博客仓库的变化方式有很多种,比如和之前一样从本地提交代码;由于GitHub网页版有强大的(支持Markdown)文本编辑器,甚至可以在线编辑修改文章和配置文件,这样我们的博客就成为了一个类似可在线编辑的博客平台了。
方法
以下操作均在Mac OS下进行,只有小部分命令行操作与操作系统相关,大部分无关可直接使用
工作流中核心的部署操作使用了第三方开源的脚本,作者是使用
npm
而不是yarn
,所以你的Hexo
最好使用npm
和package-lock.json
来进行包管理
生成和配置SSH Key
由于Hexo deploy
命令本质是给仓库提代码,所以在我们这就是私有仓库向公开仓库提代码,这个过程需要私有仓库持有公开仓库的私钥。我们先用命令行生成一对公钥和私钥:
1 | ssh-keygen -t rsa -C "your@email.com" |
这里的your@email.com替换为你GitHub的邮箱
默认情况下会在~/.ssh
文件夹下生成一对公钥和私钥文件,名称分别为id_rsa.pub
和id_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 | name: Deploy |
其中我就改动了一个部分
on
的这部分表示触发的条件。我改为只关注main
分支的push
事件
1 | on: |
其他部分如果你也是用npm
做包管理,不再需要任何改动即可正常运行。之前我用yarn
然后对脚本进行了一些修改,还是发现会有问题,建议直接用npm
就好了
最后提交这个文件到main
分支后,进入Actions
选项卡就马上可以看到,自动部署已经开始触发。