多地部署Gerrit Replication插件同步异常解决思路及方案(附脚本与CronJob部署)

背景

为了支持多地开发,我司在代码服务器(Gerrit)上使用了Replication插件,进行多地部署同步。
整体结构如下:

  • A地区:主Gerrit服务器
  • B地区:从Gerrit服务器

正常的工作流程是:

  • B地区开发者从从服务器拉取代码。
  • B地区开发者向主服务器推送代码。
  • Replication插件保证主从数据同步。

一开始运行良好,直到某天出现了问题。


问题出现

主Gerrit服务器推送了一个鸿蒙代码仓库,这个仓库非常庞大。
由于Replication插件没有针对同步项目做过滤(默认同步全部仓库),导致:

  • B地区从服务器同步鸿蒙仓库时异常缓慢。
  • B地区开发者频繁反馈:代码未同步更新,拉取到的代码不是最新版本。

翻查 Gerrit 日志,只能看到xxx仓库同步推送任务开始(只要有人推送代码就触发),但没有明确的成功/失败信息,也没有报错。


解决方案1:(不可行)

一开始的应急措施是:

  1. 在A地区停掉Gerrit服务
  2. 手动执行rsync等同步命令,强制推送仓库到B地区,确保两边文件完全一致。
  3. 同步完成后,再重新启动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批量推送脚本)

  1. 但由于仓库较多,将仓库一个一个推送过去也不现实。
  2. 碰巧我们使用 repo 管理 Git 仓库,那就只需通过 B地区开发者所使用的manifes.xml文件,确认必要仓库。
  3. 自动化推送脚本+定时任务,无需手工操作。

思路:

  • 读取manifest.xml文件(1个或多个)。
  • 提取所有需要同步的project path
  • 根据路径生成对应的git push命令。

Python示例代码

from lxml import etree

def sync_script(xml_files):
    # 统计仓库用的list
    pro_list=[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值