我正在使用Jenkins 2编译Java项目,我想从pom.xml中读取版本,我遵循了以下示例:
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
这个例子说明:
访问文件系统时似乎出现了一些安全问题,但我不知道是什么原因导致了该问题:
我只是做了一点不同的例子:
def version() {
String path = pwd();
def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
return matcher ? matcher[0][1] : null
}
运行"version"方法时出现的错误:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.codehaus.groovy.runtime.GStringImpl call org.codehaus.groovy.runtime.GStringImpl)
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectMethod(StaticWhitelist.java:165)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:117)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:103)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:15)
at WorkflowScript.run(WorkflowScript:71)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:55)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:100)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
我正在使用这些版本:插件管道2.1Jenkins2.2
7条答案
按热度按时间5w9g7ksd1#
快速修复解决方案:
我遇到了类似的问题,我通过以下操作解决了该问题
1.导航至“jenkins”〉“管理jenkins”〉“进程中脚本审批
1.有一个待处理的命令,我必须批准。
备选案文1:禁用沙盒
正如article深入解释的那样,groovy脚本默认在沙盒模式下运行。这意味着groovy方法的一个子集可以在没有管理员批准的情况下运行。也可以不在沙盒模式下运行脚本,这意味着整个脚本需要管理员一次批准。这防止了用户一次批准每一行。
通过在项目配置中取消选中脚本下方的此复选框,可以在不使用沙箱的情况下运行脚本:
备选案文2:禁用脚本安全性
正如article所解释的,也可以完全禁用脚本安全性。首先安装permissive script security plugin,然后更改jenkins.xml文件,添加以下参数:
因此,jenkins.xml看起来如下所示:
0pizxfdo2#
您必须在作业配置中为Groovy禁用沙箱。
目前,对于groovy脚本来自scm的多分支项目来说,这是不可能的。
qyswt5oh3#
我在将userInput中的用户输入参数的数量从3减少到1时遇到了这种情况。这将userInput的变量输出类型从数组更改为原语。
示例:
至:
nfg76nw04#
要绕过SCM存储的Groovy脚本的沙箱,我建议将脚本作为Groovy Command运行(而不是Groovy Script file):
在这种情况下,groovy脚本将从工作区传输到Jenkins Master,在那里它可以作为
system Groovy Script
执行。只要Use Groovy Sandbox没有 * 选中 *,沙箱就会被抑制。q35jwt9p5#
为了获得maven项目的版本,我通常在
sh
块中使用mvn
二进制文件,如下所示。v09wglhw6#
在 @JavaTechnical 的回答之后,可以将Maven项目的版本分配给一个变量:
wwtsj6pe7#
我遇到的问题是Groovy对象没有我试图调用的函数。据我所知,如果Groovy找不到函数,那么Groovy就会开始对对象进行自检,寻找未定义的对象,这就导致了这个错误。
因此,请检查以确保您尝试调用的函数确实存在。