首页 > 解决方案 > 如何确定 Jenkins Groovy 脚本的哪个参数需要 String 以及哪个 GString?

问题描述

我已经SomeClass用方法定义了一个类

class SomeClass implements Serializable {

    void someMethod(String var1, String var2, String... vars) {
        ...
    }
}

我在声明性管道中使用如下:

SomeClass instance = new SomeClass(this)

pipeline {

    environment {
        VAR1 = "var1"
        VAR2 = sh(returnStdout: true, script: "echo var2").trim()
        VAR3 = "var3"
    }

    stages {
        stage("Stage X") {
            steps {
                script {
                    instance.someMethod("${VAR1}", "${VAR2}", "${VAR3}")
                }
            }
        }
    }
}

由于失败

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.jenkinsci.plugins.docker.workflow.SomeClass.someMethod() is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl, org.codehaus.groovy.runtime.GStringImpl, org.codehaus.groovy.runtime.GStringImpl) values: [var1, var2, var3]

如果我将调用更改为instance.someMethod(VAR1.toString(), VAR2.toString(), VAR3.toString())它失败,因为

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.jenkinsci.plugins.docker.workflow.SomeClass.someMethod() is applicable for argument types: (java.lang.String, java.lang.String, java.lang.String) values: [var1, var2, var3]

Afaik 至少其中一个应该可以工作。我认为 Groovy 应该能够使两者都工作,但这是第二步。如何使用给定的参数调用该方法?

标签: jenkinsgroovyjenkins-pipelinejenkins-groovy

解决方案


您可以将脚本对象传递给该方法。您可以在此处此处找到信息。

打印变量下面的代码:

SomeClass instance = new SomeClass()

pipeline {
    agent any

    environment {
        VAR1 = "var1"
        VAR2 = sh(returnStdout: true, script: "echo var2").trim()
        VAR3 = "var3"
    }

    stages {
        stage("Stage X") {
            steps {
                script {
                    instance.someMethod(this, "${VAR1}", "${VAR2}", "${VAR3}")
                    //instance.someMethod("${VAR1}", "${VAR2}", "${VAR3}")
                }
            }
        }
    }
}

class SomeClass implements Serializable {
    void someMethod(def script, String var1, String var2, String... vars) {
        script.echo "someMethod: ${var1}"
    }
}

推荐阅读