当前位置: 首页 > 面试题库 >

jenkinsfile中的NotSerializableException

魏誉
2023-03-14
问题内容

我正在处理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
}

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


问题答案:

您的问题是这一行:

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

=~是Groovy的查找操作。它返回一个java.util.regex.Matcher实例,不是Serializable。如果Jenkins在将结果存储在本地变量中后决定将脚本存储在Jenkins序列化的本地变量中,即在您获取异常之后。通过sleep(1)在调用后立即添加一个步骤,并观察是否引发了相同的异常,可以轻松地测试这一点。

要解决此问题,您应该:

  • 不将java.util.regex.Matcher结果存储在CPS转换的代码中
  • 将用法移动到带@NonCPS注释的方法中,或使用匹配运算符(==~)返回一个boolean(如果适合您的用例)


 类似资料:
  • 问题内容: 在jenkinsfile,我已经通过指定的文件夹名 SparseCheckoutPaths 我想结帐。但是我却得到了整个分支结帐。 问题答案: 这是我自己的问题的答案。关于它如何工作的一些背景知识,有一个名为 sparsecheckout的 git客户端标志/配置,负责这种签出。此外,还需要一个 稀疏签出的 命名文件。 我的问题是 Jenkinsfile 的语法,正确的语法如下: 有关

  • 问题内容: 我想在我们的管道库中添加和功能。我在Jenkins 文档中找到了: 我不知道如何向包装库中添加包装器,如下所示: 我们的工作流程如下所示: 因此,我想将时间戳和ansi-colors添加到库中的每个函数中。当然,我可以通过包装每个函数来做到这一点 但是它有点愚蠢。 那么我可以轻松地包装管道或库吗? 问题答案: 解决您的问题的一种方法是使用全局变量()。 要创建自己的构建步骤,请添加以下

  • 我想准备两个作业在同一个jenkins服务器,将读取从一个特定的分支。我必须使用git标签为其中一个作业,以某种方式将它们分开。 拜托,你能用git标签在jenkins中粘贴一些包含作业触发器的代码吗?

  • 问题内容: 我正在尝试在Jenkinsfile中使用 通过SSH发布 插件。但是,我在方法中遇到了异常。这是我的代码: 如何摆脱异常? 问题答案: 这是因为某些变量不可序列化。 来自文件 由于管道必须在Jenkins重新启动后才能幸免,因此正在运行的程序的状态会定期保存到磁盘,以便以后可以恢复(保存在每个步骤之后或在步骤的中间进行,例如)。 您可以使用注释进行创建,使用

  • 我正在尝试在 Jenkinsfile 中使用 Publish over SSH 插件。但是,我在 方法中得到了异常 。这是我的代码: 我怎样才能消除异常?

  • 问题内容: 我正在docker容器内的GCE上运行jenkins实例,并希望从此Jenkinsfile和Github执行多分支管道。我正在为此使用GCE詹金斯教程。这是我的 我总是得到一个错误: 为了使docker在jenkins中工作,我需要更改什么? 问题答案: 看起来像DiD(Docker中的Docker),最近的一期杂志指出这是有问题的。 请参阅“ 在您的CI或测试环境中使用Docker-