F嘉阳-coder cb22214784
Some checks failed
阿里云仓库同步流水线(强制同步/镜像模式) / sync-repositories (push) Has been cancelled
BladeX仓库同步流水线 / sync-repositories (push) Successful in 28m1s
阿里云仓库合并流水线(合并模式) / merge-repositories (push) Successful in 1m13s
添加流水线
2025-12-25 10:06:05 +08:00
fix
2025-11-20 22:19:43 +08:00
2025-12-25 10:06:05 +08:00
2025-12-24 10:39:51 +08:00
2025-12-24 10:23:46 +08:00
2025-12-25 10:06:05 +08:00
2025-11-20 21:41:58 +08:00
2025-11-23 22:43:36 +08:00

多仓库同步系统

这是一个支持批量同步多个 Git 仓库的自动化流水线系统,适用于从上游仓库同步代码到目标 Gitea 仓库。

🚀 功能特性

  • 批量同步:通过配置文件一次性管理多个仓库同步
  • 冲突自动处理:使用 reset --hard 策略,确保目标仓库完全同步为上游状态
  • 定时执行支持定时任务每天凌晨1点自动执行
  • 手动触发:支持手动触发和配置文件更新时自动触发
  • 详细日志:提供每个仓库同步过程的详细日志和总结报告
  • 安全可靠:内置超时机制和错误处理

📁 项目结构

.
├── repos.yaml                       # 仓库同步配置文件
├── .gitea/
│   └── workflows/
│       └── multi-repo-sync.yml      # 同步流水线定义
└── README.md                        # 本文档

注意: Gitea Actions 支持两种工作流路径:

  • .gitea/workflows/ (官方推荐)
  • .github/workflows/ (兼容性支持)

🔧 配置说明

1. 配置文件 (repos.yaml)

在项目根目录的 repos.yaml 文件中定义需要同步的仓库:

# 多仓库同步配置文件
# 定义需要同步的仓库对,源仓库 -> 目标仓库
repositories:
  # 示例:同步 BladeX-Tool 仓库
  - name: "bladex-tool"           # 仓库名称(用于日志输出)
    source_url: "https://${UPSTREAM_USERNAME}:${UPSTREAM_TOKEN}@center.javablade.com/blade/BladeX-Tool.git"
    target_url: "https://${TARGET_USERNAME}:${TARGET_TOKEN}@gitea.fjy8018.top/home/BladeX-Tool.git"
    branch: "master"               # 要同步的分支

  # 示例:同步另一个仓库(取消注释并修改以下配置)
  - name: "another-repo"
    source_url: "https://${UPSTREAM_USERNAME}:${UPSTREAM_TOKEN}@github.com/example/repo.git"
    target_url: "https://${TARGET_USERNAME}:${TARGET_TOKEN}@gitea.fjy8018.top/home/repo.git"
    branch: "main"

  # 添加更多仓库同步配置...

配置字段说明:

字段 必填 说明
name 仓库标识名称,用于日志输出
source_url 上游仓库地址,支持环境变量
target_url 目标 Gitea 仓库地址,支持环境变量
branch 要同步的分支,默认为 master

2. 环境变量

在 Gitea 仓库的 Settings > Secrets 中配置以下变量:

变量名 必填 说明
UPSTREAM_USERNAME 上游仓库用户名
UPSTREAM_TOKEN 上游仓库访问令牌/密码
TARGET_USERNAME 目标 Gitea 用户名
TARGET_TOKEN 目标 Gitea 访问令牌

注意: 变量名不能以 GITEA_GITHUB_ 开头(这些是系统保留前缀),建议使用 TARGET_UPSTREAM_ 等前缀区分不同仓库的凭证。

安全建议: 使用 Personal Access Token (PAT) 而不是密码,以提高安全性。

🚀 使用方法

方法 1手动触发

进入 Gitea 仓库页面的 Actions 标签页,选择 "多仓库同步流水线",点击 Run workflow 手动执行。

方法 2定时任务

流水线默认配置为每天凌晨 1 点UTC自动执行。可在 .gitea/workflows/multi-repo-sync.yml 文件中修改 cron 表达式:

schedule:
  - cron: '0 1 * * *'  # 每天凌晨1点执行

方法 3配置文件更新时自动触发

当修改 repos.yaml 或工作流文件时,会自动触发同步。

📊 执行结果

执行成功后,可以在 Gitea Actions 页面查看:

  • 每个仓库的同步状态(成功/失败)
  • 详细的同步日志
  • 同步完成总结报告

示例输出:

============================================================
开始同步仓库: bladex-tool
源地址: center.javablade.com/blade/BladeX-Tool.git
目标地址: gitea.fjy8018.top/home/BladeX-Tool.git
分支: master
============================================================

[1/6] 克隆目标仓库...
[2/6] 添加上游远程...
[3/6] 获取上游更改...
[4/6] 检查分支...
[5/6] 同步到上游分支...
[6/6] 推送到目标仓库...
✅ [bladex-tool] 同步成功!

⚠️ 重要说明

  1. 强制同步策略:本流水线使用 git reset --hard 策略,确保目标仓库完全与上游一致。任何在目标仓库上的修改都可能被覆盖。

  2. 权限要求:确保提供的 Token 具有对目标仓库的写入权限。

  3. 冲突处理:由于采用强制重置策略,不会保留目标仓库与上游的冲突修改。

  4. 大仓库同步:对于大型仓库,可能需要调整流水线超时时间。

  5. 私有仓库:需要确保 Token 具有访问私有仓库的权限。

🔍 故障排除

问题权限被拒绝Permission denied

解决方案

  • 检查 Secrets 中的用户名和 Token 是否正确
  • 确认 Token 具有 repo 范围的权限
  • 验证仓库 URL 是否正确

问题:仓库不存在

解决方案

  • 在目标 Gitea 上预先创建空仓库
  • 检查配置文件中的仓库地址是否正确

问题:同步超时

解决方案

  • .gitea/workflows/multi-repo-sync.yml 中增加超时时间
  • 对于大仓库,考虑使用浅克隆(已优化为 bare clone

问题:配置文件解析错误

解决方案

  • 使用 YAML 格式验证工具检查 repos.yaml
  • 确保所有必要字段都已填写

📝 最佳实践

  1. 逐步添加仓库:初次使用时,先配置 1-2 个仓库测试
  2. 使用变量:将敏感信息和可变信息放在 Secrets 中
  3. 监控执行:定期检查流水线执行日志
  4. 测试环境:先在测试仓库验证同步逻辑
  5. 备份策略:重要仓库确保有备份机制

🤝 贡献

欢迎提交 Issue 和 Pull Request 来改进此项目。

📄 许可证

MIT License

🔗 相关链接

Description
No description provided
Readme 107 KiB
Languages
Python 100%