Jenkins Pipeline在NonCPS方法中引发java.io.NotSerializableException:org.jenkinsci.plugins.workflow.job.WorkflowJob

时间:2019-07-15 17:14:31

标签: jenkins groovy jenkins-pipeline

我正在尝试在@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次,而只调用了一次。

2 个答案:

答案 0 :(得分:0)

那么您代码的哪一部分不可序列化? 为什么您认为您的@NonSCP方法引发了异常?

我认为那两个看起来非常可疑

job = Hudson.instance.getJob(name)
job_data = Jenkins.instance.getItemByFullName(job.fullName)

答案 1 :(得分:0)

我遇到了同样的问题,因为在def方法内的一个分配前面缺少@NonCPS。 看来,每个分配都必须以def为前缀,否则job可以按预期工作,但是在尝试保存完成的构建状态时最终失败。