进一步缩减成本——更换博客 CD 为 Github Actions

先前使用自建 Gitea + Drone 作为本博客的,好久不更新博客,突然想到了 Github 私有仓库 + Github Actions,我直接可以省掉 Gitea + Drone 的服务器运行成本。那么说干就干。

了解 Github Actions

在此之前,我居然没有用过 Github Actions,属实 Out 了。于是第一步是先了解一下 Github Actions。

毕竟也用过一些 CI/CD,用起来还算轻车熟路。Github Actions 与 Drone 类似,通过 yaml 文件定义响应的事件与执行的动作。

Github Actions 会扫描 .github/workflows 目录中的 yaml 文件,并根据定义的 workflow 进行工作。

在 Github Actions 执行过程中,会初始化一套运行环境,通过 runs-on 定义运行的系统,然后再执行具体的 steps

1
2
3
4
5
6
7
8
9
10
name: Publish Blog Actions
on: push
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: "16"

上述的配置中,使用了最新的 Ubuntu 环境来运行我们的 workflow,并且做了如下两件事:

  • 使用 actions/checkout@v2 来拉取代码
  • 使用 actions/setup-node@v2 初始化 Node 环境。

由此我们可以看到 Github 打造 Actions 生态的方案——Marketplace

image-20211111210140476

在市场中我们可以找我们所需要的 Action,这些 Action 本质上与我们写的 workflow 并无不同,Github Actions 本质上是提供了一个环境,并且可以自由执行 Shell,可以执行 Shell 自然也就可以通过命令行配置各种环境,进行各种任务。这种模式比 Drone 使用 SDK 编写插件更为灵活。甚至很多 Marketplace 中的 Actions 的实现只是一个 action.yml 文件。

action.yml 中定义了参数,以及执行方式的 shell 命令,除了直接使用 Shell 命令配置环境等,也可以执行其他语言的脚本来工作。

到这里我们也明晰了该如何实现一个发布博客的 Github Actions 了。

重构博客发布 CD

首先梳理一下正常发布博客的流程:

  1. 已经配置好的 Node 环境与 Hexo 依赖;
  2. npm run build 生成博客;
  3. 把生成的 public 目录上传到 oss 中。

那么在 Github Actions 中也是做如此的操作即可,只是在最开始需要先配置下环境,并且安装 Hexo 依赖。具体的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
name: Publish Blog Actions
on: push
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: "16"
- name: Install dependencies
run: npm i
- name: Build the blog
run: npm run build
- name: Prepare ossutil
run: |
wget -q http://gosspublic.alicdn.com/ossutil/1.6.10/ossutil64 -O ossutil
chmod +x ossutil
- name: Sync assets
env:
OSS_ENDPOINT: ${{ secrets.OSS_ENDPOINT }}
OSS_ACCESS_KEY_ID: ${{ secrets.OSS_ACCESS_KEY_ID }}
OSS_ACCESS_KEY_SECRET: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
OSS_BUCKET: ${{ secrets.OSS_BUCKET }}
run: |
./ossutil config -e $OSS_ENDPOINT -i $OSS_ACCESS_KEY_ID -k $OSS_ACCESS_KEY_SECRET
./ossutil cp -rf ./public oss://$OSS_BUCKET/

首先拉取代码,并配置 Nodejs 运行环境,然后在当前目录中安装依赖。由于 Github Actions 是运行在 Github 的服务器上,自然也就不需要想尽办法加速 NPM 的安装速度了,实际体验也是嗖的一下。

接下来就是本章节起初提到的构建博客、上传到 oss 的步骤。上次到 oss 使用了阿里云官方的 ossutil cli 工具,并且通过 Github Actions Secrets 设置了需要的参数。

image-20211111211556294

设置到环境变量后,在命令中直接使用就可以了。

至此基本的流程就完成了。运行一遍,完美!

image-20211111212940976

但是这个配置比以前少了点东西,那就是消息通知。

上一个版本在 CD 结束后,会通过钉钉机器人推送消息给我。这里本来也想这么干,但是想了下比较麻烦,而且依赖某个特定的平台,如果我把钉钉卸载了的话也就收不到了(实际已经卸载了)。类似的可选平台还有很多,例如企业微信、Slack、Telegram 等等。

最终我直接使用了 Github 自带的邮件通知,因为我的 Gmail 会转发到 QQ 邮箱,因此微信也能收到邮件通知。

Github 会默认禁用成功 Github Actions 的通知,在个人的 Profile -> Notification 配置中关掉即可:

image-20211111212500060

现在无论成功与否都能收到 Github Actions 的通知了。

image-20211111212651889

小结

Github Actions 的扩展性和自由度无与伦比,可以充分发挥想象力。无论是用作 CI 还是 CD,都是免费且好用的好选择。