Jenkins groovy正则表达式匹配字符串:错误:java.io.NotSerializableException:java.util.regex.Matcher。

10

我正在尝试从groovy中的正则表达式中获取匹配的字符串。匹配的字符串可以顺利地打印到控制台上,但是当我尝试在git命令中使用匹配的字符串时,会出现以下错误:

Err: Incremental Build failed with Error: java.io.NotSerializableException: java.util.regex.Matcher

以下是代码:

                def binaryName = "298_application_V2_00_Build_07.hex"

                def matches = (binaryName =~ /(V)(\d+)(_)(\d+)(_)(Build)(_)(\d+)/)
                versionTag = ""+matches[0].getAt(0)                 
                echo "${matches}"
                echo "$versionTag"
                bat("git tag $versionTag")
                bat("git push origin --tags")

如何从正则表达式中获取匹配的字符串?

2个回答

17

这个问题是由Jenkins的 CPS 引起的,该插件将所有流水线执行序列化以存储为可恢复状态。

调用不可序列化方法的方法必须用 @NonCPS 注释进行包装:

@NonCPS
String getVersion(String binaryName) {
  def matches = (binaryName =~ /(V)(\d+)(_)(\d+)(_)(Build)(_)(\d+)/)
  versionTag = ""+matches[0].getAt(0)
  versionTag
}

现在可以从您的流水线中调用此方法。如果您的Jenkins主服务器在执行此方法期间重新启动,它将完全运行-这在许多情况下(例如您的情况)绝对没有问题。


3
非常感谢,我已经为此苦苦挣扎了几个小时了。一个人应该如何知道这个呢:\ - Yngvar Kristiansen

1

在我的声明性流水线库中,NonCPS注释没有任何作用。解决方法是避免像这个示例一样返回匹配器:

version = ("release/1.0.0" =~ /(?:release|hotfix)\/(.*)/)[0][1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接