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选项卡就马上可以看到,自动部署已经开始触发。