java .io.NotSerializableException: java .time.format.DateTimeFormatter - PullRequest
0 голосов
/ 20 марта 2020

Я новичок в Дженкинс. Приведенные ниже коды предназначены для создания простой команды и передачи этой команды типа java.lang.String следующему заданию. Мой вопрос заключается в том, что обмен данными между этим Jenkins-конвейером и Jenkins-заданием 'email_job' содержит только строку (java.lang.String), которая должна быть сериализуемой. Однако этот скрипт выдает исключение java.io.NotSerializableException: java.time.format.DateTimeFormatter.

Если удалить шаг сборки из приведенного ниже сценария, этот Jenkins-конвейер работает нормально. Моя версия Дженкинса 2.138.4. Любые подсказки?

import java.net.URLEncoder
// Jenkins pipeline
pipeline {
    agent any
    stages {
        stage('main') {
            steps {
                println '------------------ main-stage ------------------'
                script {
                    def r_ptr = java.time.LocalDateTime.now()
                    def l_ptr = r_ptr.minusDays(14) as java.time.LocalDateTime
                    def fmt4time = 'yyyy-MM-dd HH:mm:ss'
                    def fmt2cnv = java.time.format.DateTimeFormatter.ofPattern(fmt4time)  // formatter for conversion
                    def l_str4tz = l_ptr.format(fmt2cnv)
                    def r_str4tz = r_ptr.format(fmt2cnv)
                    l_str4tz = '2020-02-18 00:00:00'
                    r_str4tz = '2020-03-18 00:00:00'
                    //
                    def ip4server = '127.0.0.1'
                    def qry_info = []
                    def __qry = ''
                    __qry = URLEncoder.encode(l_str4tz, 'UTF-8').replace('+', '%20')
                    __qry = "start_time=${__qry}"
                    qry_info.push(__qry)
                    __qry = URLEncoder.encode(r_str4tz, 'UTF-8').replace('+', '%20')
                    __qry = "end_time=${__qry}"
                    qry_info.push(__qry)
                    def qry_opts = qry_info.join('&')
                    def __cmd = ''
                    __cmd = "curl --get http://${ip4server}/dsb4bbu?" + qry_opts
                    build (
                        job: 'email_job',
                        parameters: [
                            string(name: 'param01', value: "11112222"),
                            string(name: 'cmd', value: "${__cmd}"),
                        ]
                    )
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 20 марта 2020

Конвейер ограничивает все переменные сериализуемыми типами (см. Рекомендации по масштабируемому коду конвейера ).

Я предлагаю извлечь код, который подготавливает параметры сборки, в функцию, помеченную @NonCPS (предотвратить преобразование CPS). Внутри этой функции вы не ограничены сериализуемыми переменными, но есть другое ограничение: вы не можете вызывать шаги конвейера и другие функции, у которых нет аннотации @NonCPS, за исключением некоторых простых, таких как echo (см. Метод конвейерной CPS не соответствует ).

Я думаю, что это также лучший стиль кода, чтобы иметь высокоуровневый код только внутри блока pipeline{} (принцип единого уровня абстракции).

import java.net.URLEncoder
// Jenkins pipeline
pipeline {
    agent any
    stages {
        stage('main') {
            steps {
                println '------------------ main-stage ------------------'
                script {
                    build (
                        job: 'email_job',
                        parameters: [
                            string(name: 'param01', value: "11112222"),
                            string(name: 'cmd', value: prepareCmd()),
                        ]
                    )
                }
            }
        }
    }
}

@NonCPS
String prepareCmd() {
    def r_ptr = java.time.LocalDateTime.now()
    def l_ptr = r_ptr.minusDays(14) as java.time.LocalDateTime
    def fmt4time = 'yyyy-MM-dd HH:mm:ss'
    def fmt2cnv = java.time.format.DateTimeFormatter.ofPattern(fmt4time)  // formatter for conversion
    def l_str4tz = l_ptr.format(fmt2cnv)
    def r_str4tz = r_ptr.format(fmt2cnv)
    l_str4tz = '2020-02-18 00:00:00'
    r_str4tz = '2020-03-18 00:00:00'
    //
    def ip4django = '127.0.0.1'
    def qry_info = []
    def __qry = ''
    __qry = URLEncoder.encode(l_str4tz, 'UTF-8').replace('+', '%20')
    __qry = "start_time=${__qry}"
    qry_info.push(__qry)
    __qry = URLEncoder.encode(r_str4tz, 'UTF-8').replace('+', '%20')
    __qry = "end_time=${__qry}"
    qry_info.push(__qry)
    def qry_opts = qry_info.join('&')
    return "curl --get http://${ip4server}/dsb4bbu?" + qry_opts
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...