Jenkins管道,对象的@Lazy属性在首次调用时为NULL

时间:2019-03-01 21:43:10

标签: jenkins groovy jenkins-pipeline jenkins-groovy

@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直到 second 调用才真正应用。

1 个答案:

答案 0 :(得分:0)

Jenkins CPS转换通过Groovy注释完成有趣的事情。我从未能够使用@Lazy处理共享库类中的字段。如果您在整个运行时中只有一个类,则@Singleton可以工作,但是每次添加第二个类都会失败。 @Delegate根本不起作用。


FWIW,这是我的一个非常相似的问题的答案:https://stackoverflow.com/a/54590943/6498020

  

这是詹金斯的一个已知问题:JENKINS-45901

     

此服务自2017年8月开始开放。看来它不会很快得到修复:

     
    

不确定是否有详尽的文档记录了Groovy语言支持(或缺乏它),但是无论如何我都不希望这个问题或类似的东西得到解决。今后的工作重点是允许外部流程执行,而不是在安全漏洞或严重回归的情况下在CPS引擎上浪费更多时间。