利用 Github Actions 自动部署 Hexo 博客

1、介绍

Github Actions 可以很方便实现 CI/CD 工作流,类似 Travis 的用法,来帮我们完成一些工作,比如实现自动化测试、打包、部署等操作。

当我们运行 Jobs 时,它会创建一个容器 (runner),容器支持:Ubuntu、Windows 和 MacOS 等系统,在容器中我们可以安装软件,利用安装的软件帮我们处理一些数据,然后把处理好的数据推送到某个地方。

本文介绍利用 Github Actions 实现自动部署 hexo 到 Github Pages,在之前我们需要写完文章执行 hexo generate --deploy 来部署,当你文章比较多的时候,可能还需要等待很久,而且还可能会遇到本地安装的 Node.js 版本与 Hexo 不兼容的问题,利用 Github Actions 你将会没有这些烦恼。

2、步骤

2.1、创建所需仓库

  1. 创建 blog 仓库用来存放 Hexo 项目
  2. 创建 your.github.io 仓库用来存放静态博客页面

2.2、生成部署密钥

执行下列命令,然后一路按回车直到生成成功

1
$ ssh-keygen -f github-deploy-key

当前目录下会有 github-deploy-keygithub-deploy-key.pub 两个文件。

2.3、配置部署密钥

  • 复制 github-deploy-key 文件内容,在 blog 仓库 Settings -> Secrets and variable -> actions -> New repository secret 页面上添加。

    1. Name 输入框填写 HEXO_DEPLOY_PRI
    2. Value 输入框填写 github-deploy-key 文件内容。
  • 复制 github-deploy-key.pub 文件内容,在 your.github.io 仓库 Settings -> Deploy keys -> Add deploy key 页面上添加。

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

3、编写 Github Actions

3.1、Workflow 模版

blog 仓库根目录下创建 .github/workflows/deploy.yml 文件,目录结构如下。

1
2
3
4
blog (repository)
└── .github
└── workflows
└── deploy.yml

deploy.yml 文件中粘贴以下内容。

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
name: CI

on:
push:
branches:
- master

env:
GIT_USER: Sanonz
GIT_EMAIL: sanonz@126.com
THEME_REPO: sanonz/hexo-theme-concise
THEME_BRANCH: master
DEPLOY_REPO: sanonz/sanonz.github.io
DEPLOY_BRANCH: master

jobs:
build:
name: Build on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest]
node_version: [12.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/concise

- name: Checkout deploy repo
uses: actions/checkout@v2
with:
repository: ${{ env.DEPLOY_REPO }}
ref: ${{ env.DEPLOY_BRANCH }}
path: .deploy_git

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

- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
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
cp _config.theme.yml themes/concise/_config.yml

- name: Install dependencies
run: |
npm install

- name: Deploy hexo
run: |
npm run deploy

3.2、模版参数说明

  • name: 为此 Action 的名字
  • on: 触发条件,当满足条件时会触发此任务,这里的 on.push.branches.$.master 是指当 master 分支收到 push 后执行任务。
  • env: 为环境变量对象
    • env.GIT_USER: 为 Hexo 编译后使用此 git 用户部署到仓库。
    • env.GIT_EMAIL: 为 Hexo 编译后使用此 git 邮箱部署到仓库。
    • env.THEME_REPO: 为您的 Hexo 所使用的主题的仓库,这里为 sanonz/hexo-theme-concise
    • env.THEME_BRANCH_: 为您的 Hexo 所使用的主题仓库的版本,可以是:branch、tag 或者 SHA。
    • env.DEPLOY_REPO: 为 Hexo 编译后要部署的仓库,例如:sanonz/sanonz.github.io
    • env.DEPLOY_BRANCH: 为 Hexo 编译后要部署到的分支,例如:master。
  • jobs: 为此 Action 下的任务列表
    • jobs.{job}.name: 任务名称
    • jobs.{job}.runs-on: 任务所需容器,可选值:ubuntu-latestwindows-latestmacos-latest
    • jobs.{job}.strategy: 策略下可以写 array 格式,此 job 会遍历此数组执行。
    • jobs.{job}.steps: 一个步骤数组,可以把所要干的事分步骤放到这里。
      • jobs.{job}.steps.$.name: 步骤名,编译时会会以 LOG 形式输出。
      • jobs.{job}.steps.$.uses: 所要调用的 Action,可以到 https://github.com/actions 查看更多。
      • jobs.{job}.steps.$.with: 一个对象,调用 Action 传的参数,具体可以查看所使用 Action 的说明。

3.3、第三方 Actions

使用第三方 Actions 语法 {owner}/{repo}@{ref} 或者 {owner}/{repo}/{path}@{ref} 例如:

  • 调用 actions/checkout@v2 Checkout 一个 git 仓库到容器。with.repo 不填写默认为当前仓库。

    1
    2
    3
    4
    5
    6
    7
    8
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
    uses: actions/checkout@v2
    # with:
    # repository: ${{ github.repository }}
  • Checkout 第三方仓库 git@github.com:sanonz/hexo-theme-concise.gitmaster 分支到容器 themes/concise 目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - with:
    repository: sanonz/hexo-theme-concise
    ref: master
    path: themes/concise
  • 调用 actions/setup-node@v1 可以配置容器 Node.js 环境。with.node-version 可以指定 Node.js 版本。

    1
    2
    3
    4
    5
    6
    7
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-node@v1
    - with:
    node-version: v12
  • 执行 npm run deploy 进行部署。

    1
    2
    3
    4
    5
    6
    7
    jobs:
    build:
    runs-on: ubuntu-latest
    steps:
    - name: Deploy hexo
    run: |
    npm run deploy

可以在这里查找更多 Actions 以及使用方式 官方 Actions 市场

4、自己试试

写一篇文章,pushblog 仓库的 master 分支,在此仓库 Actions 页面查看当前 task。当任务完成后查看您的博客 https://your.github.io,如果不出意外的话已经可以看到新添加的文章了。

5、报错

Host key verification failed. fatal: Could not read from remote repository.

报错如下:

1
2
3
4
5
6
7
8
9
10
11
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html
Error: Spawn failed
at ChildProcess.<anonymous> (/home/runner/work/hexo-theme-lp/hexo-theme-lp/node_modules/hexo-util/lib/spawn.js:51:21)
at ChildProcess.emit (node:events:517:28)
at ChildProcess._handle.onexit (node:internal/child_process:292:12)
Error: Process completed with exit code 2.

解决:

  1. 出现此问题请检查 站点配置文件,看 deploy 是否存在出 GitHub 以外的仓库,如 gitee。
    • 解决方式:去除 GitHub 以外的仓库。

利用 Github Actions 自动部署 Hexo 博客
https://flepeng.github.io/092-建站-03-hexo-利用-Github-Actions-自动部署-Hexo-博客/
作者
Lepeng
发布于
2023年4月1日
许可协议