使用Github Actions来部署hexo博客
多年前第一次写博客的时候,选择了hexo这个静态博客框架,这么久用下来,平心而论我对hexo并没有什么不满,我只需要一个地方记录自己写的文字,诸如评论、后台之类的东西对我来说都是略多余的。有了这些也不错,但是没有也完全没问题。有评论更方便交流,没有也没啥影响,我的文章也没啥人读。当然hexo本身是可以挂上一个外部的评论服务的,但是我懒,也没需求,就没搞。不像评论,后台实时写文章实时发表这样的功能是不可能实现的,当然这也不是必需的,有这个后台,你可能管理博客更方便,但是没有其实也没啥问题。总之我对hexo本身倒是没啥不满,只不过对npm有点不满,总的来说,我不是很喜欢npm的设计,之前在windows上使用hexo的时候,总会留下一个因为超过路径长度限制而无法删除的node_modules文件夹,网上也经常看到把node_modules和黑洞对比的meme
总之用久了hexo之后,很希望有一个工具能自动帮我生成网页文件,再发布到Github Pages上去。一来省去我自己手动操作,二来我电脑也不需要承担node_modules这种“负担”。这个解决方案其实几年前就有了,那就是CI工具,其中就有Github Actions,Github Actions是Github官方提供的CI工具,这个工具可以响应你的Github仓库的各种事件,来对应的执行一些自动操作。比如当你推送提交到Github上或者别人开pr时,进行自动的编译和测试。
Hexo的博客也可以通过Github Actions来进行自动生成和发布。如我所言,Github Actions早就有了,但是我到现在才搞,一来是因为我懒,不想学,二来是我的需求有一点特殊。
虽然早有人写了满足这个条件的action,但我还是拖到了现在才开始做这件事,这里就权且记录一下。
为了做到这件事情,一般推荐建立两个仓库,一个是Github Page,用于发布公开的网页,一个是私有的文章源文件,包括hexo的项目、配置、主题等等。我个人设置私有的原因主要还是不公开一些草稿,因为我个人经常会把一些之前质量较低的文章移到草稿文件夹来隐藏掉。
执行action的bot在源仓库做自动生成和部署,将网页文件推送至公开仓库,同时将必要的修改提交到源仓库,因此同时需要这两个仓库的读写权限。源仓库的写入权限实际上可以通过GITHUB_TOKEN来解决,这是因为每次运行action的时候,GIthub都会生成一个临时的访问token,这个token就有action运行仓库的写入权限。而公开仓库的写入权限则可以通过多种方式实现,以下仅以我使用的action为例,介绍SSH方式。
我使用的action仓库是 github-actions-hexo ,选择的原因前面说了是这个action可以在生成部署之后更新源仓库。这个action是通过hexo-deployer-git插件来部署的,需要bot运行git命令时有公开仓库的写入权限。其中需要用到一个部署的公钥,你需要将公钥的内容存入公开仓库的部署公钥(仓库Settings/Deploy keys)内且赋予写权限,这样对应的私钥方就可以通过git修改公开仓库了。你可以将对应的私钥保存到源仓库的SECRET里,这样在action bot在源仓库运行时,它就可以通过这个私钥来修改公开仓库。同时SECRET里的条目不会被任何人看到,存入后即使是你自己也看不到,不会有安全问题。这里建议生成一个新的密钥对,专门用于部署。
ssh-keygen -f <filename>可以在action仓库里看到entrypoint.sh文件内有如下内容
# setup key
mkdir -p /root/.ssh/
echo "${INPUT_DEPLOYKEY}" >/root/.ssh/id_rsa
chmod 600 /root/.ssh/id_rsa
ssh-keyscan -t rsa github.com >>/root/.ssh/known_hosts
git config --global user.name "${INPUT_USERNAME}"
git config --global user.email "${INPUT_EMAIL}"这就是配置git,确保后续能用hexo-deployer-git插件进行部署,其中的INPUT_DEPLOYKEY变量就是你配置好的私钥内容。由于这个action的提交信息无法修改且里面包含一个typo,所以我fork了这个action并做了修改。
配置好公钥和私钥之后,只需要在源仓库内添加一个yml格式的workflow就能实现自动生成和部署了。
name: Build and Deploy Hexo Posts
on:
push:
branches: [ 'main' ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Cache node modules
uses: actions/cache@v1
with:
path: node_modules
key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}
- uses: serephus/github-actions-hexo@dev
with:
deploykey: ${{secrets.HEXO_DEPLOY_PRIVATE_KEY}}
username: <yourusername>
email: <youremail>
if_update_files: true
github_token: ${{secrets.GITHUB_TOKEN}}
branch: main记得把尖括号替换成你对应的内容, secrets.HEXO_DEPLOY_PRIVATE_KEY 就是我配置的私钥变量,Github Action通过 ${{ variable }} 的方式展开变量。
这里是我的配置,如果你的theme是一个submodule, 那么checkout的action里要配置下载子模块。
做好这些之后,就无需手动更新公开仓库了,可以更加专注于文章写作本身。
在处理好这些以后,我也是久违的更新了一下博客的主题,一来是next主题已经用过很久了,有点审美疲劳,二来现在越来越喜欢暗色、简洁的主题。
于是稍微找了一下,选了一个挺喜欢、又很简洁的主题,为了让一些细枝末节也符合我的想法,我又fork了这个主题,做了一些破坏性的修改(捂脸
总体来说算是比较满意了,但是还有一个代码高亮不够好的问题,如下所示,但是目前勉强能看,也懒得费力解决了。
总之这下有了比较好的写博客的环境,又少了一个摸鱼不写的理由(逃