通过 Github Actions 自动发布 Hexo 博客
Post

通过 Github Actions 自动发布 Hexo 博客

Github 今年推出了自己的 CI 集成方案 Github Actions,本着玩一玩不吃亏的态度,我把原来通过 Travis CI 的自动发布流程迁移到了 Github Actions,整个过程还是非常愉快顺利的。

创建博客

这部我就不展开说了,直接到 Hexo 官网参考文档就可以快速开始。

我假设你已经有这么一个博客了,而且也成功手动发布过。

生成密钥

为了安全起见,我们为此次发布单独创建一对密钥,在本地命令行执行如下命令。

1
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-actions-deploy

一路回车,生成的公钥为 github-actions-deploy.pub,私钥为 github-actions-deploy

安排密钥

假设你的 Github 源文件仓库是 blog,静态页面仓库是 tobyqin.github.io。那么你需要将公钥配置到静态页面仓库的 Deploy keys,将私钥配置到源文件仓库的 Secret

  • blog > Secrets > Add a new secret > 添加密钥,命名为 ACTION_DEPLOY_KEY
  • tobyqin.github.io > Deploy keys > add deploy key > 添加公钥,名字随意,允许写入权限。

配置博客

这一步主要是确保你的博客能够发布到正确的仓库,参考如下配置。

1
2
3
4
5
6
# _config.yml
## Docs: https://hexo.io/docs/deployment.html
deploy:
  - type: git
    repo: git@github.com:tobyqin/tobyqin.github.io.git
    branch: master

配置 Github Actions

好戏开场,切到你的blog仓库,选择 Actions 选项卡,新建一个 Workflow

image-20191225230141168

你可以选用某个模板,比如 Node.js,或者完全自定义。针对我自己的博客,因为我在发布前还写了个 Python 的脚本做了一些额外的事情,所以我的 Workflow 大概是这样的。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
name: Deploy Blog

on: [push]

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Use Python 3.x
        uses: actions/setup-python@v1
        with:
          python-version: "3.7"

      - name: Use Node.js 10.x
        uses: actions/setup-node@v1
        with:
          node-version: "10.x"

      - name: Setup
        env:
          ACTION_DEPLOY_KEY: $
          TZ: Asia/Shanghai
        run: |
          # set up private key for deploy
          mkdir -p ~/.ssh/
          echo "$ACTION_DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan github.com >> ~/.ssh/known_hosts

          # set git information
          git config --global user.name 'Toby@Github' # 换成你自己的邮箱和名字
          git config --global user.email 'toby.qin@live.com'

          # prepare blog
          pip install -r requirements.txt
          python blog.py prepare

          # install dependencies
          npm install -g hexo-cli
          npm install

      - name: Deploy
        run: |
          # publish my blog
          hexo clean
          hexo generate
          hexo deploy

可以看到这个Workflow的脚本还是很好理解的,先是起了一个名字,然后选择了 ubuntu 最新版作为运行系统,接着安装了 Python 和 Node.js,然后执行了一段脚本做环境配置,这里面既有 Python 又有 Node.js,最后执行了发布命令。

异常处理

当然这个 Workflow 我也不是一次就执行成功的,如果你需要调试的话就可以到 Github Actions 这个选项卡去看执行日志,非常的详尽和易读。

image-20191225232123775

小结

Github 终于自己动手做 CI 了,让各大友商瑟瑟发抖。而且我体验下来非常棒,比 Travis CI 集成度更好,而且 Action Workflow 使用 Yaml 来定义也十分清晰友好。

相对 Jenkins 的 Pipeline 可能少了一些图形化的支持,但功能毫不逊色。而且一个仓库是允许定义多个 Workflow 的,每个 Workflow 可以有不同的目的和触发机制,在 Workflow 中官方也提供了类似插件一样的功能,十分灵活。

2019年,再见

谢谢,我们很忙