@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 调用才真正应用。
答案 0 :(得分:0)
Jenkins CPS转换通过Groovy注释完成有趣的事情。我从未能够使用@Lazy
处理共享库类中的字段。如果您在整个运行时中只有一个类,则@Singleton
可以工作,但是每次添加第二个类都会失败。 @Delegate
根本不起作用。
FWIW,这是我的一个非常相似的问题的答案:https://stackoverflow.com/a/54590943/6498020
这是詹金斯的一个已知问题:JENKINS-45901
此服务自2017年8月开始开放。看来它不会很快得到修复:
不确定是否有详尽的文档记录了Groovy语言支持(或缺乏它),但是无论如何我都不希望这个问题或类似的东西得到解决。今后的工作重点是允许外部流程执行,而不是在安全漏洞或严重回归的情况下在CPS引擎上浪费更多时间。