Gerrit 批量+1 Add Reviewer
目录
很高兴能帮你解决问题!这段经历非常典型,涵盖了 Gerrit 命令行操作、SSH 交互机制以及 Shell 脚本编程的几个核心坑点。
以下是整个过程的复盘与技术总结,方便你日后查阅:
🚀 最终可运行的完整命令
username 替换自己的用户名,需要ssh提交公钥
提议通过下面查看是否可以
| |
最终命令
| |
💡 遇到的坑与解决方案 (Technical Retrospective)
我们在调试过程中解决了以下三个主要技术障碍:
1. 查询语法的参数冲突
- 问题:使用
-label:Code-Review<=-1时报错fatal: is not a valid option。 - 原因:SSH 远程执行命令时,会将以
-开头的字符串误判为命令行选项(Options),而不是查询语句。 - ✅ 解决:将
-替换为大写的NOT关键字(Gerrit 查询语言支持),避免歧义。
2. Gerrit 版本兼容性与 ID 定位
- 问题:
- Gerrit v2.16 的
gerrit review命令不支持同时加 Reviewer (--reviewer参数无效)。 - 使用数字 ID (如
83376) 或ID,PatchSet格式时,报no such change/patch set。
- Gerrit v2.16 的
- 原因:旧版本 API 限制;且数字 ID 在某些情况下无法精准映射到当前的 Patch Set。
- ✅ 解决:
- 拆分动作:将操作拆分为
gerrit review(打分) 和gerrit set-reviewers(加人)。 - 精准定位:打分时使用 Commit SHA(物理唯一),加人时使用 Change-Id(逻辑唯一)。
- 拆分动作:将操作拆分为
3. SSH 吞噬标准输入 (The SSH Loop Trap)
- 问题:脚本只处理了列表中的第一条记录就停止了。
- 原因:在
while循环内部执行ssh时,SSH 默认会读取所有的 Standard Input (stdin)。这意味着循环里的第一个ssh把管道里剩下的 Change 列表全“吃”光了,导致while循环以为没有数据了。 - ✅ 解决:给循环内部的
ssh命令添加-n参数。这告诉 SSH:“不要读取标准输入,只管执行命令”。这样 stdin 里的数据就能保留给while循环继续读取。
4. 数据解析部分 (| jq ...):
- 问题:
jq -r 'select(.number) | .number':gerrit query最后会输出一行统计信息(stats),这行没有number字段。这段代码会过滤掉统计行,只提取出变更编号 (Change Number)。- 注意:如果没有安装
jq,你需要先安装它 (如sudo apt-get install jq或brew install jq),或者使用复杂的 grep/awk 替换。
📚 核心逻辑流程图
- Query: 筛选出 Owner 是你、Open 状态、且没有负分的提交。
- 参数
--current-patch-set拿到了关键的 Commit SHA。
- 参数
- Parse (jq): 提取出每一行的
Change-Id(Ixxxx…) 和Commit SHA(9e36…)。 - Loop:
- Step A:
ssh -n ... review-> 针对 SHA 打 +1。 - Step B:
ssh -n ... set-reviewers-> 针对 Change-Id 加人。
- Step A:
这条命令现在非常健壮,即使以后你要批量操作几百个提交,它也能稳定运行!