使用 Github Actions 自动化部署 Hexo
2025-01-22 08:19:30    653 字   
This post is also available in English and alternative languages.

我使用 Hexo + Github Pages 来写 Blog。每次使用 Hexo 写完一篇文章后,都需要执行 hexo d ,将内容推送到 xxx.github.io 仓库中,比较麻烦。
下面利用 Github Actions 机制,在 git push 到 source 仓库后,自动执行发布。

Github Actions 自动化部署 Hexo


1. 仓库

  1. xxx.github.io 仓库:存放编译后的静态页面,公有仓库。
  2. xxx_source 仓库:存放文章内容文件,私有仓库。

2. 生成公钥

命令行,在本地的 xxx_source 仓库目录中执行以下命令:

1
ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f hexo-ation -N ""

会在目录下生成公钥和私钥:hexo-action.pubhexo-action

生成公钥

3. 配置 Deploy Key

3.1. 在 xxx.github.io 仓库中配置

添加公钥 hexo-action.pubAllow write access 勾选。

在 xxx.github.io 仓库中配置.png

3.2. 在 xxx_source 仓库中配置

添加私钥 hexo-action,同时命名为 ACTIONS_DEPLOY_KEY

在source仓库中配置

4. 配置 Github Actions

唯一需要修改的地方为部署仓库: external_repository 和提交分支:publish_branch 配置项。

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
name: Hexo-Build-Pages	# 此 Action 的名字

# 触发条件,当满足条件时会触发此任务
# 这里的 on.push.branches.$.master 是指当 master 分支收到 push 后执行任务。
on:
push:
branches:
- master

jobs:
pages:
runs-on: ubuntu-latest # 任务所需容器,可选值:ubuntu-latest、windows-latest、macos-latest。
permissions:
contents: write
steps: # 一个步骤数组,可以把所要干的事分步骤放到这里。
- uses: actions/checkout@v3
with:
submodules: true
- name: Use Node.js 16.x # 步骤名,编译时会会以 LOG 形式输出。
uses: actions/setup-node@v2 # 所要调用的 Action,可以到 https://github.com/actions 查看更多。
with: # 一个对象,调用 Action 传的参数,具体可以查看所使用 Action 的说明。
node-version: '16.18.1'
- name: Cache NPM dependencies
uses: actions/cache@v2
with:
path: node_modules
key: ${{ runner.OS }}-npm-cache
restore-keys: |
${{ runner.OS }}-npm-cache
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
external_repository: <username>/<usernmae>.github.io
publish_dir: ./public
publish_branch: master
user_name: 'github-actions[bot]'
user_email: 'github-actions[bot]@users.noreply.github.com'
- name: action-bark # bark通知,不需要可以去除
uses: harryzcy/action-bark@v2.0.2
with:
status: ${{ job.status }}
title: custom title
body: custom body
device_key: ${{ secrets.BARK_DEVICE_KEY }}
level: passive # iOS notification level 'active', 'timeSensitive' or 'passive', default to 'active'
bark_server_url: ${{ secrets.BARK_SERVER_URL }}
if: always() # Pick up events even if the job fails or is canceled.

5. source 仓库的目录结构

source 仓库大致的目录层级。

这里要注意目录结构,因为没有注意目录层级,浪费了半天时间。

1
2
3
4
5
6
7
8
9
10
Blog
├─ .github
│ └─ workflows
│ └─ deployment.yml
├─ .gitignore
├─ _config.yml
├─ db.json
├─ package.json
├─ source
└─ themes