You are not doing anything wrong. CPS is just broken in this scenario. You cannot have both a field and a getter/setter at the same time with matching names - it gets confused and goes into infinite loop. Change 'this.foo' to 'this._foo' and it will start working (and you can still use "acme.foo" to call setter/getter versions. It is vert annoying and cost me days of scratching my head until I realized what was going on.
For what its worth, Groovy itself supports this, but something in CPS/Pipelines breaks that support. -M On Thursday, October 27, 2016 at 5:50:37 AM UTC-7, Rob Oxspring wrote: > > Hi, > > I've been trying to use a shared library script with properties according > to the following but am having no luck. > > https://github.com/jenkinsci/workflow-cps-global-lib-plugin/blob/master/README.md#defining-global-variables > > To reproduce I've installed a totally clean Jenkins LTS with recommend > plugins and added a $JENKINS_HOME/workflow-libs/vars/acme.groovy containing > > def setFoo(v) { > this.foo = v; > } > def getFoo() { > return this.foo; > } > def say(name) { > echo "Hello world, ${name}" > } > > > I have a Pipeline job configured with the following script: > > echo "myjob" > > acme.foo = "5"; > echo acme.foo; // print 5 > acme.say "Joe" // print "Hello world, Joe" > > > And when I run it I get the following result: > > [Pipeline] echo > myjob > [Pipeline] End of Pipeline > groovy.lang.MissingPropertyException: No such property: acme for class: > groovy.lang.Binding > at groovy.lang.Binding.getVariable(Binding.java:63) > at > org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224) > at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241) > at > org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238) > at > com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:24) > at > com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20) > at WorkflowScript.run(WorkflowScript:3) > at ___cps.transform___(Native Method) > at > com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74) > at > com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30) > at > com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at > com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) > at > com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21) > at com.cloudbees.groovy.cps.Next.step(Next.java:58) > at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154) > at > org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18) > at > org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:33) > at > org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:30) > at > org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) > at > org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:30) > at > org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:163) > at > org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:324) > at > org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:78) > at > org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:236) > at > org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:224) > at > org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:63) > at java.util.concurrent.FutureTask.run(Unknown Source) > at > hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) > at > jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) > at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) > at java.util.concurrent.FutureTask.run(Unknown Source) > at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) > at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) > at java.lang.Thread.run(Unknown Source) > Finished: FAILURE > > > I did wonder whether to "def foo" in order to create the property but that > just results in an infinite recursion as this.foo = v within setFoo() gets > interpreted as a recursive call to setFoo() itself. > > Any clues where I'm going wrong? > > Thanks, > > Rob > -- 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/c90ed2fe-0578-4a28-b747-577a387a556d%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
