Jenkins CI Pipeline Scripts不允许使用方法groovy.lang.GroovyObject

Dan*_*dez 85 continuous-integration maven jenkins jenkins-pipeline

我正在使用Jenkins 2来编译Java项目,我想从pom.xml中读取该版本,我遵循这个例子:

https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md

这个例子表明:

带有问题功能的全Jenkins管道盘旋

似乎访问文件系统存在一些安全问题,但我无法弄清楚它给出了什么(或为什么)这个问题:

我只是做了一个与示例有点不同的事情:

def version() {
    String path = pwd();
    def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
    return matcher ? matcher[0][1] : null
}
Run Code Online (Sandbox Code Playgroud)

我在运行'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)
Run Code Online (Sandbox Code Playgroud)

我正在使用这些版本:Plugin Pipeline 2.1 Jenkins 2.2

Maa*_*eft 221

快速解决

我有类似的问题,我解决了它做以下事情

  1. 导航到jenkins>管理jenkins>进程内脚本批准
  2. 有一个挂起的命令,我必须批准.

在Jenkins 2.61的流程审批链接中 备选方案1:禁用沙箱

正如本文深入解释的那样,默认情况下,groovy脚本以沙盒模式运行.这意味着允许在没有管理员批准的情况下运行groovy方法的子集.也可以不以沙盒模式运行脚本,这意味着整个脚本需要立即由管理员批准.这会阻止用户当时批准每一行.

在没有沙盒的情况下运行脚本可以通过在脚本下方的项目配置中取消选中此复选框来完成: 在此输入图像描述

备选方案2:禁用脚本安全性

正如本文所解释的那样,也可以完全禁用脚本安全性.首先安装许可脚本安全插件,然后更改你的jenkins.xml文件添加这个参数:

-Dpermissive脚本-security.enabled =真

所以你jenkins.xml看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

如果你实现了这一点,请确保你知道自己在做什么!

  • 如果批准整个脚本更好,取决于团队结构。对于一些具有完全访问权限的开发人员来说,这非常好。但是多个团队的设置将迫使管理员批准所有管道脚本中的每个更改。 (2认同)
  • 备选方案3(应该是第一个建议)是_alter有问题的未列入白名单的代码_.在这种情况下,简单地使用`@ NonCPS`作为'Matcher`用法就足够了.在这种情况下,无需禁用整个管道的安全性,尤其是整个Jenkins安装.单独评估每个被阻止的呼叫,并确定您是否确实需要批准它们. (2认同)
  • @mkobit我用`NonCPS`装饰了一个使用`currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()`的函数.根据我的阅读,NonCPS根本没有帮助解决安全问题. (2认同)

And*_*dre 11

您必须在作业配置中禁用Groovy的沙箱.

目前,对于groovy脚本来自scm的multibranch项目,这是不可能的.有关更多信息,请参阅https://issues.jenkins-ci.org/browse/JENKINS-28178

  • 禁用沙箱是一个糟糕的主意。这样做会让坏人或笨手笨脚的人利用詹金斯做任何想做的事,包括规避安全、窃取凭证……只是不要这样做! (4认同)

小智 7

当我将 userInput 中用户输入参数的数量从 3 减少到 1 时,我遇到了这个问题。这将 userInput 的变量输出类型从数组更改为原始类型。

例子:

myvar1 = userInput['param1']
myvar2 = userInput['param2']
Run Code Online (Sandbox Code Playgroud)

到:

myvar = userInput
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所经历的症状的解决方法。错误消息是“org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用方法 groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object”。该方法需要 2 个参数,但实际接收到 3 个参数。 (4认同)