在Jenkins文件中使用readJSON拒绝AccessException

在Jenkins文件中使用readJSON拒绝AccessException,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我们正在使用一个Jenkins文件,其中一些库使用 library identifier: "my-lib@$version", retriever: modernSCM( [$class: 'GitSCMSource', remote: 'my-repourl', credentialsId: credentials]) 在另一个团队管理的Jenkins实例中,安装了Pipeline Utility Steps插件 此Jenkins文件位于存储库中,存储库中还有一个我们想要读取的JSON文件

我们正在使用一个Jenkins文件,其中一些库使用

library identifier: "my-lib@$version", retriever: modernSCM(
[$class: 'GitSCMSource',
remote: 'my-repourl',
credentialsId: credentials])
在另一个团队管理的Jenkins实例中,安装了Pipeline Utility Steps插件

此Jenkins文件位于存储库中,存储库中还有一个我们想要读取的JSON文件,如下所示:

{
"foo" : {
    "bar" : {
        "dummy1" : "hjk",
        "dummy2" : "Rio",
        "dummy3" : "qwe"
    }
},
"foo2" : {
    "bar2" : {
        "asd1" : "aa",
        "asd2" : "bb"
    },
    "bar3" : {
        "pepe1" : "aaa",
        "pepe2" : "bbb",
        "pepe3" : "ccc"
    }
}
}
因此,在Jenkins文件中,我们加载库,对repo进行签出,并调用存储在加载库中的函数,在该函数中,我们将readJSON步骤返回的值保存在一个env变量中

当我们试图访问存储的env变量的某个键时,就会出现问题:

def load(path) {
    env.CONFIGURATION =  readJSON(file: path)
    echo env.CONFIGURATION.foo.bar.dummy1 // ERROR
}
我们得到以下错误:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified field java.lang.String foo
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:387)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:371)
at org.kohsuke.groovy.sandbox.impl.Checker$6.call(Checker.java:282)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:286)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
at configuration.load(/var/lib/jenkins/jobs/TEST/jobs/my-lib/branches/master/builds/65/libs/my-lib/vars/configuration.groovy:7)
at WorkflowScript.run(WorkflowScript:27)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74)
at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66)
at sun.reflect.GeneratedMethodAccessor285.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive
我们感觉这与Jenkins沙箱有关,它不允许访问这些字段,但我们想知道问题是这个还是其他完全不同的事情,并且知道是否有人遇到过同样的问题


你有什么线索吗?

Jenkins认为
env.CONFIGURATION
不是地图,而是
String
。所以您得到了一个错误,
String
类中没有
foo
字段。是否确实为
readJSON(文件:path)
使用了正确的路径?尝试在解析之前打印该文件。您好@vitalivitrenko,谢谢您的回答!通过您的回答,我发现如果我创建一个局部变量
Map test1=readJSON
,它会正常工作。因此,如果我将
readJSON
返回值存储在
env
变量中,它将转换为
String
,而不是
Map
。您知道如何在不使用
env
的情况下将该映射存储为全局变量(所有Jenkins文件的全局范围)?现在它在一个库中。如果你真的想使用一个全局变量,你可以像初始化任何其他变量一样初始化它,但不需要类型和
def
关键字(例如
global\u MAP=readJSON(file:path)
)。但这是一个非常糟糕的设计,最好是从函数返回json,而不是初始化一个全局函数。。。我们尝试返回映射,而不是将其分配给环境变量,但是在Jenkinsfile中初始化的变量对于库不可见,因此执行
CONFIG=load(“myjson.json”)
不会使CONFIG在库中可见…:(您对如何为库进行这种“初始配置”有什么想法吗?一个选项可以是将此映射传递给每个函数调用,但是。。。