Jenkins管道在非CPS方法中抛出java.io.NotSerializableException:org.jenkinsci.plugins.workflow.job.WorkflowJob
我试图在@NonCPS方法中获取另一个作业的数据。即使失败的方法被声明为@NonCPS,它也会以Jenkins管道在非CPS方法中抛出java.io.NotSerializableException:org.jenkinsci.plugins.workflow.job.WorkflowJob,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我试图在@NonCPS方法中获取另一个作业的数据。即使失败的方法被声明为@NonCPS,它也会以NotSerializableException失败 脚本如下所示-它仅尝试使用另一个作业的名称和内部版本号获取其数据: #!groovy import jenkins.model.Jenkins node('build_agent') { wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'xterm']) { stag
NotSerializableException
失败
脚本如下所示-它仅尝试使用另一个作业的名称和内部版本号获取其数据:
#!groovy
import jenkins.model.Jenkins
node('build_agent') {
wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'xterm']) {
stage('Get job details') {
name = "another_jenkins_job"
job = Hudson.instance.getJob(name)
job_data = Jenkins.instance.getItemByFullName(job.fullName)
jobNumber = "1234"
println 'Job: ' + job.fullName
getUpstreamJobData(job.fullName.trim(), buildNumber.trim())
}
}
@NonCPS
def getUpstreamJobData(jobName, jobNumber) {
println "Getting build #${jobNumber} from job ${jobName}"
Jenkins.getInstance().getItemByFullName(jobName).getBuildByNumber(jobNumber)
}
但是,脚本在@NonCPS方法中失败getUpstreamJobData
:
[Pipeline] echo
Job: another_jenkins_job
[Pipeline] echo
Getting build #1234 from job another_jenkins_job
[Pipeline] echo
Getting build #1234 from job another_jenkins_job
[Pipeline] echo
Getting build #1234 from job another_jenkins_job
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // wrap
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
an exception which occurred:
in field delegate
in field closures
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@1f5bb62e
Caused: java.io.NotSerializableException: org.jenkinsci.plugins.workflow.job.WorkflowJob
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
...
我的理解是,这种失败通常发生在我们在非CPS方法之外返回一个不可序列化的对象时。但是,这里的方法还没有返回任何内容,它声明为NonCPS。此外,print语句似乎表明该方法执行了3次,而只调用了一次。那么,代码的哪一部分是不可序列化的? 为什么您认为异常是从@noncp方法抛出的 我觉得那两个人看起来很可疑
job = Hudson.instance.getJob(name)
job_data = Jenkins.instance.getItemByFullName(job.fullName)
那么,代码的哪一部分是不可序列化的? 为什么您认为异常是从@noncp方法抛出的 我觉得那两个人看起来很可疑
job = Hudson.instance.getJob(name)
job_data = Jenkins.instance.getItemByFullName(job.fullName)
我也有同样的问题,因为
@NonCPS
方法中的一个赋值前面缺少def
。
看起来,每个分配都必须以def作为前缀,否则作业会按预期工作,但在尝试保存完成的构建状态时最终失败。我遇到了同样的问题,因为在
@NonCPS
方法中的一个分配前面缺少def
。
看起来,每个赋值都必须以def作为前缀,否则作业将按预期工作,但在试图保存完成的构建状态时最终失败。Groovy将返回最后一条语句。或者将方法声明为
void
,而不是def
。或者使用return
作为方法的最后一条语句。@daggett谢谢。我试过了,但是结果是一样的。如果我添加一个return
语句,或者如果我返回一个伪值,例如return0
,脚本将失败,Groovy将返回最后一条语句。或者将方法声明为void
,而不是def
。或者使用return
作为方法的最后一条语句。@daggett谢谢。我试过了,但是结果是一样的。如果我添加一个return
语句,或者如果我返回一个伪值,例如return0
,脚本将同样失败