Jenkins升级后JobDSL脚本抛出ClassCastException问题求助
Jenkins升级后JobDSL脚本ClassCastException问题排查建议
问题背景
- 升级前环境:Jenkins 2.289.3 + JobDSL v1.77
- 升级后环境:Jenkins 2.346.3 + JobDSL v1.81(同步更新所有插件)
- 问题现象:运行前同事编写的JobDSL脚本创建文件夹及下属任务时失败,抛出如下ClassCastException:
java.lang.ClassCastException: class org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject cannot be cast to class hudson.model.Job (org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject is in unnamed module of loader jenkins.util.AntClassLoader @2cd50a1b; hudson.model.Job is in unnamed module of loader org.eclipse.jetty.webapp.WebAppClassLoader @672872e1) at com.atlassian.bitbucket.jenkins.internal.trigger.BitbucketWebhookTriggerImpl.start(BitbucketWebhookTriggerImpl.java:47) at com.cloudbees.hudson.plugins.folder.computed.ComputedFolder.init(ComputedFolder.java:199) at com.cloudbees.hudson.plugins.folder.AbstractFolder.onLoad(AbstractFolder.java:545) at com.cloudbees.hudson.plugins.folder.computed.ComputedFolder.onLoad(ComputedFolder.java:221) at jenkins.branch.MultiBranchProject.onLoad(MultiBranchProject.java:179) at org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject.onLoad(WorkflowMultiBranchProject.java:84) at hudson.model.AbstractItem$1.call(AbstractItem.java:904) at hudson.model.AbstractItem$1.call(AbstractItem.java:902) at hudson.model.Items.whileUpdatingByXml(Items.java:132) at hudson.model.AbstractItem.updateByXml(AbstractItem.java:902) at javaposse.jobdsl.plugin.JenkinsJobManagement.updateExistingItem(JenkinsJobManagement.java:482) at javaposse.jobdsl.plugin.JenkinsJobManagement.createOrUpdateConfig(JenkinsJobManagement.java:169) at javaposse.jobdsl.dsl.JobManagement$createOrUpdateConfig$2.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at javaposse.jobdsl.dsl.JobManagement$createOrUpdateConfig$2.call(Unknown Source) at javaposse.jobdsl.plugin.InterruptibleJobManagement.createOrUpdateConfig(InterruptibleJobManagement.groovy:35) at javaposse.jobdsl.dsl.JobManagement$createOrUpdateConfig$2.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at javaposse.jobdsl.dsl.JobManagement$createOrUpdateConfig$2.call(Unknown Source) at javaposse.jobdsl.dsl.AbstractDslScriptLoader$_extractGeneratedJobs_closure4.doCall(AbstractDslScriptLoader.groovy:204) at jdk.internal.reflect.GeneratedMethodAccessor385.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:264) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034) at groovy.lang.Closure.call(Closure.java:420) at groovy.lang.Closure.call(Closure.java:436) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2125) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2110) at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2151) at org.codehaus.groovy.runtime.dgm$163.invoke(Unknown Source)
核心问题分析
从异常栈可以看出,WorkflowMultiBranchProject被强制转换为hudson.model.Job失败,且两个类来自不同的类加载器,这说明是类加载隔离或插件兼容性问题,大概率和Bitbucket插件、多分支流水线插件的版本匹配有关。
调试与解决步骤
- 检查Bitbucket插件兼容性:异常触发点在
BitbucketWebhookTriggerImpl.start(),说明Bitbucket插件和升级后的Jenkins/多分支流水线插件不兼容。进入Jenkins插件管理页面查看Bitbucket插件版本,确保其适配Jenkins 2.346.3,建议升级到最新兼容版本。 - 验证多分支流水线插件版本:
WorkflowMultiBranchProject属于流水线多分支插件,确认该插件版本与Jenkins核心、JobDSL版本匹配。可尝试重新安装该插件,清理插件缓存后重启Jenkins。 - 排查JobDSL脚本中的多分支任务定义:
- 检查脚本中创建多分支任务的代码,是否使用了过时API。对比升级后的JobDSL API文档,替换为当前支持的写法。
- 简化脚本,只保留创建基础多分支任务的代码,验证是否能成功运行,逐步排查脚本中导致问题的部分。
- 排查类加载器冲突:
- 进入Jenkins的
Manage Jenkins > Script Console,执行以下脚本查看类加载情况:println "WorkflowMultiBranchProject loader: " + org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject.class.classLoader println "Job loader: " + hudson.model.Job.class.classLoader - 如果两个类加载器不同,清理Jenkins
plugins/目录下的旧插件残留(如已卸载插件的jar包),然后重启Jenkins。
- 进入Jenkins的
- 重新生成任务配置:删除现有出错的文件夹和任务,用JobDSL脚本重新创建,避免旧配置文件与新版本插件的兼容性冲突。
- 查看系统日志:进入
Manage Jenkins > System Log查看更详细的错误日志,寻找插件初始化失败、类加载异常的前置信息,辅助定位具体冲突插件。
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

