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

时间:2017-12-05 05:03:08

标签: java regex jenkins groovy jenkins-pipeline

我正试图从groovy中的正则表达式中获取匹配的字符串。匹配的字符串打印到控制台没有问题,但是当我尝试在git命令中使用匹配的字符串时,我收到以下错误:

                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")

以下是代码:

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
    string firstline= "will find the answer in Chapter #N.";
    if(firstline.find("#N") != string::npos)
        firstline.replace(firstline.find("#N"), string("#N").size(), to_string(5));
    cout<<firstline<<endl;
    // will find the answer in Chapter 5.
    return 0;
}

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

1 个答案:

答案 0 :(得分:8)

这个问题是由Jenkins'CPS引起的,它将所有管道执行序列化为可恢复状态。

对不可序列化方法的调用必须包含在使用@NonCPS注释的方法中:

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

现在可以从您的管道调用此方法。如果您的Jenkins主机在执行此方法期间重新启动,它将完全运行它 - 在许多情况下,例如您的,绝对没有问题。