我正在尝试在@NonCPS方法中获取另一个作业的数据。即使失败的方法被声明为@NonCPS,它也以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)
...
我的理解是,当我们在Non-CPS方法之外返回不可序列化的对象时,通常会发生这种故障。但是,这里的方法尚未返回任何内容,并且已声明为NonCPS。另外,打印语句似乎表明该方法执行了3次,而只调用了一次。
答案 0 :(得分:0)
那么您代码的哪一部分不可序列化? 为什么您认为您的@NonSCP方法引发了异常?
我认为那两个看起来非常可疑
job = Hudson.instance.getJob(name)
job_data = Jenkins.instance.getItemByFullName(job.fullName)
答案 1 :(得分:0)
我遇到了同样的问题,因为在def
方法内的一个分配前面缺少@NonCPS
。
看来,每个分配都必须以def为前缀,否则job可以按预期工作,但是在尝试保存完成的构建状态时最终失败。