EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

使用 Github Actions 完成 Hexo + Github Pages 博客自动部署

摘要

本文介绍了使用 Github Actions 对 Hexo + Github Pages 博客进行自动部署的方案。考虑到几个月以来 Github 对 HTTPS 协议的限制,本文也列举了笔者的一些失败的实验经历,以供避雷。

关键词:Github Actions,Hexo,Github Pages

为什么要自动部署?

将部署任务从 PC 端转移到云端(例如 Github)的好处包括:

  1. 多终端写博客时只需要维护博客 markdown 文件本身,而不需要维护生成的 public 目录;
  2. 在性能欠佳的终端(例如古早的 windows 笔记本)可以只负责维护博客内容,并将其 push 到 Github 仓库,不需要每次更新都花费长达二十分钟的时间来生成并上传全部的文件。

搭建 Hexo + Github Pages 博客

这一部分的内容在网络上有许多介绍,本文不再赘述。

获取 Personal access tokens

这一部分的内容在网络上有许多介绍,本文不再赘述。记得保存生成的 tokens,因为该 tokens 只会出现一次。

获取 tokens 之后可以看到如下界面:

修改博客配置

修改博客根目录下的 _config.yml 文件中这部分内容:

1
2
3
4
5
6
7
8
9
10
deploy:
type: git
repo:
github:
url: https://github.com/EagleBear2002/EagleBear2002.github.io.git
branch: main
token: $DEPLOY_BLOG # 使用环境变量 DEPLOY_BLOG
message: "hexo deploy"
batchSize: 10 # 每批上传的文章数量
concurrency: 10 # 并发上传的数量

添加 Github Actions

这一部分的内容在网络上有许多介绍,本文不再赘述。

设计 Actions 脚本

.github/workflows/deploy.yml 是 Actions 的脚本,脚本内容如下:

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
name: Deploy

on:
push:
branches:
- main # 或您使用的默认分支名称

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: test token
env:
DEPLOY_BLOG: ${{secrets.DEPLOY_BLOG}}
run: echo $DEPLOY_BLOG

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

- name: Set Git identity
run: |
git config --global user.email "eaglebear2002@foxmail.com"
git config --global user.name "EagleBear2002"

- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: 14

- name: Install Pandoc
run: sudo apt-get install -y pandoc

- name: Install dependencies
run: npm install

- name: Modify index.js
run: sed -i '24s/.*/ var endPos = link.length - 1;/' node_modules/hexo-asset-image/index.js

- name: Build and deploy
env:
DEPLOY_BLOG: ${{secrets.DEPLOY_BLOG}}
run: |
npm run build
npm run deploy

检查 Actions 执行结果

如果 Actions 运行成功,则会看到如下界面:

如果 Actions 运行失败,先检查 test token 步骤的输出结果,如果看到输出结果为 ***,可以认为 Actions 运行时成功从 secrets.DEPLOY_BLOG 获得了 token;如果输出为空,请检查这一步骤。