在Jenkins声明性流水线中测试变量是否存在

68次阅读
没有评论

问题描述

在使用Jenkins的声明性流水线中遇到了一个问题,他想要测试一个变量是否存在。他正在使用 Build User Vars 插件,该插件在流水线中设置各种变量。以下是他当前尝试的代码:

wrap([$class: 'BuildUser']) {
    def safeBuildUser = binding.hasVariable('BUILD_USER') ? BUILD_USER : "unknown"
    echo "${safeBuildUser}"
}

然而,有时插件并没有设置这个变量,比如在由 SCM 分支扫描启动的构建时。在这种情况下,他会收到如下错误:

groovy.lang.MissingPropertyException: No such property: BUILD_USER for class: groovy.lang.Binding

使用 binding.hasVariable 似乎不起作用,因为所有构建现在都显示为 “unknown”。

除了上述尝试,他还尝试了以下方法,但都没有成功:

def safeBuildUser = BUILD_USER?: "unknown"
def safeBuildUser = binding['BUILD_USER']?: "unknown"
def safeBuildUser = binding.variables['BUILD_USER']?: "unknown"

问题的评论中也提到了一些疑问:binding 是什么?应该是 env 吗?

解决方案

请注意以下操作可能因版本差异而有所不同,且修改前务必备份。

方案

在声明性流水线中测试变量是否存在,可以使用 try/catch 语句来处理可能的变量缺失情况。以下是示例代码:

def safeBuildUser = "unknown"
wrap([$class: 'BuildUser']) {
    try {
        safeBuildUser = BUILD_USER
    } catch (e) {
        echo "User not in scope, probably triggered from another job"
    }
}
echo "Builduser is: ${safeBuildUser}"

在这个示例中,我们首先将 safeBuildUser 初始化为 “unknown”。然后,在 wrap 块中使用 try/catch 来尝试获取 BUILD_USER 变量的值。如果变量存在,我们将其赋给 safeBuildUser,否则捕获异常并输出一条消息,指示变量可能不在作用域内,可能是由另一个任务触发的。最后,我们输出 safeBuildUser 的值。

通过使用 try/catch,我们可以在变量缺失时 graceful 地处理这种情况,避免了错误的发生。

希望这个解决方案能够帮助你在Jenkins的声明性流水线中测试变量的存在性。如果你有其他问题或需要进一步的帮助,请随时提问。

正文完