一个可批量 Fork 与同步 GitHub 仓库的工作流,支持批次处理、重试与超时保护、速率限制防护、冲突自动重命名,以及试运行模式与结果汇总报告。脚本已按 Job 分类拆分,便于维护与复用。
- 批量处理仓库(默认每批 100 个),并行度可控(
max-parallel) - 支持手动触发与定时任务,支持强制同步与试运行模式
- 冲突自动处理:
rename(自动重命名)、skip、interactive - 对关键操作增加重试与超时,增强稳定性
- 自动生成结果表(Artifacts + Step Summary),包含统计与重命名明细
- 脚本分层:
prepare、create-batches、fork-sync、collect-results、summary
- 准备一个 Personal Access Token,命名为仓库 Secret:
GH_PAT
- 必须包含至少
repo与workflow权限
- 配置触发方式与输入参数
- 在
.github/workflows/fork.yml中已默认开启workflow_dispatch与schedule
- 运行
- 在 Actions 页面选择该工作流,按需填写输入项并触发
工作流触发:
- 手动:
workflow_dispatch - 定时:
schedule(默认每小时)
可用输入(workflow_dispatch.inputs):
dry_run(boolean,默认false):试运行,不执行实际 fork/sync,仅预览动作force_sync(boolean,默认false):对已 fork 的仓库强制执行同步conflict_resolution(choice,默认rename):重名冲突策略,可选skip|rename|interactive
环境变量:
PLUGIN_JSON_URL:包含插件列表的 JSON 地址(默认为 AstrBot 的plugins.json)
Secrets:
GH_PAT:GitHub Personal Access Token(需要repo、workflow权限)
依赖:
- 运行环境:
ubuntu-latest - 预装工具(Actions Runner 已内置或可用):
gh、jq、curl
.github/
scripts/
prepare/
fetch_plugins.sh
parse_repo_list.sh
create-batches/
create_batches.sh
fork-sync/
setup_env.sh
setup_gh_cli.sh
verify_auth.sh
batch_delay.sh
process_batch_repos.sh
collect-results/
generate_results_table.sh
display_results_summary.sh
summary/
final_summary.sh
prepare
- 下载
plugins.json并解析仓库列表,产出:steps.list.outputs.repos:去重后的仓库数组(JSON 字符串)steps.list.outputs.total_count:仓库总数
create-batches
- 将仓库均分为批次(默认每批 100),产出:
steps.batch.outputs.batches:批次数组(含batch_id与repos)steps.batch.outputs.batch_count:批次数量
fork-sync(矩阵并行执行)
- 对每个批次:
- 登录
gh(使用GH_PAT) - 防抖延迟(随批次递增)以降低 Rate Limit 风险
- 遍历批次内仓库:
- 检查原仓库存在性
- 检查是否已有有效 fork
- 根据输入策略执行 fork 或同步
- 失败/超时场景做重试与错误归类
- 生成每个仓库的 JSON 结果文件并上传为 Artifact(分批)
- 登录
collect-results
- 下载所有批次的结果 JSON,生成
results_summary.md并上传 Artifact,同时输出到 Step Summary
summary
- 汇总整次运行的关键指标与说明到 Step Summary
name: Fork/Sync Plugins
on:
workflow_dispatch:
inputs:
dry_run:
type: boolean
default: false
force_sync:
type: boolean
default: false
conflict_resolution:
type: choice
default: rename
options: [skip, rename, interactive]
jobs:
call:
uses: your-org/your-repo/.github/workflows/fork.yml@main
secrets: inherit如果想作为“可复用工作流”在其他仓库调用,建议在本工作流的
on:中添加workflow_call:并为各输入定义 schema,然后如上通过uses:语法引用。
- 每个仓库生成一份 JSON 结果(包含状态、信息、时间戳、是否重命名等)
- 汇总报告
results_summary.md会:- 以 Artifact 形式上传(名称:
fork-sync-results) - 同时追加到 Step Summary,便于直接在页面查看
- 以 Artifact 形式上传(名称:
- 每个批次在开始前按批次编号增加延迟(
batch_id * 15s) - 关键 API 操作均设置超时(
timeout)与最多 3 次重试 - 批次和仓库间穿插固定 sleep,进一步降低被限速概率
- 并发控制通过
strategy.max-parallel实现
- 能否只用
GITHUB_TOKEN而不用GH_PAT?
- 不建议。
GITHUB_TOKEN是当前仓库作用域,无法在你的用户命名空间创建 fork;故使用具备repo与workflow权限的GH_PAT更可靠。
plugins.json中的仓库地址支持哪些形式?
- 支持
https://github.com/owner/repo[.git],会自动去掉/tree/...、/blob/...与.git后缀并做唯一化。
- 为什么要分批?
- 降低并发、控制速率、提升成功率;同时便于在失败时部分重试与问题定位。
本仓库遵循仓库内 LICENSE 文件所述协议。