事出有因

每次更新博客都要hexo cl;hexo g;hexo d,对我这种懒人实在不友好。于是我决定让git-action自动帮我部署。

建立博客源码仓库

在github上新建储存博客源码的仓库,或者直接使用github-pages仓库的分支,我这里选择新建仓库。注意不要把所有文件都传到github,博客根目录新建.gitignore文件,写入如下内容:

1
2
3
public/
node_modules/
.deploy_git/

先不要着急将文件推送到仓库

建立主题仓库

主题文件是hexo构建时必不可少的,比如我用的butterfly主题。
这时候可以简单点儿直接删除butterfly文件夹下的.git文件夹,以下部分都不用做。

博客源码与主题用一个仓库管理可能不利于主题升级
,所以我选择将butterfly主题仓库作为git子仓库管理。

fork butterfly主题仓库

新建一个butterfly仓库,将经过魔改的butterfly仓库推送到其中。

构建butterfly子模块

删除本地butterfly文件夹,输入以下命令:

1
git submodule add <repo-url> themes/butterfly

该命令会将指定的 Git 仓库作为子模块添加到当前仓库中。

repo-url 是你的butterfly仓库地址。

之后在vscode git管理界面是这样的:

这样就成功将butterfly仓库作为博客源码仓库的一个子模块。

配置部署密钥对

在git-action分配的资源上是无权改动我们的github_pages仓库的,所以要
为这个仓库设置部署用密钥

首先在本地生成一个公私钥对

1
ssh-keygen -t rsa

在github_pages仓库的settings界面,找到deploy keys,
新增生成的公钥。这步大家应该很熟练了,记得勾选下面的Allow write access

回到源码仓库,在设置中找到 Secrets and variables -> actions,
新建一个 repository secret,名称是 PAGE_DEPLOY_KEY,底下的Secret填你生成的刚生成的私钥。注意私钥整个文件的内容都要填进去

(可选)配置访问私有butterfly仓库的密钥

如果你的butterfly仓库设置的是公有,直接跳过这步。

如果你像我一样将它设为了私有,那么像上一步一样,为butterfly仓库也
设置一个deploy公钥,并在博客源码仓库添加相应的私钥

为git-action设计工作流

在本地博客根目录下新建.github/workflows文件夹,
里面新建文件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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
name: mica's Blog CI/CD

on:
push:
branches: [main, dev]
paths:
- '_config.butterfly.yml'
- '_config.yml'
- '**/source/**'
- '*.json'
workflow_dispatch:

jobs:
blog:
timeout-minutes: 3
runs-on: ubuntu-latest

env:
NODE_VERSION: '20'
BUTTERFLY_PRIVATE_KEY: ${{ secrets.BUTTERFLY_DEPLOY_KEY }}
PAGE_PRIVATE_KEY: ${{ secrets.PAGE_DEPLOY_KEY }}

steps:
# 1. 设置SSH密钥,用于访问私有子模块和部署到 GitHub Pages
- name: Setup SSH keys for private submodules and GitHub Pages deployment
run: |
# 创建 SSH 目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 写入子模块访问的 SSH 私钥
if [ -n "$BUTTERFLY_PRIVATE_KEY" ]; then
echo "$BUTTERFLY_PRIVATE_KEY" > ~/.ssh/butterfly_deploy_key
chmod 600 ~/.ssh/butterfly_deploy_key
echo "已配置 butterfly_deploy_key"
else
echo "警告: BUTTERFLY_PRIVATE_KEY 未设置"
fi

# 写入 GitHub Pages 部署的 SSH 私钥
if [ -n "$PAGE_PRIVATE_KEY" ]; then
echo "$PAGE_PRIVATE_KEY" > ~/.ssh/page_deploy_key
chmod 600 ~/.ssh/page_deploy_key
echo "已配置 page_deploy_key"
else
echo "警告: PAGE_PRIVATE_KEY 未设置"
fi

# 配置 SSH config 以处理不同的密钥
cat >> ~/.ssh/config <<'EOF'
# 默认使用 butterfly_deploy_key
Host github.com
HostName github.com
IdentityFile ~/.ssh/butterfly_deploy_key
User git
StrictHostKeyChecking no
LogLevel ERROR
IdentitiesOnly yes

# 为特定仓库使用 page_deploy_key
Host github-pages-deploy
HostName github.com
IdentityFile ~/.ssh/page_deploy_key
User git
StrictHostKeyChecking no
LogLevel ERROR
IdentitiesOnly yes
EOF

chmod 600 ~/.ssh/config

# 验证 GitHub SSH 主机密钥
ssh-keyscan -H github.com >> ~/.ssh/known_hosts



# 测试 SSH 连接
if [ -n "$BUTTERFLY_PRIVATE_KEY" ]; then
echo -e "\n测试 SSH 连接到 GitHub.com:"
ssh -T git@github.com || true
fi

echo "SSH 设置完成"

# 2. 检出代码(不自动拉取子模块)
- name: Checkout
uses: actions/checkout@v4
with:
submodules: false # 先不自动拉取子模块
token: ${{ secrets.GITHUB_TOKEN }}

# 3. 手动更新子模块URL为SSH并拉取
- name: Update and fetch submodules
run: |
# 修改子模块URL为SSH格式
git submodule set-url themes/butterfly git@github.com:mica520/butterfly.git

# 初始化并拉取子模块
git submodule update --init --recursive --force
echo "子模块更新完成"

# 4. 设置Node.js环境
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'

# 5. 缓存依赖
- name: Cache dependencies
uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
themes/butterfly/node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json', '**/package.json') }}
restore-keys: |
${{ runner.os }}-node-

# 6. 安装依赖
- name: Install dependencies
run: |
npm install
echo "主仓库依赖安装完成"

if [ -f "themes/butterfly/package.json" ]; then
echo "安装子模块依赖..."
cd themes/butterfly
npm install
cd ../..
echo "子模块依赖安装完成"
fi

# 7. 安装Hexo CLI 和gulp CLI
- name: Install Hexo CLI and gulp CLI
run: |
npm install -g hexo-cli
hexo version
echo "Hexo CLI 已安装"
npm install -g gulp-cli
gulp -v
echo "gulp CLI 已安装"

# 8. 生成静态文件
- name: Generate static files
run: |
hexo clean
hexo generate
echo "静态文件生成完成"
# 9.压缩资源
- name: Compress static files
run: |
gulp
echo "压缩资源完成"

# 9. 部署
- name: Deploy
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
hexo deploy
echo "部署完成"
env:
GIT_USER: mica
GIT_EMAIL: 2670734380@qq.com

# 10. 完成提示
- name: Success message
run: echo "🎉 部署成功!"

注意没有设置子模块的同学要删除相应部分,里面同时设置了gulp压缩资源,没有配置的同学需要删掉。

修改_config.yml文件中的部署地址

由于我们使用了两个密钥,所以要指定部署时使用哪一个,不然git-action部署失败

1
2
3
4
5
6
 deploy:
type: git
- repository: git@github.com:mica520/mica520.github.io.git
+ repository: git@github-pages-deploy:mica520/mica520.github.io.git
branch: main

推送仓库到远程

到此,一切工作都已完成,将本地仓库推送到远程就会
自动触发git-action工作流。

如有错误,还望各位大佬包涵!!