如何使用jenkins管道共享库定义全局变量或常量?

sor*_*rin 6 jenkins-pipeline

尽管我能够定义方法,但到目前为止,使用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()可能有用,但这不是重点,我需要一个真正的变量,因为整个目的是避免由于人们使用错误的大小写而导致的一些错误。

那么魔术是什么呢?

Mar*_*Roy 7

我找到了一种实现此目的的方法,但有一点警告:必须在类中定义/包装变量。但是,这样做确实有提供更好的组织的好处,以免对全球空间造成过多污染。

例如,我们经常将四个标准的“魔术字符串”用于构建状态,我想将其保存为全局常量以促进互操作性。因此,我创建了一个全局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为我指出正确的方向!


mko*_*bit 5

看起来vars目录中定义的全局变量必须是lower/camel/也许是其他一些特殊的大小写。这在定义全局变量部分的任何地方都没有说明,但是顶部有这个注释:

vars目录托管定义可从 Pipeline 访问的全局变量的脚本。每个*.groovy文件的基本名称应该是一个 Groovy (~ Java) 标识符,通常是camelCased. 匹配的*.txt,如果存在,可以包含通过系统配置的标记格式化程序处理的文档(因此可能真的是 HTML、Markdown 等,但txt需要扩展名)。

这是我尝试过的:

并在我的管道脚本中测试它们是实例还是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,仅作为类导入而未实例化。另外两个被编译和实例化,并用它们定义的类名绑定到脚本。我认为如果您希望它们成为全局变量,则必须以不同的方式定义您的类。


Vit*_*nko 1

变量绝对是一个变量,但它保存对类型对象(您在 中定义的)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)

但这确实很奇怪,并且可能会导致误解。