Jenkinsfile中GStringImpl转java.lang.String失败致列表匹配异常求助
解决Jenkins流水线中GStringImpl与String类型匹配问题
我有一个接收persistent string类型参数的Jenkins流水线,需要检查参数值是否存在于指定列表中。但因为持久化字符串的类型是GStringImpl,而列表元素是java.lang.String类型,使用.contains()方法时,就算值相同也返回false,导致逻辑出错。我试过用toString()转换,但没起作用,代码和执行结果如下:
String ver = "" pipeline { agent { docker{ image 'registry/abc/builder:0.1.5' args '-t -d -v maven-m2-cache:/home/node/.m2' } } parameters { persistentString(name: 'Version', defaultValue: '8.4.7.8', description: 'Version to build', successfulOnly: false) } stages { stage('Analyze Parameter'){ steps{ script{ ver = "${Version}".toString() } } } stage('Build'){ steps{ script{ def version_list1 = ['8.4.7.8','8.3.7.9','8.5.4.7'] if (version_list1.contains("${ver}")){ println("build version branch") } else { println("${ver}") println("${ver}".getClass()) println(version_list1[0]) println(version_list1[0].getClass()) println("build master branch") } } } } } }
执行后始终进入else分支,输出如下:
8.4.7.8 class org.codehaus.groovy.runtime.GStringImpl 8.4.7.8 java.lang.String build master branch
问题根源
Groovy里用"${ver}"这种字符串插值语法返回的是GStringImpl对象,哪怕之前调用过.toString()转成String,后续再次用"${ver}"插值又会转回GStringImpl,这就是之前转换无效的原因。
解决方法
有三种可靠的处理方式:
直接强转参数为String,避免再次插值
获取参数时直接用as String强转成String类型,后续判断直接用变量名,不要加引号插值:stage('Analyze Parameter'){ steps{ script{ ver = Version as String // 强转成String类型 } } } // 后续判断直接用ver if (version_list1.contains(ver)){ println("build version branch") }统一列表元素类型
把列表里的String元素转为GString,不过这种方法不如第一种直观,仅作参考:def version_list1 = ['8.4.7.8','8.3.7.9','8.5.4.7'].collect { it as GString }用equals遍历判断
不想修改类型的话,也可以手动遍历列表,用==(Groovy中==等价于equals)比较:if (version_list1.any { it == ver }){ println("build version branch") }
修改后的完整代码示例
String ver = "" pipeline { agent { docker{ image 'registry/abc/builder:0.1.5' args '-t -d -v maven-m2-cache:/home/node/.m2' } } parameters { persistentString(name: 'Version', defaultValue: '8.4.7.8', description: 'Version to build', successfulOnly: false) } stages { stage('Analyze Parameter'){ steps{ script{ ver = Version as String // 强转成String类型 } } } stage('Build'){ steps{ script{ def version_list1 = ['8.4.7.8','8.3.7.9','8.5.4.7'] if (version_list1.contains(ver)){ println("build version branch") } else { println(ver) println(ver.getClass()) println(version_list1[0]) println(version_list1[0].getClass()) println("build master branch") } } } } } }
内容的提问来源于stack exchange,提问作者Roshan
相关产品推荐
相关产品推荐

