Jenkins Pipeline Groovy报错:No signature of method: java.lang.String.call()
Jenkins流水线脚本错误排查与解决
错误现象
执行流水线时循环能正常输出节点名,但进入node块执行shell命令时报错:
first database [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.lang.String.call() is applicable for argument types: (java.lang.String, org.jenkinsci.plugins.workflow.cps.CpsClosure2) values: [$node, org.jenkinsci.plugins.wor Possible solutions: wait(), any(), trim(), size(), next(), grep()
原问题脚本
node { properties([ parameters([ booleanParam(name: 'first database', defaultValue: false, description: '') , booleanParam(name: 'second database', defaultValue: false, description: '') , ]) ]) stage('Stash') { def list = [] if("${params['first database']}" == "true") { list.add("first database") } if("${params['second database']}" == "true") { list.add("second database") } list.each { node -> echo "$node" node('$node') { sh """ echo -e "Hostname:\t\t"`hostname`' """ } } } }
问题原因
- 变量名冲突:循环迭代变量命名为
node,和Jenkins流水线核心方法node()重名。Groovy在闭包内会优先引用这个字符串类型的迭代变量,导致你试图调用字符串的call()方法(即把字符串当函数用),从而抛出MissingMethodException。 - 变量解析错误:
node('$node')使用了单引号,Groovy单引号字符串不会解析变量,实际传递的是字面量$node而非变量对应的节点名。 - 布尔参数判断冗余:将布尔类型的参数转成字符串比较,写法不够简洁且容易出错。
修复后的脚本
node { properties([ parameters([ booleanParam(name: 'first database', defaultValue: false, description: ''), booleanParam(name: 'second database', defaultValue: false, description: '') ]) ]) stage('Stash') { def list = [] // 直接使用布尔参数判断,无需转字符串 if (params['first database']) { list.add("first database") } if (params['second database']) { list.add("second database") } // 重命名迭代变量,避免和node方法冲突 list.each { dbNode -> echo "$dbNode" // 使用双引号解析变量,或直接传递变量 node("$dbNode") { sh """ echo -e "Hostname:\t\t"`hostname` """ } } } }
关键修复点
- 将循环迭代变量从
node改为dbNode,避免与Jenkins的node()方法重名。 - 把
node('$node')改为node("$dbNode")(或直接node(dbNode)),确保变量被正确解析。 - 简化布尔参数的判断逻辑,直接使用
params['参数名']进行布尔判断。
内容的提问来源于stack exchange,提问作者user5820327
相关产品推荐
相关产品推荐

