本文主要参考了 从私有代码库自动部署Hexo站到GitHub Pages, 且本站的自动部署也参考了该文章。

期间作者踩了些雷, 故写了此文章希望能给大家提高帮助。

为什么要自动部署?

  1. 当你的电脑出现神秘的故障导致不能使用时, 或是当你决定换一台新电脑时, 你本地的博客源码该如何保存呢?

    • 答: 可以存到github上!
  2. 当你每次写完文章, 不仅要部署到网站, 又要提交到仓库保存, 并对此感到很麻烦时该怎么办呢?

    • 答: 可以自动部署!

如何自动部署?

准备工作

需要有三个仓库, 下面记作:

  • 私有库(private) : 存放网站的源码

  • 主题库(private) : 存放被修改过的主题的源码(如果你在博客根目录下有_config.butterfly.yml文件并在里面配置博客时, 原始的主题源码也行)

  • 目标库(public) : GitHub Pages

需要在目标库创建一个Personal Access Token(PAT), 并将其配置在私有库的secret中, 再创建一个工作流的yaml即可。

在私有库中创建Action Workflow Yaml

先来看最终的yaml:

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
name: Hexo Build & Deploy - Private to Public

on:
push:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest

steps:
# Checkout 拉取源码及主题submodule的源码
- name: Checkout
uses: actions/checkout@v3.0.0
with:
token: ${{ secrets.MYPAT }}
submodules: 'true'
persist-credentials: false

# Setup Node Env 安装配置node环境
- name: Prepare Node env
uses: actions/setup-node@v3
with:
node-version: 22.13.0

# Setup and Run Hexo to build the Static Site 安装hexo-cli并且构建网站
- name: Hexo
run: |
pandoc --version
npm i -g hexo-cli
npm i
hexo clean && hexo g

# Deploy the Static Site to Public Repo (GitHub Pages) 将网站发布到目标库
- name: Deploy
uses: JamesIves/github-pages-deploy-action@v4.3.3
with:
ssh-key: ${{ secrets.HEXO_DEPLOY_KEY }}
repository-name: xxx/xxx.github.io
branch: main # The branch the action should deploy to.
folder: public # The folder the action should deploy.
single-commit: true
commit-message: "Deploy by source"

上面的流水线具体做了哪些工作可以去自行查资料。

在私有库创建.github/workflows/main.yaml并把上面的代码copy进去。

接下来要做的事:

  1. 配置主题submodule

  2. 创建Personal Access Token

  3. 给上面的yaml填空

    • token: ${{ secrets.MYPAT }} : 创建PAT MYPAT
    • ssh-key: ${{ secrets.HEXO_DEPLOY_KEY }} : 创建 DEPLOY_KEY 从私有库发布到目标库
    • repository-name: xxx/xxx.github.io : 目标库的地址,即GitHub Page库的地址

配置主题submodule

将你本地博客文件夹下的主题theme/butterfly fork到自己的github中, 创建另一个私有主题库 myBlogTheme 。同时用两个分支来解决主题的升级问题:master 分支与官方库保持一致,可以fast-forward, v8.5 分支存放修改之后的主题文件与配置。如需更新,则在 v8.5 分支 mergerebase master 。(这里依然同前面, 如果你在博客根目录下有_config.butterfly.yml文件并在里面配置博客时, 原始的主题源码也行)。

增加submodule的命令如下,它的意思是创建一个submodule并且track它的master分支。这个被track的分支可以按需修改。

1
git submodule add -b master <git@github.com:MYSUBMODULE.git> <path/to/MYSUBMODULE>

我们可以在私有库创建主题库了:

1
2
git remote add myBlogTheme git@github.com:xxx/myBlogTheme
git submodule add -b v8.5 https://github.com/xxx/myBlogTheme themes/butterfly/

如果遇到这个错误:

1
'themes/butterfly' already exists in the index

git submodule add 命令中加入 --force 选项即可。

创建Personal Access Token

创建PAT的主要目的是给私有库访问目标库的权限,可以让私有库的actions推送构建好的代码到目标库中去。

参照 这里 来生成PAT。

记得要勾选下面两个scope: workflowwrite:packages

PAT生成好之后,复制下来,妥善保管留待后用。

在私有库中设置Secret

在私有库中:

Settings -> Secrets -> Actions -> New repository secret

粘贴刚才生成的PAT到value框中,并命名这个secret为 MYPAT

创建Deploy Key

这里的Deploy Key用来将生成好的HTML文件从私有库上传到目标库中。而之前的PAT是用于拉取私有库和submodule的代码。

参考 这篇这篇文章 创建 deploy key。

参考 这篇 将生成的deploy key添加到私有库。

最后

记得回到yaml文件中填上原来的空。

总结

完成上述步骤后即可实现从私有代码库自动部署Hexo站到GitHub Pages。

以后写完博客后不需要在hexo三部曲部署后再提交到仓库了,而是直接提交到仓库便可自动部署。