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