Конвейер Jenkins, свойство @Lazy объекта имеет значение NULL при первом вызове

@Lazy, похоже, не возвращает значение при первом вызове в конвейере Jenkins. Есть идеи, почему?

Код:

class JenkinsStatus implements Serializable {
    def pipeline

    @Lazy String author = {
        this.pipeline.echo "Call to Author"
        def commit = this.pipeline.sh(returnStdout: true, script: 'git rev-parse HEAD')
        def a = this.pipeline.sh(returnStdout: true, script: "git --no-pager show -s --format='%an' ${commit}").trim()
        this.pipeline.echo("inside Author is: ${a}")
        a
    }()
}

pipeline {
    agent any
    stages {
        stage( "Checkout repo") {
            steps {
                // SCM checkout() here.
            }
        }
    }
    post {
        always {
            script {
                JenkinsStatus jstatus = [
                    pipeline: this
                ]

                echo "Author1: ${jstatus.author}"
                echo "Author2: ${jstatus.author}"
            }
        }
    }
}

Когда я запускаю конвейер, я получаю следующие результаты:

Call to Author
[Pipeline] sh
+ git rev-parse HEAD
[Pipeline] sh
+ git --no-pager show -s --format=%an 9242efd51b83b4202863a04ac0b3c45c256a3948
[Pipeline] echo
inside Author is: <edit out>
[Pipeline] echo
Author1: null
[Pipeline] echo
Author2: <edit out>

Вы можете ясно видеть, что a определено. Это возвращение. Но JenkinsStatus.author на самом деле не применяется до второго вызова.


person guice    schedule 01.03.2019    source источник


Ответы (1)


Преобразование Jenkins CPS делает забавные вещи с аннотациями Groovy. Мне никогда не удавалось заставить @Lazy работать с полями в классах общей библиотеки. @Singleton работает, если у вас есть только один класс с ним за все время выполнения, но терпит неудачу всякий раз, когда вы добавляете второй. @Delegate вообще не работает.


FWIW, это принятый ответ (мой) на очень похожий вопрос: https://stackoverflow.com/a/54590943/6498020

Это известная проблема Jenkins: JENKINS-45901

Это было открыто с августа 2017 года. Похоже, это не будет исправлено в ближайшее время:

Не уверен, что есть какое-то конкретное место, где поддержка языка Groovy (или ее отсутствие) исчерпывающе задокументирована, но в любом случае я не ожидаю, что эта проблема или что-то подобное будет решена. В дальнейшем основное внимание уделяется разрешению выполнения внешних процессов, а не трате времени на механизм CPS, за исключением случаев уязвимостей безопасности или серьезных регрессий.

person willyjoker    schedule 15.04.2019