多地部署Gerrit Replication插件同步异常解决思路及方案(附脚本与CronJob部署)
背景
为了支持多地开发,我司在代码服务器(Gerrit)上使用了Replication插件,进行多地部署同步。
整体结构如下:
- A地区:主Gerrit服务器
- B地区:从Gerrit服务器
正常的工作流程是:
- B地区开发者从从服务器拉取代码。
- B地区开发者向主服务器推送代码。
- Replication插件保证主从数据同步。
一开始运行良好,直到某天出现了问题。
问题出现
主Gerrit服务器推送了一个鸿蒙代码仓库,这个仓库非常庞大。
由于Replication插件没有针对同步项目做过滤(默认同步全部仓库),导致:
- B地区从服务器同步鸿蒙仓库时异常缓慢。
- B地区开发者频繁反馈:代码未同步更新,拉取到的代码不是最新版本。
翻查 Gerrit 日志,只能看到xxx仓库同步推送任务开始(只要有人推送代码就触发),但没有明确的成功/失败信息,也没有报错。
解决方案1:(不可行)
一开始的应急措施是:
- 在A地区停掉Gerrit服务。
- 手动执行rsync等同步命令,强制推送仓库到B地区,确保两边文件完全一致。
- 同步完成后,再重新启动Gerrit服务。
问题:
- 停机时间长:由于宽带上传带宽有限,重新同步全部仓库需要近一个月,生产环境根本不可接受。
- 操作复杂且高风险:容易同步失败或漏同步。
解决方案2:(可行)
思路调整为:
不全量同步,只强制同步B地区开发者所用到的仓库。
手动推送命令示例
主Gerrit服务器上执行以下命令同步单个仓库:
repository="parent/project.git"
cd /var/gerrit/git/$repository
git push --mirror 从Gerrit服务器地址:/home/gerrit/gerrit_site/git/$repository
备注说明:
repository
是要同步的仓库路径,例如parent/project.git
。cd
进入本地gerrit存储的仓库目录。git push --mirror
将本地仓库完整同步(包括所有分支、标签等)到从Gerrit服务器。- 注意:–mirror参数意味着源仓库所有的分支、标签、远端设置都会被同步,是最彻底的推送方式。
进阶优化(生成sh批量推送脚本)
- 但由于仓库较多,将仓库一个一个推送过去也不现实。
- 碰巧我们使用 repo 管理 Git 仓库,那就只需通过 B地区开发者所使用的manifes.xml文件,确认必要仓库。
- 自动化推送脚本+定时任务,无需手工操作。
思路:
- 读取
manifest.xml
文件(1个或多个)。 - 提取所有需要同步的
project path
。 - 根据路径生成对应的git push命令。
Python示例代码
from lxml import etreedef sync_script(xml_files):# 统计仓库用的listpro_list=[