代码之家  ›  专栏  ›  技术社区  ›  Jaime Alcántara Arnela

Jenkinsfile中的NotSerializableException

  •  3
  • Jaime Alcántara Arnela  · 技术社区  · 6 年前

    我正在处理一个jenkinsfile,我在第三阶段得到并异常:

    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 回复  |  直到 6 年前
        1
  •  4
  •   mkobit    6 年前

    你的问题是这一行:

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

    这个 =~ Groovy find operator . 它返回一个 java.util.regex.Matcher 实例,它不是 Serializable . 如果jenkins决定在您将结果存储到由jenkins序列化的局部变量中之后暂停您的脚本,则在您获得异常时。通过立即添加 sleep(1) 在调用之后执行步骤,并观察是否引发了相同的异常。

    要解决此问题,您应该: