You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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`'

"""

             }
           
            }
       
    }
}

问题原因

  1. 变量名冲突:循环迭代变量命名为node,和Jenkins流水线核心方法node()重名。Groovy在闭包内会优先引用这个字符串类型的迭代变量,导致你试图调用字符串的call()方法(即把字符串当函数用),从而抛出MissingMethodException。
  2. 变量解析错误:node('$node')使用了单引号,Groovy单引号字符串不会解析变量,实际传递的是字面量$node而非变量对应的节点名。
  3. 布尔参数判断冗余:将布尔类型的参数转成字符串比较,写法不够简洁且容易出错。

修复后的脚本

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:57:10