使用 GitHub Actions 自动发布 Hexo 博客

Github Actions 的原理

按照我的理解就是,首先GitHub 提供了一个虚拟主机,这个主机是干净的。当你需要使用它的时候,你首先得制作一个简单的部署或者测试环境,这是通过 pull docker 镜像或者安装一些软件实现的,甚至你还得配置一些秘钥啥的来访问特定操作(后面有例子)。总之,第一步得配置好环境。

第二步,就是你要在这个机器上要做的事情了,事实上,第一步的时候你已经做了一些事情了,比如安装一些必要的软件来创建所需要的环境。不同的是,这时候就得来做你想要做的事情了。比如编译一些目标、部署一下博客(这篇文章的主题)。

所以 Actions 的原理很好理解,接下来就看要怎么操作才能创建一个 Hexo 生成、部署(github push)的环境了。

设置权限

为什么是设置权限呢?这是因为我们部署的原理的要求。首先我们需要在 A 仓库中写 mark down 博客,然后在根目录中执行一些 hexo 命令来将生成的网页等文件push 到 B 仓库。A 仓库一般是隐私的,存储着我们的 markdown 格式的博客,而 B 仓库一般是我们的目标仓库,一般是公开的,比如 luyoung0001.github.io

问题是,当我们需要将 A 仓库生成的网页等文件 push 到 B 仓库时,是需要权限的,因此我们的环境设置中必须要有权限设置,从而可以使得在 A 目录中通过 hexo d 的时候可以成功将生成的代码 push 到 B 仓库中。

权限怎么设置呢?其实 GitHub 已经贴心的将这个需求解决了。我们只需要生成一对密钥,将私钥放在 A,将公钥放在 B。

首先在你本机生成密钥对:

1
ssh-keygen -f github-deploy-key

一路回车,当前目录下就会生成 github-deploy-keygithub-deploy-key.pub

接着,设置 A 仓库和 B 仓库的公钥和私钥:

对于 A 仓库:进入仓库页面 → Settings → Secrets and variables → actions → New repository secret,Name 填 HEXO_DEPLOY_PRI ,Secret 填 github-deploy-key 的内容。

对于 B 仓库:进入仓库页面 → Settings → Deploy keys → Add deploy key,Title 填 HEXO_DEPLOY_PUB ,Key 填 github-deploy-key.pub 的内容。

这里的需要注意的是,你需要将私钥整个复制,包括 -----BEGIN OPENSSH PRIVATE KEY-----:

1
2
3
cat github-deploy-key
-----BEGIN OPENSSH PRIVATE KEY-----
...

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

on:
push:
branches:
- master

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

steps:
- uses: actions/checkout@v4

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
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" | tr -d '\r' > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name "你的 github 用户名"
git config --global user.email "你的 github 邮箱"
- name: Install dependencies
run: |
npm i -g hexo-cli
npm ci
- name: Deploy hexo
run: |
rm -rf .deploy_git
hexo clean
hexo d -g

需要注意的是:

  • 设置时区很重要。平常我们在自己电脑上部署都是 GMT+8 时区,但是执行 GitHub action 的 runner 在美国,可不是这个时区,所以我们要改下时区,否则如果你的博文地址是 年/月/日 这种形式的话,可能会出现有些博文访问不了的问题。
  • SSH 密钥。这里选择的事 ssh,而之前你部署的时候使用的是 http,那么你需要修改 dev 目录下 _config.yml 中的 deploy 字段中的 repo,改为 ssh 地址,即:
1
2
3
4
5
6
7
8
9
10
deploy:
type: git
repo: https://github.com/secsilm/secsilm.github.io.git
branch: master

# 应改为:
deploy:
type: git
repo: git@github.com:secsilm/secsilm.github.io.git
branch: master

你也可以配合大模型来仔细查看那个脚本的具体含义,总之就是环境+操作。

测试

你可以进行一次更改提交,看看 action 是否正常执行。你可以在 GitHub Actions 页面查看每次运行的日志。

这里一般会遇到几个小问题:

权限

可能报这个错误:

1
2
3
4
5
6
7
...
Load key "/home/runner/.ssh/id_rsa": error in libcrypto
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

前面已经提到,你必须把私钥所有的内容复制到 repository secret。

部署失败

可能报这个错误:

1
2
3
4
5
6
7
8
...
INFO 540 files generated in 1.98 s
INFO Deploying: git
INFO Clearing .deploy_git folder...
INFO Copying files from public folder...
INFO Copying files from extend dirs...
fatal: in unpopulated submodule '.deploy_git'
...

解决办法是:

1
rm -rf .deploy_git

这个我已经加到脚本了,不会再遇到了。

这篇博客就是通过 Actons 部署,再也不用本地环境了,由于网络的关系,使得某些过程可能会卡很久,但是 Actions 不会存在网络问题,只要你能 push 成功。


使用 GitHub Actions 自动发布 Hexo 博客
http://blog.luliang.online/2025/02/11/如何使用github_action自动部署博客/
作者
Luyoung
发布于
2025年2月11日
许可协议