虽然我能够定义方法,但是到目前为止,使用Jenkins共享库定义变量似乎是一个未解决的任务。
我在这个身上添加了/vars/True.groovy
def call() {
return true
}
现在在Jenkinsfile中,我试图测试它是否按预期工作:
println "evaluation ${ true == True }"
但令人惊讶的是,它在考虑true != class True
时失败了。我的印象是true == True()
可能有效,但这不是重点,我需要一个真正的变量,因为整个目的是为了避免人们使用错误案例造成的一些错误。
那么魔术是什么?
答案 0 :(得分:2)
看起来vars
目录中定义的全局变量必须更低/驼峰/可能是其他一些特殊的外壳。 Defining global variables部分的任何地方都没有说明这一点,但顶部有此注释:
vars
目录托管定义可从Pipeline访问的全局变量的脚本。每个*.groovy
文件的基名应该是Groovy(~Java)标识符,通常为camelCased
。匹配的*.txt
(如果存在)可以包含文档,通过系统配置的标记格式化程序处理(因此可能真的是HTML,Markdown等,但需要txt
扩展名。)
以下是我的尝试:
vars/MyTrue.groovy
class MyTrue implements Serializable {
}
vars/myTrue.groovy
class myTrue implements Serializable {
}
vars/mytrue.groovy
class mytrue implements Serializable {
}
vars/doesCasingMatter.groovy
class DoesCasingMatter implements Serializable {
}
在我的管道脚本中测试它们是实例还是Class
类型(此处未启用脚本安全性):
echo("MyTrue: ${Class.isInstance(MyTrue)}")
echo("myTrue: ${Class.isInstance(myTrue)}")
echo("mytrue: ${Class.isInstance(mytrue)}")
echo("What bindings are there?: ${binding.variables}")
打印出来:
[Pipeline] echo
MyTrue: true
[Pipeline] echo
myTrue: false
[Pipeline] echo
mytrue: false
[Pipeline] echo
What bindings are there?: [steps:org.jenkinsci.plugins.workflow.cps.DSL@e96256, myTrue:myTrue@8a1ddc5, mytrue:mytrue@392ff649]
这似乎表明类名的某些内容决定了它的编译和创建方式。第一个示例与您的vars/True.groovy
类似,仅作为类导入而未实例化。其他两个被编译和实例化,并使用其定义的类名绑定到脚本。我认为如果你希望它们是全局变量,你必须以不同的方式定义你的类。
答案 1 :(得分:2)
我找到了一种实现此目的的方法,但有一点警告:必须在类中定义/包装变量。但是,这样做确实具有提供更好的组织性的好处,以免对全球空间造成过多污染。
例如,我们经常将四个标准的“魔术字符串”用于构建状态,我想将其保存为全局常量以促进互操作性。因此,我创建了一个status
中定义的全局vars/status.groovy
类:
class status {
final String STARTED = "STARTED"
final String SUCCESS = "SUCCESS"
final String FAILURE = "FAILURE"
final String ABORTED = "ABORTED"
}
然后可以通过引用其父类来使用常量:
echo status.STARTED
echo status.SUCCESS
echo status.FAILURE
echo status.ABORTED
特别感谢@mkobit为我指出了正确的方向!
答案 2 :(得分:0)
变量True
绝对是一个变量,但它包含对True
类型的对象的引用(您在/vars/True.groovy
中定义)。你有两个选择
好的:
以这种方式使用
println "evaluation ${ true == True() }"
奇怪的人:
您可以在equals()
/vars/True.groovy
方法
public boolean equals(obj) {
return obj == true;
}
然后这应该工作
println "evaluation ${ true == True }"
但这会很奇怪,可能导致误解。