Jenkins管道在非CPS方法中抛出java.io.NotSerializableException:org.jenkinsci.plugins.workflow.job.WorkflowJob

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

我试图在@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)
    ...

我的理解是,这种失败通常发生在我们在非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
,脚本将同样失败