假设我有一个包含以下内容的 JSON 文件 myfile.json:
{
"vm": {
"MyVal1": false,
"MyVal2": true,
"MyVal3": "some string",
}
}
我的 Jenkins 管道如下所示:
pipeline {
agent any
options {
ansiColor('xterm')
}
stages {
stage('Parse VM details') {
steps {
echo "Read VM JSON file"
script {
def props = readJSON file: 'myfile.json'
if (props['vm'].get("MyVal1") && (props['vm'].get("MyVal1") == true || props['vm'].get("MyVal1") == false)) {
env.MYVAL1 = props['vm'].get("MyVal1")
//} else {
// env.VM_ERRORMSG = "MyVal1 is not a boolean."
}
if (props['vm'].get("MyVal2") && (props['vm'].get("MyVal2") == true || props['vm'].get("MyVal2") == false))
env.MYVAL2 = props['vm'].get("MyVal2")
//} else {
// env.VM_ERRORMSG = "MyVal2 is not a boolean."
}
if (props['vm'].get("MyVal3")) {
env.MYVAL3 = props['vm'].get("MyVal3")
} else {
env.VM_ERRORMSG = "MyVal3 is not defined or empty"
}
echo "MyVal1 will be: ${env.MYVAL1}"
echo "MyVal2 will be: ${env.MYVAL2}"
echo "MyVal3 will be: ${env.MYVAL3}"
if (env.VM_ERRORMSG) {
echo "${env.VM_ERRORMSG}"
}
}
}
}
}
}
当我运行管道时,我得到了以下结果:
[Pipeline] echo
MyVal1 will be: null
[Pipeline] echo
MyVal2 will be: true
[Pipeline] echo
MyVal3 will be: some string
因此,对于
MyVal2
,我返回的布尔值是 true
,但对于 MyVal1
,无论我尝试什么,它始终是 null
。我尝试过env.MYVAL1 = toBoolean(props['vm'].get("MyVal1"))
但没有帮助。
假设 JSON 文件不太灵活,所以我需要在 Jenkins 端解决它。我怎样才能让
MyVal1
显示为布尔值,即使它是 false
?
更新:
根据评论中的建议,我找到了为什么我得到
null
而不是false
的原因。因为测试的时候没有进入if
语句。如果我将管道中的相应行更改为:
if (props['vm'].get("MyVal1")) {
env.MYVAL1 = props['vm'].get("MyVal1")
}
if (props['vm'].get("MyVal2"))
env.MYVAL2 = props['vm'].get("MyVal2")
}
然后在
MyVal1
中仍然不进入,而在MyVal2
中则进入。我不明白它以这种方式工作的原因,因为我不明白我还能如何测试变量是否已定义且不为空。如果有人知道原因和/或有一些实现我目标的建议,我会向他们开放。 :)
您的“is boolean”验证不正确
考虑以下与问题中的
if
语句相对应的代码:
def x = false
if( x && (x==false || x==true) ){
println "OK"
}
它永远不会打印“OK”,因为
x = false
和 if
的第一部分要求 x
为 true
。
if( x && (x==false || x==true) ){
//^ this requires x to be true or groovy "truth"
println "OK"
}
因此,为了更好地解决问题,请重新加工您,如果如下所示:
if( x==true || x==false ) {...}
或者像这样:
if( x instanceof Boolean ) {...}
最后,您获取属性的方式可以简化:
if( props?.vm?.MyVal1 instanceof Boolean ){
env.MYVAL1=props.vm.MyVal1
} else {
env.VM_ERRORMSG="MyVal1 is not a boolean"
}