Конвейер Дженкинса, свойство @Lazy для объекта равно NULL при первом вызове - PullRequest
0 голосов
/ 02 марта 2019

@ Похоже, что 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 фактически не применяется до второго вызова.

1 Ответ

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

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


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

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

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

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

...