好久没写Blog了,准确来说,好久没发布Blog了。由于电脑环境的变化,之前的的环境都找不到了,懒得修,这次切换到自动化部署,以后专心写markdown。

环境

在 GitHub 建好两个仓库,

  • 私有仓库,存放Blog源码仓库

  • 公开仓库:存放Github Pages仓库username.github.io 仓库

Blog源码仓库私有化是一些主题配置有一些API_Token,所以和 Github Pages 仓库分开管理。

一个仓库也是可以的,直接参考Hexo 官方部署方案

设置密钥

GitHub Actions是在Blog源码仓库执行的,为了确保 GitHub Actions 能够推送代码到Github Pages仓库,使用SSH 密钥的方式来执行git的推送。

生成新 SSH 密钥

在本地计算机上生成新的 SSH 密钥。 生成密钥后,可将公钥添加到 GitHub.com 上的帐户中,以便通过 SSH 为 Git 操作启用身份验证。

1
ssh-keygen -t ed25519 -C "your_email@example.com" -f github-deploy-key

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

千万注意:在提示符下,键入安全密码的时候,直接回车不要输入密码。

1
2
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

如果输入了密码,那么重新生成一个吧。

向你的Github帐户添加新的 SSH 密钥

向 GitHub.com 上的帐户添加SSH 公钥github-deploy-key.pub的内容。

  1. 在 GitHub 任意页的右上角,单击个人资料照片,然后单击“设置”。

  2. 在边栏的“访问”部分中,单击 “SSH 和 GPG 密钥”。

  3. 单击“新建 SSH 密钥”或“添加 SSH 密钥” 。

  4. 在 “Title”(标题)字段中,为新密钥添加描述性标签。

  5. 在“密钥”字段中,粘贴公钥。

  6. 单击“添加 SSH 密钥”。

    image-20240711173259866

为了保险起见,你可以在本地先测试下 SSH 连接,确保设置成功。

1
ssh -T git@github.com

Blog源码仓库设置

借助存储库环境中创建的环境变量Secrets and variables设置SSH 私钥,GitHub Actions 读取并保存下来还原成SSH 私钥文件。

进入Blog源码仓库页面 → Settings → Secrets and variables → actions → New repository secret,Name 填 HEXO_DEPLOY_PRI ,Secret 填 github-deploy-key 私钥的内容。

image-20240711175319943

Github Pages仓库设置

进入Github Pages仓库页面 → Settings → Deploy keys → Add deploy key,Title 填 HEXO_DEPLOY_PUB ,Key 填 github-deploy-key.pub 公钥的内容。

image-YWUOpze79IPuQLJ

这里有一个坑,如果你在[2.2 向你的Github账户添加新的SSH密钥](## 向你的Github帐户添加新的 SSH 密钥)会发现这里添加不上,来看一下Github对Deploy keys 部署密钥的说明:部署密钥是授予对单个存储库的访问权限的 SSH 密钥。GitHub 将密钥的公共部分直接附加到您的存储库(这里是Github Pages仓库)而不是个人帐户,并且密钥的私有部分保留在您的服务器上(这里是执行Github Action的Blog源码仓库)。

升级最新版本的Hexo

我之前的Hexo版本是5.0+的版本了,怕在部署的时候遇到一些版本问题,所以直接重新安装最新版本的Hexo,在本地调试好确保可以在本地正常生成和部署页面。

参考Hexo官方文档:https://hexo.io/docs/

直接安装好环境,把旧的source 文件夹迁移过去即可。

注意更新package.json中的所有依赖包到最新版本,使用 npm-check-updates 是一个有用的工具,可以用来更新 package.json 中的所有依赖包到最新的版本。全局安装 npm-check-updates

1
npm install -g npm-check-updates

检查可更新的依赖

1
ncu

这会列出所有可以更新的依赖包及其新版本。

更新 package.json 中的依赖版本

1
ncu -u

这会自动更新 package.json 中的依赖版本。

安装更新的依赖

1
npm install

这会列出所有可以更新的依赖包及其新版本。

更新特定依赖

如果你只想更新某个特定的依赖包,可以使用 npm install 命令并指定最新版本或使用 @latest 标签。

1
2
3
npm install [package-name]@latest
例如,要更新 hexo 到最新版本
npm install hexo@latest

Github Actions 脚本

在你的Blog源码仓库根目录下创建一个 .github/workflows 文件夹,在该文件夹内创建一个新的 YAML 文件(例如 hexo-deploy.yml)用于定义 GitHub Actions 工作流。

完整的 GitHub 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
46
47
48
49
50
51
52
53
54
name: Deploy hexo blog

# 设置触发条件
# 触发条件:push更新到master 分支 触发 GitHub Actions 进行自动部署
on:
push:
branches:
- master # Blog源码仓库你使用的分支名称

jobs:
build:
# 使用ubuntu镜像,node版本为20.x
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]

steps:
# 拉取代码
- name: Checkout
uses: actions/checkout@v4

# 安装node和npm
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

# 配置环境变量,也可使用第三方的 action 发布到gh-pages,如peaceiris/actions-gh-pages@v3,就不用配置这么复杂
- 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 "yourname"
git config --global user.email "your_email"

# npm ci 使用 package-lock.json 文件中的确切版本来安装依赖
# 我这里用的主题为maupassant
- name: Install dependencies
run: |
npm i -g hexo-cli
npm ci
cd themes/maupassant/
npm ci

- name: Deploy hexo
run: |
hexo clean
hexo d -g

配置部署信息

要使 hexo d -g 正常工作,你需要在Blog源码根目录下的 _config.yml 文件中配置部署信息。配置如下:

1
2
3
4
deploy:
type: git
repo: git@github.com:username/username.github.io # 更改为你的 GitHub Pages 仓库, username 是你的用户名
branch: gh-pages # GitHub Pages 分支

提交本地的 Blog源码仓库即可触发 Github Actions 工作流实现自动部署,然后访问你的 username.github.io

Reference

使用 GitHub Actions 自动发布 Hexo 博客
利用 GitHub Actions 实现自动化部署 Hexo 到 Github Pages