在Jenkins文件中使用readJSON拒绝AccessException
我们正在使用一个Jenkins文件,其中一些库使用在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文件
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在库中可见…:(您对如何为库进行这种“初始配置”有什么想法吗?一个选项可以是将此映射传递给每个函数调用,但是。。。