Groovy Jenkins管道@NonCPSreturn未预期结果

时间:2019-04-15 07:17:42

标签: jenkins groovy jenkins-pipeline

在我的代码中,我有一个解析日志文件并返回结果列表的方法。没有NonCPS,它可以完美工作并返回正确的值。从管道阶段调用此方法,并且得到了java.io.NotSerializableException:java.util.regex.Matcher,这就是为什么我放置@NonCPS批注的原因。不再抛出异常,但是log_parser方法不能正常工作。现在,它总是返回整个文件-即使删除return result_list。调用此方法的结果始终是文件。

    @NonCPS
    def log_parser(String filename){
    def result_list = []
    def match_f, match_s
    def lines = readFile(filename).readLines()

    for( line in lines ) {
        match_f = (line =~ /(?<=Failures: )[^ ]+/ )
        match_s = (line =~ /(?<=Skips: )[^ ]+/ )

        if( match_f ) {
            result_list[1] = (match_f[0]).replace(",", "") }
        if( match_s ) {
            result_list[2] = (match_s[0]).replace(",", "") }
    }
    return result_list
    }

1 个答案:

答案 0 :(得分:2)

因为管道会将所有变量(包括函数内部的局部变量)序列化为默认行为,但是java.util.regex.Matcher不可序列化,这就是为什么会出错的原因。

选项1)一旦使用完毕,立即释放不可序列化的变量。

def log_parser(String filename){
    def result_list = []
    def match_f, match_s
    def lines = readFile(filename).readLines()

    for( line in lines ) {
        match_f = (line =~ /(?<=Failures: )[^ ]+/ )
        match_s = (line =~ /(?<=Skips: )[^ ]+/ )

        if( match_f ) {
            result_list[1] = (match_f[0]).replace(",", "")
            match_f = null
        }
        if( match_s ) {
            result_list[2] = (match_s[0]).replace(",", "")
            match_s = null 
        }
    }
    return result_list
}

选项2)将不可序列化的变量移动到带有注释的函数中:@NonCPS在@NonCPS函数内部,我们不能调用任何其他管道步骤,因此,您应该将readFilelog_pareser()中移出

log_parser(readFile(<log file path>))

@NonCPS
def log_parser(String fileContent){
    def result_list = []
    def match_f, match_s
    def lines = fileContent.readLines()

    for( line in lines ) {
        match_f = (line =~ /(?<=Failures: )[^ ]+/ )
        match_s = (line =~ /(?<=Skips: )[^ ]+/ )

        if( match_f ) {
            result_list[1] = (match_f[0]).replace(",", "") }
        if( match_s ) {
            result_list[2] = (match_s[0]).replace(",", "") }
    }
    return result_list
}