Jenkins Pipeline两参数相同时抛出异常失效求助
Jenkins流水线Map对比失效的排查修复方案
1. 先确认变量的类型与实际值
很多时候失效是因为变量类型不是预期的Map,或者值被意外修改。在判断逻辑前加日志打印:
echo "approvalMap1 类型: ${approvalMap1.getClass()}, 值: ${approvalMap1}" echo "approvalMap2 类型: ${approvalMap2.getClass()}, 值: ${approvalMap2}"
执行流水线后查看日志,确认两个变量都是Map类型且值符合预期。如果是String类型(比如参数配置错误,把Map写成了字符串),需要先解析成Map:
// 若参数是JSON字符串格式的Map,先解析 def approvalMap1 = new groovy.json.JsonSlurper().parseText(params.approvalMap1) def approvalMap2 = new groovy.json.JsonSlurper().parseText(params.approvalMap2)
2. 替换Map的equals对比逻辑
Jenkins流水线的CPS代理可能会影响原生Map的equals方法行为,改用JSON序列化对比更可靠:
import groovy.json.JsonBuilder def map1Json = new JsonBuilder(approvalMap1).toString() def map2Json = new JsonBuilder(approvalMap2).toString() if (map1Json == map2Json) { throw new Exception("Moratorium approvers are the same. Aborting deployment") }
这种方式会把Map转成标准JSON字符串,只要内容完全一致就会触发异常。
3. 转成普通HashMap再对比
如果不想用JSON,也可以把Jenkins的CpsHashMap转成普通Java HashMap,避免代理影响:
def map1 = new HashMap(approvalMap1) def map2 = new HashMap(approvalMap2) if (map1 == map2) { throw new Exception("Moratorium approvers are the same. Aborting deployment") }
4. 处理空值边界场景
如果存在其中一个Map为null或空Map的情况,需要单独判断:
def map1IsEmpty = approvalMap1 == null || approvalMap1.isEmpty() def map2IsEmpty = approvalMap2 == null || approvalMap2.isEmpty() if ((map1IsEmpty && map2IsEmpty) || (approvalMap1 != null && approvalMap2 != null && approvalMap1 == approvalMap2)) { throw new Exception("Moratorium approvers are the same. Aborting deployment") }
5. 检查参数配置与流水线流程
- 确认Jenkins流水线参数中,approvalMap1和approvalMap2的类型配置为Map,不是String或其他类型;
- 排查流水线中是否有其他步骤修改了这两个变量的值,导致对比时的内容和初始参数不一致。
内容的提问来源于stack exchange,提问作者Komal
相关产品推荐
相关产品推荐

