Post

通过 Github Actions 自动发布 Hexo 博客

通过 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 中官方也提供了类似插件一样的功能,十分灵活。

This post is licensed under CC BY 4.0 by the author.