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

时间:2016-07-08 22:40:49

标签: maven jenkins continuous-integration jenkins-pipeline

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

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

示例建议:

Full Jenkins Pipeline with problematic function circled

似乎访问文件系统存在一些安全问题,但我无法弄清楚它给出的问题(或原因):

我只是做了一些不同于示例:

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

运行&#39;版本时遇到的错误&#39;方法:

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 詹金斯2.2

5 个答案:

答案 0 :(得分:192)

<强>的QuickFix

我有类似的问题,我解决了以下问题

  1. 导航到jenkins&gt;管理詹金斯&gt;进程内脚本批准
  2. 有一个挂起的命令,我必须批准。
  3. In process approval link in Jenkins 2.61 备选方案1:禁用沙箱

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

    在没有沙盒的情况下运行脚本可以通过在脚本下方的项目配置中取消选中此复选框来完成: enter image description here

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

    正如此article所解释的那样,也可以完全禁用脚本安全性。首先安装permissive script security plugin,然后更改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>
    

    如果您实施此功能,请确保您知道自己在做什么!

答案 1 :(得分:10)

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

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

答案 2 :(得分:5)

为了解决SCM存储的Groovy脚本的沙盒,我建议将脚本作为 Groovy Command (而不是 Groovy脚本文件)运行:

import hudson.FilePath
final GROOVY_SCRIPT = "workspace/relative/path/to/the/checked/out/groovy/script.groovy"

evaluate(new FilePath(build.workspace, GROOVY_SCRIPT).read().text)

在这种情况下,groovy脚本从工作区传输到Jenkins Master,在那里它可以作为system Groovy Script执行。只要使用Groovy Sandbox 选中,沙盒就会被禁止。

答案 3 :(得分:0)

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

示例:

yarn test

收件人:

jest

答案 4 :(得分:0)

为了获取maven项目的版本,我通常在mvn块中使用sh二进制文件,如下所示。无需管理员权限。

stage("Compile") {
    steps {
       sh """
         mvn help:evaluate -Dexpression=project.version -q -DforceStdout > version.txt
       """
    }
}