Ziv*_*v M 2 jenkins jenkins-plugins jenkins-groovy jenkins-pipeline
我有 jenkinsfile ,其中定义了超时全局变量
class Globals {
static String TEST_TIMEOUT = ""
}
Run Code Online (Sandbox Code Playgroud)
我正在使用共享库中的函数,我正在使用全局变量来设置函数的超时。由于其他项目使用的共享库没有定义全局变量,因此我在函数文件中定义了环境变量,用作超时的默认值。
env.TESTS_TIME_OUT="10080"
Run Code Online (Sandbox Code Playgroud)
然后在函数中我想检查 Globals 变量是否存在,我想使用该值作为超时,如果不存在则使用默认值。
if(Globals.TEST_TIMEOUT){
env.TESTS_TIME_OUT= "${Globals.TEST_TIMEOUT}"
}
timeout(time: "${env.TESTS_TIME_OUT}", unit: 'MINUTES') {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
我之前已经成功完成了 env 参数,但这次出现错误
No such field found: field java.lang.Class TEST_TIMEOUT
Run Code Online (Sandbox Code Playgroud)
有什么想法如何解决这个问题吗?或者还有其他方法来检查 Globals 变量是否存在?
谢谢
groovy.lang.MissingPropertyException如果 或 不存在,您可以捕获将抛出Globals的Globals.TEST_TIMEOUT异常:
try {
env.TESTS_TIME_OUT = Globals.TEST_TIMEOUT
}
catch( groovy.lang.MissingPropertyException e ) {
env.TESTS_TIME_OUT = "10080"
}
Run Code Online (Sandbox Code Playgroud)
您甚至可以将此模式移至通用函数中......
def getPropOrDefault( Closure c, def defaultVal ) {
try {
return c()
}
catch( groovy.lang.MissingPropertyException e ) {
return defaultVal
}
}
Run Code Online (Sandbox Code Playgroud)
...可以这样称呼:
env.TESTS_TIME_OUT = getPropOrDefault({ Globals.TEST_TIMEOUT }, '10080')
Run Code Online (Sandbox Code Playgroud)
如果您想要对许多不同的全局变量进行类似处理,这可能会很有用。使您免于编写许多try/catch块。
需要使用闭包来确保表达式将在/块Globals.TEST_TIMEOUT内部而不是在函数调用之前进行计算。trycatchgetPropOrDefault