-
Bug
-
Resolution: Not A Defect
-
Major
-
None
I am instantiating an object from within my vars (custom step (testCredentials)) shared library. I then execute a method (getRequiredPackages) on this instance that contains withCredentials step. A groovy.lang.MissingPropertyException is thrown on the withCredentials variable (see stack trace below)
vars/testCredentials.groovy
#!/usr/bin/env groovy import com.mycorp.deployment.classes.Source def call(body) { def config = [:] body.resolveStrategy = Closure.DELEGATE_FIRST body.delegate = config body() def sourceVersion = config.version timestamps { node() { try { stage('Test Credentials') { Source buildToolsSource = new Source(steps, sourceVersion) buildToolsSource.getRequiredPackages(steps) } } catch (e) { steps.sh "echo 'Error (${e}) occurred marking the build as failure.'" throw e } finally { steps.cleanWs() } } } }
Groovy class
/src/com/mycorp/deployment/classes/Source.groovy
#!/usr/bin/env groovy package com.mycorp.deployment.classes import org.jenkinsci.plugins.workflow.cps.DSL class Source implements Serializable { String version Source(DSL steps, version) { this.version = version } def getRequiredPackages(DSL steps) { steps.withCredentials([steps.string(credentialsId: 'git-oauth-token', variable: 'GIT_OAUTH_TOKEN')]) { steps.sh(returnStdout: false, script: "curl -L " + "-H 'Authorization: token ${GIT_OAUTH_TOKEN}' " + "https://api.github.com/repos/mycorp/myrepo/zipball/${this.version} " + "-o _packages/myrepo-${this.version}.zip " + "-vvv" ) } } }
I'm getting the following run-time exception:
groovy.lang.MissingPropertyException: No such property: GIT_OAUTH_TOKEN for class: com.magento.deployment.classes.Source
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:34)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
Trying to access the variable via env (${env.GIT_OAUTH_TOKEN}) produces the following error:
groovy.lang.MissingPropertyException: No such property: env for class: com.magento.deployment.classes.SourceNew
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:34)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
at com.magento.deployment.classes.SourceNew.getRequiredPackages
Workaround
When I execute the same method from an inline script (rather than a object instance) it works fine. The following modified files works:
vars/testCredentials.groovy
#!/usr/bin/env groovy import com.mycorp.deployment.classes.Source import com.mycorp.deployment.scripts.Utility def call(body) { def config = [:] body.resolveStrategy = Closure.DELEGATE_FIRST body.delegate = config body() def sourceVersion = config.version timestamps { node() { try { stage('Test Credentials') { Source buildToolsSource = new Source(steps, sourceVersion) //buildToolsSource.getRequiredPackages(steps) new Utility().getRequiredPackages(steps, buildToolsSource) } } catch (e) { steps.sh "echo 'Error (${e}) occurred marking the build as failure.'" throw e } finally { steps.cleanWs() } } } }
Inline script
/src/com/mycorp/deployment/scripts/Utility.groovy
#!/usr/bin/env groovy package com.mycorp.deployment.scripts import org.jenkinsci.plugins.workflow.cps.DSL import com.mycorp.deployment.classes.Source def getRequiredPackages(DSL steps, Source) { steps.withCredentials([steps.string(credentialsId: 'git-oauth-token', variable: 'GIT_OAUTH_TOKEN')]) { steps.sh(returnStdout: false, script: "curl -L " + "-H 'Authorization: token ${GIT_OAUTH_TOKEN}' " + "https://api.github.com/repos/mycorp/myrepo/zipball/${source.version} " + "-o _packages/myrepo-${source.version}.zip " + "-vvv" ) } } return this
I am attempting to create an abstract class with implementation details that other classes can extend. It is not ideal to have to implement this type of logic (withCredentials) in a separate inline scripts to workaround this issue.
Tested with version:
jenkins 2.60.3
credentials binding plugin 1.13
credentials plugin 2.1.16