当前位置: 首页 > news >正文

多地部署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 etreedef sync_script(xml_files):# 统计仓库用的listpro_list=[
http://www.xdnf.cn/news/207775.html

相关文章:

  • Cursor:AI时代的智能编辑器
  • LSTM预测模型
  • 前缀和 --- 二维前缀和
  • 基于PHP的宠物用品商城
  • RTDETRv2 pytorch训练
  • 【3D 地图】无人机测绘制作 3D 地图流程 ( 无人机采集数据 | 地图原始数据处理原理 | 数据处理软件 | 无人机测绘完整解决方案 )
  • 什么是静态住宅ip,跨境电商为什么要用静态住宅ip
  • IP属地是实时位置还是自己设置
  • SRIO IP调试问题记录(ready信号不拉高情况)
  • CentOS上搭建 Python 运行环境并使用第三方库
  • 【运维】还原 Docker 启动命令的利器:runlike 与 docker-autocompose
  • 数据结构---单链表的增删查改
  • Uniapp:设置页面下拉刷新
  • 1.1 点云数据获取方式——引言
  • Weka通过10天的内存指标数据计算内存指标动态阈值
  • 判断子序列
  • 问答:C++如何通过自定义实现移动构造函数和移动赋值运算符来实现rust的唯一所有权?
  • AI Agent开源技术栈
  • RabbitMQ 启动报错 “crypto.app“ 的解决方法
  • 项目三 - 任务2:创建笔记本电脑类(一爹多叔)
  • MySQL--数据引擎详解
  • gem5-gpu 安装过程碰到的问题记录 关于使用 Ruby + Garnet
  • Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态
  • 当 AI 成为 “数字新物种”:人类职业的重构与进化
  • python:sklearn 决策树(Decision Tree)
  • 从 0 到 1:ComfyUI AI 工作流抠图构建全实践
  • Linux[配置vim]
  • 通信设备制造数字化转型中的创新模式与实践探索
  • 首页数据展示
  • 并发设计模式实战系列(9):消息传递(Message Passing)