Hexo代码与文档仓库分离的自动化构建与部署

记录一次github action的玩耍记录

背景

迫于毕业设计的鸭梨🍐,博主决定搭建一个博客玩玩,虽然animation玩的很爽但是开发的很痛苦。

还是用框架吧。

tips: 本博客由Hexo&Fluid主题构建。

该框架是静态博客,但本博主想要实现快速自由的更新,并且希望将文档和相关代码分离,起初尝试过GitLab的实践,但奈何云服务器配置不给力,SWAP交换分区也不顶用,所以用上了github action,再结合git submodule子仓库专门用于存放markdown笔记文件。这样通过提交子仓库的文档更新,再通过webhook触发一下主仓库触发自动化部署操作,此时在主仓库的构建中连同文档所在的子仓库一起拉下来即可。

子仓库的操作这里不再赘述,友们可以参考分离 hexo 的 _posts 目录到独立仓库

博主就是参考这位大佬的。

架构

懒得写,基本上就是通过推送submodule子仓库然后触发webhook钩子,再在主仓库的action触发一些自动化构建部署的操作。

但是这个架构会导致hexo的文章创建日期一直在最近部署的时间,找个时间再debug吧,博主还要考CET4呢。

Action配置

请先在各自仓库的设置中 “Setting -> Secrets and variables -> Actions”添加自己需要的secrets和variables,其实就是密文和明文变量。

博主这里创建的都是repository secrets和repository variables,有需要的可以根据自己的需求创建Environment secrets/variables

配置中secrets用法为 ${{ secrets.*** }},其中***为你自己设置的变量名称

配置中variables用法为 ${{ vars.*** }},其中***为你自己设置的变量名称

Hexo主仓库的Deployment.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
# 定义工作流的名称
name: Deployment

# 定义触发工作流的事件
on: repository_dispatch

# 定义工作流中的一个作业
jobs:
# 作业名称
deploy:
# 指定作业运行的环境
runs-on: ubuntu-latest

# 定义作业中的步骤
steps:
# 第一步:检出代码
- name: Checkout
# 使用 actions/checkout@v4 动作来检出仓库代码
uses: actions/checkout@v4
# 设置动作的参数
with:
# 检出指定分支
ref: main
# 设置 SSH 密钥,用于访问私有子模块
ssh-key: ${{ secrets.REPOSITORY_PRIVATEKEY }}
# 注释掉的参数,如果需要可以取消注释
# submodules: recursive
# persist-credentials: false

# 第二步:初始化和更新子模块
- name: Initialize and update submodules
# 使用 run 字段执行 shell 命令
run: |
# 初始化 SSH 代理
eval `ssh-agent -s`
# 将 SSH 密钥添加到 SSH 代理
ssh-add - <<< "${{ secrets.REPOSITORY_PRIVATEKEY }}"
# 初始化子模块
git submodule init
# 更新子模块到最新提交
git submodule update --recursive --remote

# 第三步:安装 npm 依赖
- name: npm env
# 执行 npm install 命令
run: npm install
# 设置环境变量 CI 为 true
env:
CI: true

# 第四步:使用 Hexo 构建静态网站
- name: hexo build
# 执行 Hexo 清理和生成命令
run: |
npx hexo clean
npx hexo generate
# 设置环境变量 CI 为 true
env:
CI: true

# 第五步:部署到远程服务器
- name: Deploy
# 使用 easingthemes/ssh-deploy@v3.0.1 动作进行部署
uses: easingthemes/ssh-deploy@v3.0.1
# 设置环境变量,用于 SSH 部署
env:
SSH_PRIVATE_KEY: ${{ secrets.ECS_PRIVATEKEY }}
# 注释掉的参数,如果需要可以取消注释
# ARGS: "-avz --delete"
# 设置部署的源目录、远程主机、用户和目标路径
SOURCE: "public/"
REMOTE_HOST: ${{ vars.REMOTE_HOST }}
REMOTE_USER: ${{ vars.REMOTE_USER }}
TARGET: ${{ vars.TARGET }}

这里用到了actions/checkout@v4和easingthemes/ssh-deploy@v3.0.1

截止博文目前的更新日期,如果你使用ssh-deploy@v5.0.4的版本,你会遇到一些来自代码层面的奇怪bug,应该是开源作者的代码bug,如果你有相关功底可以去该项目下提交issue或提pr fix这个bug。应该是文件命名的问题,作者前面给文件创建定义了new Date但后面获取信息没有加这段代码,会抛出no such file的错误,所以还是使用以前没有new Date的版本吧

文档子仓库的Trigger.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
name: Trigger-HexoRepository

on: [push]

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Trigger HexoRepository Action
run: |
curl -L \
-X POST \
-H "Accept:application/vnd.github+json" \
-H "Authorization:Bearer ${{secrets.token}}" \
-H "X-GitHub-Api-Version:2022-11-28" \
https://api.github.com/repos/FishingRodd/Blog/dispatches \
-d '{"event_type":"${{ github.event.head_commit.message }}","client_payload":{"unit":false,"integration":true}}'

子仓库的action使用了webhook钩子,在子仓库的文档触发更新时调用这个钩子再触发主仓库的action。

注意:

Setting里的webhook满足不了自定义的请求,如果用github webhook会缺失权限,因为主仓库repository_dispatch的鉴权方式是Authorization,github webhook里你自己配置的secret会被定义成X-Hub-SignatureX-Hub-Signature-256的载荷,如果你配置了github webhook会发现他第一步的ping就403即权限出错。所以建议还是用action来发webhook吧

参考

官方文档:

触发工作流的事件

其他链接:

分离 hexo 的 _posts 目录到独立仓库

使用GithubActions自动部署应用到自己的服务器(ECS)

github自动部署阿里云ECS


Hexo代码与文档仓库分离的自动化构建与部署
https://www.fishingrodd.cn/2024/03/02/使用github-action实现自动化部署/
作者
FishingRod
发布于
2024年3月2日
更新于
2024年3月2日
许可协议