基于 Github Workflow 的多仓库脚本联动
使用 Github Workflow 实现多个仓库之间的 Git 操作、Python 等脚本联动,提升开发效率和自动化水平。
前言
一开始搭建出博客后就基于 Aplayer 制作了大多博客都有的页内音乐播放器,主要功能实现起来简单,但是有两个痛点:1. 音乐资源存储;2. 切换页面断点续播。
在 AI 编程工具日益强大的当前,上个月很快利用 Pjax 等基本实现了第二个音乐续播的问题(副作用是部分页面 JS 失效,可能需要多刷新一次 T_T),而第一个问题在我临时采用另一个仓库存储音乐资源后,就再也没管了。
在这套方案下,每当我需要更新若干首曲目到我的音乐列表时,不仅需要手动上传音乐到音乐资源仓库,还需要手动更新博客仓库中的 Aplayer 配置文件。因此,想要自动化整个流程,实现 push 音乐后,自动更新博客配置并重新部署的想法一直萦绕在我脑海里。
在了解到 CI/CD 的概念,并轻度使用了 Github Workflow 后,今天在 AI 的协助下,终于实现了整个流程。
方案设计
音乐资源仓库(music)和博客仓库(hugo)之间的数据流程如下:
用户提交更新音乐文件到music仓库后,触发 Github Workflow:1. 在music仓库中执行脚本,更新musicList.json文件;2. 将更新后的musicList.json文件提交到博客仓库(hugo)的特定分支;3. 博客仓库(hugo)的 Workflow 监听到该分支的更新后,自动部署博客。

实现过程
1. music 仓库
1.1 Workflow 配置
在 .github/workflows/music-sync.yml 中配置 Workflow:
- 触发条件:监听
main分支的 push 事件,且仅当特定路径(如musics/**,lrc/**,test.py,.github/workflows/music-sync.yml)发生变化时触发;同时支持手动触发。 - 操作:
- 检出代码并设置 Python 环境。
- 执行
test.py脚本生成musicList.json。 - 检查
musicList.json是否有变化,如果有则提交更新到music仓库。 - 如果有更新且存在有效的 dispatch token,则触发 repository dispatch 事件,通知博客仓库进行同步。
| |
1.2 脚本实现
test.py 脚本主要功能是扫描 musics/ 目录下的音乐文件,生成对应的 musicList.json 文件,并根据需要生成歌词文件(lrc/)。脚本会根据环境变量控制是否跳过歌词生成、是否要求必须有歌词等逻辑。
| |
1.3 Github 仓库与权限配置
1.3.1 Github Personal Access Token 配置 - BLOG_REPO_DISPATCH_TOKEN
- Github PAT 用于授权 Workflow 在
music仓库中执行 Git 操作(如提交更新)以及触发博客仓库的 dispatch 事件。
打开 Github 右上角头像,进入
Settings->Developer settings->Personal access tokens。点击
Personal access tokens,然后点击Fine-grained tokens。点击
Generate new token,选择Generate new token (fine-grained)。配置 Token:
- Name:
BLOG_REPO_DISPATCH_TOKEN - Expiration: 根据需要选择(建议设置合理的过期时间)
- Repository access: 选择
Only select repositories,然后选择lihan3238/lihan3238.github.io(hugo博客)仓库。 - Permissions:
- Repository permissions:
Contents设置为Read and write
- Repository permissions:
- Name:
生成 Token 后,复制 Token 的值。
进入
music仓库的Settings->Secrets and variables->Actions,点击New repository secret。Name:
BLOG_REPO_DISPATCH_TOKEN,Value: 粘贴刚才复制的 Token,保存。
2. hugo 仓库
2.1 Workflow 配置
- 触发条件:监听 repository dispatch 事件(
music_list_updated)和手动触发。 - 操作:
- 拉取并更新 layouts/partials/music.html 的歌单
- 用 create-pull-request 创建 PR(v8)
- 用 BLOG_REPO_AUTOMATION_TOKEN 自动审批
- 直接执行 squash merge 并删分支
- 最后再发一个 hugo_deploy_requested 的 dispatch 事件,触发部署流程。
| |
2.2 Github 仓库与权限配置
2.2.1 Github Personal Access Token 配置 - BLOG_REPO_AUTOMATION_TOKEN
- 同 #1.3.1,选择
lihan3238/lihan3238.github.io仓库,并且权限需要包含Pull requests: Write和Contents: Write,以便 Workflow 可以自动审批和合并 PR。
2.2.2 仓库权限配置
- 在
hugo仓库的Settings->Actions->General中,确保Workflow permissions设置为Read and write permissions,以允许 Workflow 执行写操作(如提交更改、创建 PR 等)。
总结
Github 的 workflow 功能非常强大,可以实现跨仓库的自动化操作,极大提升了开发效率和自动化水平。通过合理设计 Workflow 的触发条件和操作步骤,我们可以实现复杂的多仓库联动场景,如本次的音乐列表同步和博客部署流程。
由此看到,包括 K8s、github workflow 等 CI/CD 工具在内的现代开发工具链,已经成为提升开发效率和自动化水平的关键组成部分。学习和掌握 CI/CD 十分重要。
