jenkinsfile中的NotSerializableException

时间:2018-06-14 11:01:21

标签: jenkins groovy jenkins-pipeline

我正在研究一个jenkins文件,我在第三阶段得到了例外:

an exception which occurred:
in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@7bbae4fb
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.CaseEnv@6896a2e3
in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@605ccbbc
in field com.cloudbees.groovy.cps.impl.CallEnv.caller
in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@7b8ef914
in field com.cloudbees.groovy.cps.Continuable.e
in object org.jenkinsci.plugins.workflow.cps.SandboxContinuable@11e73f3c
in field org.jenkinsci.plugins.workflow.cps.CpsThread.program
in object org.jenkinsci.plugins.workflow.cps.CpsThread@b2df9bb
in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.threads
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@2b30596a
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@2b30596a
Caused: java.io.NotSerializableException: java.util.regex.Matcher
    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)

我一直在阅读它,我知道我无法创建不可序列化的变量。所以,我认为必须使用我的代码的这一部分:

def artifact_name = sh (
        script: "ls -b *.jar | head -1",
        returnStdout: true
).trim()
def has_snapshot = artifact_name =~ /-TEST\.jar/
if (has_snapshot) {
    //Do something
}

我的问题是,如何定义这两个变量以避免该异常?

1 个答案:

答案 0 :(得分:3)

你的问题就在这一行:

def has_snapshot = artifact_name =~ /-TEST\.jar/

=~Groovy find operator。它返回java.util.regex.Matcher个实例,该实例不是Serializable。如果Jenkins在将结果存储到由Jenkins序列化的本地变量(即获得异常时)后决定暂停脚本。这可以通过在调用后立即添加sleep(1)步骤来轻松测试,并观察引发相同的异常。

要解决此问题,您应该: