I have been troubled by this for quite some time without finding out the 
reason.  I will describe a simple test case and will give the reasons for 
why I need to do it this way.  I would appreciate if all the good folks 
that spend their time to help others could just assume that the scenario is 
valid and not question it too long.

I have a shared library groovy called vars/testBuild.groovy as follow:

*import* org.slf4j.*

*def* call() {

       *final* Logger logger = LoggerFactory.*getLogger*
('org.biouno.unochoice.extra')

       *pipeline* {

              *agent* *any*

              *stages* {

                     *stage*('My stage') {

                           *steps* {

                                  *echo* "I ran"

                           }

                     }

              }

       }

}

 

I have a Jenkinsfile with the following content:

 

testBuild()

 

Jenkins has no issues building this and the echo step runs with no problem 
and outputs: I ran.

I need to move the pipeline for this case in a method called say 
myPipeline.  I need to do this because in my real life use case, I actually 
have a switch statement with several pipeline definitions in my call method 
and I have reached Jenkins CPS limitation of the size of the bytecode must 
not exceed 64K.  So I am left with the choice to define each of my pipeline 
in their own methods.  When I change the testBuild.groovy as follows:

 

*import* org.slf4j.*

*def* call() {

       *final* Logger logger = LoggerFactory.*getLogger*
('org.biouno.unochoice.extra')

       myPipeline()

}

*def* myPipeline() {

       *final* Logger logger = LoggerFactory.*getLogger*
('org.biouno.unochoice.extra')

       *pipeline* {

              *agent* *any*

              *stages* {

                     *stage*('My stage') {

                           *steps* {

                                  *echo* "I ran"

                           }

                     }

              }

       }

}

 

I get the following error from Jenkins:

 

hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No 
such property: any for class: testBuild

        at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)

        at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458)

        at 
com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:39)

        at 
com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)

        at testBuild.myPipeline(testBuild.groovy:9)

        at 
org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.call(ModelInterpreter.groovy:60)

        at testBuild.myPipeline(testBuild.groovy:8)

        at testBuild.call(testBuild.groovy:4)

        at WorkflowScript.run(WorkflowScript:1)

 

The other interesting fact is that when I change the pipeline as follow 
(with no additional method):

*import* org.slf4j.*

*def* call() {

       *final* Logger logger = LoggerFactory.*getLogger*
('org.biouno.unochoice.extra')

       *def* cl = {

              *agent* *any*

              *stages* {

                     *stage*('My stage') {

                           *steps* {

                                  *echo* "I ran"

                           }

                     }

              }

       }

       *pipeline* cl

}

 

I get the following similar result:
hudson.remoting.ProxyException: groovy.lang.MissingPropertyException: No 
such property: any for class: testBuild        at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
        
at 
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458)
        
at 
com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:39)
        
at 
com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
        
at testBuild.call(testBuild.groovy:5)        at 
org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter.call(ModelInterpreter.groovy:60)
        
at testBuild.call(testBuild.groovy:14)        at 
WorkflowScript.run(WorkflowScript:1) 

 

I know this is related to closures, delegates and DSL.  I tried to add the 
following two lines just before the pipeline cl call:

       cl.delegate = pipeline

       cl.resolveStrategy = Closure.*DELEGATE_FIRST*

 

and the error reports no property any for class 
org.jenkinsci.plugins.pipeline.modeldefinition.ModelInterpreter

Can anyone tell me how I can have the pipeline define in the method 
myPipeline?

-- 
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 jenkinsci-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/3de459f0-d82f-4cc5-af13-e88e602cbf54n%40googlegroups.com.

Reply via email to