Jenkins 管道 readJSON 会将 boolean false 读取为 null

问题描述 投票:0回答:1

假设我有一个包含以下内容的 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
中则进入。我不明白它以这种方式工作的原因,因为我不明白我还能如何测试变量是否已定义且不为空。如果有人知道原因和/或有一些实现我目标的建议,我会向他们开放。 :)

json jenkins groovy
1个回答
0
投票

您的“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" 
}
© www.soinside.com 2019 - 2024. All rights reserved.