I am trying out an approach in which the caller receives a closure as a 
return value from a function so that the context can be preserved for 
further call chaining. I tried the below as a test and it didn't work:

def prep() {
    return [run: {-> echo "Hello Closure"}]
}

pipeline {
    agent "any"

    stages {
        stage("Init") {
            steps {
                script {
                    p = prep()
                    p.run()
                }
            }
        }
    }
}


The error I see in the console log is:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No 
signature of method: java.util.LinkedHashMap.run() is applicable for argument 
types: () values: []
Possible solutions: min(groovy.lang.Closure), put(java.lang.Object, 
java.lang.Object), put(java.lang.Object, java.lang.Object), find(), any(), 
grep()
        at 
org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:131)
        at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:155)
        at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:159)
        at 
com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:17)
        at WorkflowScript.run(WorkflowScript:14)
        at ___cps.transform___(Native Method)

...

When I tried to return the closure directly instead of a map it worked fine:

def prep() {
    return {-> echo "Hello Closure"}
...
                    p = prep()
...


Also, if I extract the map element first, it works fine (when I called the 
local variable as run, I got the script security error: Scripts not 
permitted to use method java.lang.Runnable run):

                    p = prep()
                    r = p.run
                    r()

And this works too:

                    p = prep()
                    p["run"]()


but this is not elegant. Is this a bug or expected behavior? The below 
equivalent worked fine in script console:

def prep() {
    return [run: {-> print("Hello Closure")}]
}

prep().run()


-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/f26114e0-6340-4379-8d45-bc9b6980f20d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to