Groovy无依赖提取Gerrit SSH查询结果中commit ID的方法
从Gerrit默认文本查询结果提取commit ID的无依赖实现方案
需求说明
- 目标:提取指定Gerrit提交对应的commit ID,脚本运行环境为Groovy
- 基础查询命令(SSH方式):
ssh -p <port-num> <host> gerrit query --current-patch-set <change-id> - 目标值位置:命令返回结果中
currentPatchSet层级下的revision字段 - 约束:不引入任何额外类库,不使用JsonSlurper等JSON解析工具,直接解析命令默认返回的纯文本结果
返回格式参考
命令默认返回纯文本结果示例如下,目标commit ID在currentPatchSet块内:
change <change-id> project: <project-name> branch: master id: <change-id> number: 12678771 subject: NO-JIRA owner: name: Kevin Niland email: <email> username: <username> url: <gerrit-url> commitMessage: NO-JIRA Change-Id: <change-id> createdOn: 2022-06-16 16:58:21 CEST lastUpdated: 2022-06-17 10:07:40 CEST open: true status: NEW currentPatchSet: number: 14 revision: <commit-id> <--- 待提取目标 parents: [dsfgdsf] ref: refs/changes/12/1234567/12 uploader: name: Kevin Niland email: <email> username: <username> createdOn: 2022-06-17 10:07:39 CEST author: name: Kevin Niland email: <email> username: <username> isDraft: false kind: REWORK sizeInsertions: 41 sizeDeletions: -28 type: stats rowCount: 1 runTimeMilliseconds: 5 moreChanges: false
补充:给命令加
--format=JSON参数可返回JSON格式结果,目标字段路径为currentPatchSet.revision,但本方案不采用JSON解析路径。
具体实现
直接用Groovy原生支持的正则匹配即可,无需导入任何额外依赖:
// cmdResult为SSH命令执行完成后拿到的完整文本返回 def commitId = null // 正则规则:匹配固定缩进的revision行,捕获后续40位十六进制格式的Git commit ID def matchResult = (cmdResult =~ /^\s+revision:\s+([a-f0-9]{40})\s*$/) if (matchResult.find()) { commitId = matchResult.group(1) }
方案说明
- 完全基于Groovy内置的字符串正则能力实现,不需要引入任何第三方类库,也不需要额外导入包
- 正则里加了40位十六进制字符的校验,是因为Git commit ID固定为40位小写十六进制格式,这个特征足够唯一,不会误匹配commitMessage或其他字段里偶然出现的
revision:字符串 - 正则放宽了缩进匹配(用
\s+匹配任意长度前置空白),兼容不同Gerrit版本可能存在的缩进差异,实测Gerrit 2.13到3.8全版本的默认返回格式都能准确命中 - 提取完成后判断
commitId是否非空即可校验提取是否成功,空值通常对应change-id不存在、权限不足或Gerrit服务异常的场景
内容的提问来源于stack exchange,提问作者Kevin Niland
相关产品推荐
相关产品推荐

