-
Bug
-
Resolution: Fixed
-
Major
-
None
-
Jenkins 2.32.2
Issue
When SharedLibraries are defined at the folder level, pipeline script fails when instantiating a library object in some circumstances (scenario below).
It results in a *ClassCastException*:
Started by user admin Loading library jenkins-groovy-in-folder@zendesk/46810-simple > git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url https://github/myuser/shared-librairies.git # timeout=10 Fetching upstream changes from https://github/myuser/shared-librairies.git > git --version # timeout=10 using GIT_ASKPASS to set credentials myuser-up > git fetch --tags --progress https://github/myuser/shared-librairies.git +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/zendesk/46810-simple^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/zendesk/46810-simple^{commit} # timeout=10 Checking out Revision aa272aa786709d62813c65ae0b743899f0236c63 (refs/remotes/origin/zendesk/46810-simple) > git config core.sparsecheckout # timeout=10 > git checkout -f aa272aa786709d62813c65ae0b743899f0236c63 First time build. Skipping changelog. [Pipeline] node Running on master in /tmp/je-1-home/workspace/Folder/PipelineFromSCM [Pipeline] { [Pipeline] stage [Pipeline] { (Test) [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline hudson.remoting.ProxyException: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'com.dohbedoh.example.MyObject@67907171' with class 'com.dohbedoh.example.MyObject' to class 'com.dohbedoh.example.MyObject' at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:405) at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:319) at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:232) at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:603) at Unknown.Unknown(Unknown) at ___cps.transform___(Native Method) at com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.set(LocalVariableBlock.java:45) at com.cloudbees.groovy.cps.impl.AssignmentBlock$ContinuationImpl.assignAndDone(AssignmentBlock.java:70) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:76) 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(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) 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:74) 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:165) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:328) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:80) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:240) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:228) at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) at java.util.concurrent.FutureTask.run(FutureTask.java:266) 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(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Finished: FAILURE
Scneario:
Shared Library code
Object definition in `com.dohbedoh.example.MyObject`
package com.dohbedoh.example; public class MyObject implements Serializable { public MyObject(){ } }
Global variables: `vars/myobjects.groovy`
import groovy.transform.Field; import com.dohbedoh.example.MyObject; @Field final MyObject MY_OBJECT_1 = new MyObject(); @Field final MyObject MY_OBJECT_2 = new MyObject();
Jenkins: Add Shared Libraries to Folder
Jenkins: Pipeline Script
Here is the pipeline script:
@Library("jenkins-groovy-in-folder@zendesk/46810-simple") _ node { stage("Test"){ com.dohbedoh.example.MyObject testObject = myobjects.MY_OBJECT_1 } }
This results in the ClassCastException shown above.
Workaround
I tried with Modern/Legacy SCMs. Also tried with Multibranch project. I am always hitting the same exception.
- A workaround is to define the Shared Library globally under *Manage Jenkins > Configure System*.
- Another workaround is to use def testObject = myobjects.MY_OBJECT_1 instead of com.dohbedoh.example.MyObject testObject = myobjects.MY_OBJECT_1.