今天是2021年12月31日。

时光飞逝,自19年使用Hexo搭建博客后,已过去两年半,并未好好写过文章。今日再次拾起Hexo博客来折腾一番以备使用。

由此也记录一下此次折腾过程中的一个小难点。
先说需求,我将Hexo项目存储于GitHub的A仓库,博客项目部署于B仓库的gh-pages分支,我想要在A仓库通过配置GitHub Actions来实现代码push到A仓库后自动化发布到B仓库的gh-pages分支。
难点是什么呢,其实也不难。就是在GitHub Actions的CI/CD过程中进行hexo deploy前需要先进行GitHub的鉴权工作。那么怎么样实现CI/CD过程中鉴权呢?

首先我们来拆解问题,一是获取权限,二是为执行CI/CD任务的Runner机器赋予权限。获取权限的方式我们知道有两种,一是每次push时输入GitHub的账号密码,二是通过SSH密钥验证的方式,第一个问题很简单不多说。第二个问题因为CI/CD本质上就是通过配置好一些命令,让其在CI/CD Runner机器上执行。因此我们只能通过CI/CD配置命令的方式赋予CI/CD Runner机器权限。所以如果我们通过SSH密钥验证的方式应该怎么做呢?

第一步,肯定需要SSH密钥生成,我们先不管它如何使用。这一步在任何机器上生成都可以,我们只是需要生成一对公钥和私钥。

1
ssh-keygen -t rsa -C "any comment can be here"

此处需要注意的是,尽量事先创建一个路径存储密钥,方便后续使用查找。

第二步,我们需要做的事和我们配置自己的机器SSH密钥时一样,让CI/CD Runner机器拥有私钥,将公钥配置到我们的GitHub账号中。
公钥配置到GitHub账号中自不必说,这里疑惑的是,我们的私钥怎么给到CI/CD Runner机器呢?答案就是复制粘贴。
哈哈~,没错。不过GitHub Actions提供了Secrets来为我们存储敏感信息。之后我们就可以在GitHub Actions的yml配置文件中使用而不必担心私钥泄漏了。

1
2
3
4
5
6
7
8
9
10
11
12
- name: Setup Deploy Private Key
# 配置私钥变量
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
# 在CI/CD Runner机器上创建密钥存储目录
run: mkdir -p ~/.ssh/
# 复制私钥到CI/CD Runner机器中
run: echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
# 设置 ~/.ssh/id_rsa 可读写
run: chmod 600 ~/.ssh/id_rsa
# 公钥复制到CI/CD Runner机器的known_hosts中,此处是为了避免known_hosts不存在公钥的指纹信息,导致需要验证,从而鉴权失败
run: ssh-keyscan github.com >> ~/.ssh/known_hosts

如此配置之后,我们的CI/CD Runner机器就可以获得对我们的GitHub仓库push的权限了。

反思。其实本次所遇问题并不难,以下参考文献作者的思路更加清晰一些。初次使用GitHub Actions,以及对于GitHub Actions中所用的SSH协议工作机制、Shell脚本命令等基础知识的不熟悉才是我们花了蛮力却办了小事的原因。它仅仅是一个CI/CD Runner机器获取git权限的问题。与在哪里存储代码,在哪里发布项目无关(这是我当时比较迷糊的地方)。

好了,写完了。新年快乐~

本文参考文献
Github Actions 通过 SSH 自动部署 Hexo