Maven Jenkins CI管道脚本不允许使用方法groovy.lang.GroovyObject
我使用Jenkins 2编译Java项目,我想从pom.xml中读取版本,我遵循以下示例: 这个例子表明: 似乎在访问文件系统时出现了一些安全问题,但我无法弄清楚它导致了什么(或为什么)问题: 我只是做了一点与示例不同的事情:Maven Jenkins CI管道脚本不允许使用方法groovy.lang.GroovyObject,maven,jenkins,continuous-integration,jenkins-pipeline,Maven,Jenkins,Continuous Integration,Jenkins Pipeline,我使用Jenkins 2编译Java项目,我想从pom.xml中读取版本,我遵循以下示例: 这个例子表明: 似乎在访问文件系统时出现了一些安全问题,但我无法弄清楚它导致了什么(或为什么)问题: 我只是做了一点与示例不同的事情: def版本(){ 字符串路径=pwd(); def matcher=readFile(“${path}/pom.xml”)=~'(.+)' 返回匹配器?匹配器[0][1]:空 } 运行“version”方法时出现的错误: org.jenkinsci.plugins.
def版本(){
字符串路径=pwd();
def matcher=readFile(“${path}/pom.xml”)=~'(.+)'
返回匹配器?匹配器[0][1]:空
}
运行“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.1
Jenkins 2.2您必须在作业配置中禁用Groovy沙盒
目前,对于groovy脚本来自scm的多分支项目,这是不可能的。有关更多信息,请参见快速修复 我有类似的问题,我通过以下方法解决了它
<executable>..bin\java</executable>
<arguments>-Dpermissive-script-security.enabled=true -Xrs -Xmx4096m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=80 --webroot="%BASE%\war"</arguments>
.bin\java
-dpPermissive script security.enabled=true-Xrs-Xmx4096m-Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle-jar“%BASE%\jenkins.war”--httpPort=80--webroot=“%BASE%\war”
确保你知道你在做什么,如果你实现了这一点 要绕过SCM存储的Groovy脚本的沙盒,我建议以Groovy命令运行脚本(而不是Groovy脚本文件):
在这种情况下,groovy脚本将从工作区传输到Jenkins主机,在那里它可以作为
系统groovy脚本执行。只要未选中使用Groovy沙盒,沙盒就会被抑制。当我将userInput中的用户输入参数数从3减少到1时,遇到了这种情况。这将userInput的变量输出类型从数组更改为原语
例如:
myvar1 = userInput['param1']
myvar2 = userInput['param2']
致:
关于不允许使用方法的脚本,我也遇到了类似的错误,但这是因为我编写了scm“checkout”
而不是checkou scm
。万一有人碰到这个问题,请注意语法错误:)。按照Maarten Kieft所说的做让我看到了关于错误命令的更清晰的错误信息:)如果批准整个脚本更好,取决于团队结构。对于一些具有完全访问权限的开发人员来说,这非常好。但是一个包含多个团队的设置将迫使管理员批准所有管道脚本中的每一个更改。备选方案3(应该是第一个建议)是修改有问题的未列出的代码。在这种情况下,对于匹配器
用法,简单地使用@NonCPS
就足够了。在这种情况下,没有必要禁用整个管道的安全性,尤其是整个Jenkins安装。逐个评估每个被阻止的呼叫,并决定是否确实需要批准它们。@mkobit对我不起作用@NonCPS
没有帮助。@mkobit我用NonCPS
修饰了一个函数,该函数使用currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
。从我所读到的内容来看,NonCPS根本无助于解决安全问题。@warvariuc感谢您的回复。你是对的,@NonCPS
不会帮你解决这个问题。在某些情况下,您可能只想批准特定的运行、单个作业、单个文件夹、单个方法等。还有一些其他方法可以解决有限的安全问题(例如使用全局共享库)。我想指出的是,禁用整个实例的安全性几乎肯定不是一个好主意。这看起来很笨重、有风险,而且一定会回来咬你。安全性很重要,特别是当它保护用户敏感数据时,但同时也要付出代价,例如开发过程中的复杂性。当安全工具只实现了一半时,情况会变得更糟。Jenkins脚本沙盒是半实现安全工具的一个很好的例子,因此您可能需要完全禁用该功能,否则这意味着您将无法使用。在我的情况下,在从较旧的Jenkins升级后,我的Groovy脚本停止工作,唯一使其工作的方法是运行脚本300次(只是估计)对于每次运行,在Jenkins UI中单击以允许200行脚本中的所有方法调用。此外,UI不允许您粘贴所有允许的方法调用的完整列表,以防您能够以某种方式生成它们。此外,UI停止显示一些方法调用,过了一段时间,我无法继续is正是我遇到的症状的修复程序。错误消息是org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用方法groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object
。该方法需要2个参数,并接收3.Dis
myvar1 = userInput['param1']
myvar2 = userInput['param2']
myvar = userInput