Gerrit 批量+1 Add Reviewer

很高兴能帮你解决问题!这段经历非常典型,涵盖了 Gerrit 命令行操作SSH 交互机制以及 Shell 脚本编程的几个核心坑点。

以下是整个过程的复盘与技术总结,方便你日后查阅:

🚀 最终可运行的完整命令

username 替换自己的用户名,需要ssh提交公钥

提议通过下面查看是否可以

1
ssh -p 29418 username@172.17.2.20 gerrit query "owner:self status:open" --format=JSON

最终命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ssh -p 29418 username@172.17.2.20 gerrit query \
  "owner:self status:open NOT label:Code-Review<=-1" \
  --current-patch-set --format=JSON \
| jq -r 'select(.currentPatchSet) | "\(.id) \(.currentPatchSet.revision)"' \
| while read -r changeId commitSha; do
    echo "正在处理: $changeId"
    
    # 1. 打分 (使用 Commit SHA 确保唯一定位)
    ssh -n -p 29418 username@172.17.2.20 gerrit review --code-review +1 "$commitSha"
    
    # 2. 加人 (使用 Change-Id 确保兼容性)
    ssh -n -p 29418 username@172.17.2.20 gerrit set-reviewers \
      -a xxx@AAA.com \
      -a yyy@AAA.com \
      -a zzz@AAA.com \
      "$changeId"
done

💡 遇到的坑与解决方案 (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
  • 原因:旧版本 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 jqbrew install jq),或者使用复杂的 grep/awk 替换。

📚 核心逻辑流程图

  1. Query: 筛选出 Owner 是你、Open 状态、且没有负分的提交。
    • 参数 --current-patch-set 拿到了关键的 Commit SHA。
  2. Parse (jq): 提取出每一行的 Change-Id (Ixxxx…) 和 Commit SHA (9e36…)。
  3. Loop:
    • Step A: ssh -n ... review -> 针对 SHA 打 +1。
    • Step B: ssh -n ... set-reviewers -> 针对 Change-Id 加人。

这条命令现在非常健壮,即使以后你要批量操作几百个提交,它也能稳定运行!

0%