Groovy трубопровод Дженкинса @NonCPSвернуть не ожидал результатов - PullRequest
0 голосов
/ 15 апреля 2019

В моем коде у меня есть метод, который анализирует файл журнала и возвращает список результатов.Без NonCPS он работает идеально и возвращает правильные значения.Этот метод вызывается со стадии конвейера, и я получил java.io.NotSerializableException: java.util.regex.Matcher, поэтому я добавил аннотацию @NonCPS.Исключение больше не генерируется, но метод log_parser не работает хорошо.Теперь он всегда возвращает весь файл - даже если удалить, вернуть 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 Ответ

2 голосов
/ 15 апреля 2019

Поскольку конвейер сериализует все переменные (включая локальную переменную внутри функции) в качестве поведения по умолчанию, но 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,мы не можем назвать какой-либо другой шаг конвейера , поэтому вы должны переместиться readFile из log_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
}
...