Jenkins升级至2.387.3后流水线因hudson.util.Secret转换失败
问题
将Jenkins容器从2.375.4版本升级至2.387.3版本后,流水线执行失败。先后尝试安装全新的2.387.3版本容器、jenkins/jenkins:lts镜像容器、jenkins/jenkins:lts-jdk11镜像容器,但流水线仍反复出现如下错误:
Also: org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 9675d3f6-cd62-4305-b10a-12e8c5248c96 java.lang.ClassCastException: class java.lang.String cannot be cast to class hudson.util.Secret (java.lang.String is in module java.base of loader 'bootstrap'; hudson.util.Secret is in unnamed module of loader org.eclipse.jetty.webapp.WebAppClassLoader @4d5650ae) at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.convertExtraVars(AnsiblePlaybookStep.java:390) at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.run(AnsiblePlaybookStep.java:422) at org.jenkinsci.plugins.ansible.workflow.AnsiblePlaybookStep$AnsiblePlaybookExecution.run(AnsiblePlaybookStep.java:352) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47) at hudson.security.ACL.impersonate2(ACL.java:451) at hudson.security.ACL.impersonate(ACL.java:463) at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Finished: FAILURE
错误发生在从TFS构建服务器向测试实验室机器复制文件的阶段,此阶段执行的Ansible PowerShell脚本会从Jenkinsfile参数部分获取参数以拉取相关文件。
补充信息:
- 使用docker-compose安装Jenkins
- 首次启动时安装推荐插件
- 额外安装了Ansible和Blue Ocean插件
请问这是否为bug?是否存在绕过该问题的方案?
分析与解决方案
问题本质
这是Jenkins Ansible插件与新版本Jenkins核心的兼容性问题。convertExtraVars方法试图将String类型强制转换为hudson.util.Secret类型,通常是因为插件处理流水线参数时,敏感参数的类型逻辑未适配Jenkins 2.387.x LTS版本的核心变更。
绕过方案
降级Ansible插件版本
- 进入Jenkins插件管理页面,找到Ansible插件,降级到与Jenkins 2.387.3兼容的旧版本(如2.16或更早版本,可参考插件更新日志验证兼容性)。新版本插件可能引入了类型处理变更,与Jenkins核心的Secret类交互逻辑出错。
修改Jenkinsfile参数传递逻辑
- 若流水线中使用敏感参数(如令牌、密码)作为Ansible的extraVars,避免直接传递Secret对象,先转换为字符串:
// 错误示例:直接传递Secret对象 ansiblePlaybook( extraVars: [ tfs_token: credentials('tfs-secret-id') ] ) // 修改后:转换为字符串传递 ansiblePlaybook( extraVars: [ tfs_token: credentials('tfs-secret-id').toString() ] ) - 检查Jenkins参数配置,确认普通参数未被误标记为“密码”类型,避免不必要的Secret类型转换。
- 若流水线中使用敏感参数(如令牌、密码)作为Ansible的extraVars,避免直接传递Secret对象,先转换为字符串:
回退Jenkins核心版本
- 暂时回退到Jenkins 2.375.4版本,待Ansible插件发布兼容2.387.x的更新后再升级。使用docker-compose时,只需修改镜像标签为
jenkins/jenkins:2.375.4-lts,重启容器即可。
- 暂时回退到Jenkins 2.375.4版本,待Ansible插件发布兼容2.387.x的更新后再升级。使用docker-compose时,只需修改镜像标签为
排查插件依赖冲突
- 进入Jenkins插件管理的“依赖关系”页面,确认Ansible插件与Blue Ocean、流水线相关插件是否存在版本冲突,尝试更新或降级冲突的依赖插件。
是否为Bug
属于Ansible插件的兼容性Bug,核心原因是Jenkins核心对hudson.util.Secret类的使用逻辑变更后,插件未同步适配,导致类型转换错误。可向插件官方提交问题反馈。
内容的提问来源于stack exchange,提问作者Hiddai
相关产品推荐
相关产品推荐

