介绍

使用Hexo框架写博客时,每次都要经历清除、生成、部署,使用Github Actions可以实现自动化工作流。

假设用一个 blog 仓库存储markdown等文件,使用 Github Actions后,每次push时即可自动生成部署到 .github.io 仓库中去。如果有gitee或其他域名要同步部署博客,Github Actions提供 的便利会更明显。

确定目标

  1. 用一个仓库存储markdown等原始文件。
  2. 原始文件仓库push操作后自动部署到GitHub Pages仓库
  3. (可选)原始文件仓库push操作后自动部署到Gitee Pages仓库
  4. (可选)原始文件仓库push操作后自动部署到所购买域名的对应文件系统

目前只使用GitHub Pages部署博客,故本文只介绍这部分对应流程。

准备

创建所需仓库

  1. 创建 blog 仓库存放Hexo项目,仓库可以私密。
  2. 创建 yourname.github.io 仓库存放静态博客页面,仓库需要公开。

为仓库配置密钥

生成密钥

1
ssh-keygen -f github-deploy-key

当前目录下会有 github-deploy-keygithub-deploy-key.pub 即私钥和公钥两个文件。

配置私钥

复制 github-deploy-key 文件内容,在Hexo项目仓库,此处即 blog 仓库 Settings -> Secrets -> Secrets -> Actions 页面上点击 New repository secret 添加。

  1. Name 输入框填写 HEXO_DEPLOY_PRI
  2. Value 输入框填写 github-deploy-key 文件内容。

配置公钥

复制 github-deploy-key.pub 文件内容,在静态博客页面仓库,此处即 yourname.github.io 仓库 Settings -> Deploy keys 页面上点击 Add deploy key添加密钥。

  1. Title 输入框填写 HEXO_DEPLOY_PUB
  2. Key 输入框填写 github-deploy-key.pub 文件内容。
  3. 勾选 Allow write access 选项。

编写Github Actions

blog 仓库创建文件 .github/workflows/hexoCI.yml

  1. Github项目会自动识别 .github/workflows/ 文件夹下的 yml 类型文件
  2. 若在本地仓库创建该 yml 文件,需要手动 git add 将其加入版本流中

文件内容如下,记得修改env中参数

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
52
53
name: HEXO CI

on:
push:
branches:
- master

env:
GIT_USER: yourname
GIT_EMAIL: example@example.com
THEME_REPO: jerryc127/hexo-theme-butterfly
THEME_BRANCH: master

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]

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

- name: Checkout theme repo
uses: actions/checkout@v2
with:
repository: ${{ env.THEME_REPO }}
ref: ${{ env.THEME_BRANCH }}
path: themes/butterfly

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}

- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
- name: Install dependencies
run: |
npm i -g hexo-cli
npm i
- name: Deploy hexo
run: |
hexo clean && hexo generate && hexo deploy

关键参数说明

  • env为环境变量对象

    • GIT_USER 和 GIT_EMAIL 是博客仓库对应的Github账户的用户名和登录邮箱
    • THEME_REPO 和 THEME_BRANCH 是 Hexo 所使用的主题的仓库及其分支,本人此处使用了 butterfly 主题。
  • 其他版本参数

    • Github Actions具体过程会在一个容器中实现,ubuntu-latest指定了容器使用最新版ubuntu。此处也可使用其他版本或其他系统,如Windows、Mac等。
    • Node.js使用目前最新稳定版 16.x,部分后续操作(如checkout)可能有具体要求。
    • 关于actions/checkout@v2 和 actions/setup-node@v2,目前最新版为 v3,此处选择稳定的v2版本。

Actions流程说明

name指定此Action的名字,会在GitHub仓库的Actions页面看到。

1
2
3
4
on:
push:
branches:
- master

on部分指定触发条件,此处push操作触发后续action,branches指定具体分支。当master分支收到push时执行任务。

env配置后续参数供后面使用。

1
2
3
4
5
6
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [16.x]

触发条件达成后自动执行 jobs 后的多个任务,此处只配置了build一个任务。runs-on指定容器版本,node-version指定Node.js版本。

steps后面编写具体的多个步骤。

1
2
3
4
5
6
7
8
9
- name: Checkout
uses: actions/checkout@v2

- name: Checkout theme repo
uses: actions/checkout@v2
with:
repository: ${{ env.THEME_REPO }}
ref: ${{ env.THEME_BRANCH }}
path: themes/butterfly

name 指定步骤名,uses指定步骤调用的Action,详情参见官方Action市场

此处先checkout当前hexo仓库到本地,再checkout主题仓库到对应目录。

主题仓库由于存在git版本控制文件,push整个hexo仓库时默认跳过这部分,所以需要单独checkout到action容器中。也可以考虑简单粗暴的删除主题对应的git版本控制文件夹 .git ,这样就只需一次checkout即可。

此外,若和我一样留下主题的.git 文件夹,对主题的魔改文件要放置于主题文件夹之外。

1
2
3
4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}

actions/setup-node 配置容器 Node.js 环境

1
2
3
4
5
6
7
8
9
10
- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL

配置环境,使用git的标准开局。

后续操作包括安装依赖,清除、生成、部署 Hexo 博客。大家应该很熟悉,不再赘述。

参考资料

利用 Github Actions 自动部署 Hexo 博客

hexo配合github action 自动构建(多种形式)

与本人最终action配置文件对比,参考资料有多余或者缺少的部分,可能是项目具体配置有不同之处,如主题文件是否保留git版本控制文件。