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

时间:2017-11-09 15:33:11

标签: jenkins-pipeline

虽然我能够定义方法,但是到目前为止,使用Jenkins共享库定义变量似乎是一个未解决的任务。

我在这个身上添加了/vars/True.groovy

def call() {
    return true
}

现在在Jenkinsfile中,我试图测试它是否按预期工作:

println "evaluation ${ true == True }"

但令人惊讶的是,它在考虑true != class True时失败了。我的印象是true == True()可能有效,但这不是重点,我需要一个真正的变量,因为整个目的是为了避免人们使用错误案例造成的一些错误。

那么魔术是什么?

3 个答案:

答案 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 }"

但这会很奇怪,可能导致误解。