不允许Jenkins CI管道脚本使用方法groovy.lang.GroovyObject

zpqajqem  于 2022-11-28  发布在  Jenkins
关注(0)|答案(7)|浏览(318)

我正在使用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

5w9g7ksd

5w9g7ksd1#

快速修复解决方案:

我遇到了类似的问题,我通过以下操作解决了该问题
1.导航至“jenkins”〉“管理jenkins”〉“进程中脚本审批
1.有一个待处理的命令,我必须批准。

备选案文1:禁用沙盒

正如article深入解释的那样,groovy脚本默认在沙盒模式下运行。这意味着groovy方法的一个子集可以在没有管理员批准的情况下运行。也可以不在沙盒模式下运行脚本,这意味着整个脚本需要管理员一次批准。这防止了用户一次批准每一行。
通过在项目配置中取消选中脚本下方的此复选框,可以在不使用沙箱的情况下运行脚本:

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

正如article所解释的,也可以完全禁用脚本安全性。首先安装permissive script security plugin,然后更改jenkins.xml文件,添加以下参数:

  • 权限脚本安全性。启用=true
    因此,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>
  • 确保您知道您在做什么,如果你实施这一点!*
0pizxfdo

0pizxfdo2#

您必须在作业配置中为Groovy禁用沙箱。
目前,对于groovy脚本来自scm的多分支项目来说,这是不可能的。

qyswt5oh

qyswt5oh3#

我在将userInput中的用户输入参数的数量从3减少到1时遇到了这种情况。这将userInput的变量输出类型从数组更改为原语。
示例:

myvar1 = userInput['param1']
myvar2 = userInput['param2']

至:

myvar = userInput
nfg76nw0

nfg76nw04#

要绕过SCM存储的Groovy脚本的沙箱,我建议将脚本作为Groovy Command运行(而不是Groovy Script file):

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执行。只要Use Groovy Sandbox没有 * 选中 *,沙箱就会被抑制。

q35jwt9p

q35jwt9p5#

为了获得maven项目的版本,我通常在sh块中使用mvn二进制文件,如下所示。

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

v09wglhw6#

@JavaTechnical 的回答之后,可以将Maven项目的版本分配给一个变量:

stage("getPomProjectVersion") {
    steps {
       ...
       def pomProjectVersion = sh script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true
       ...
    }
}
wwtsj6pe

wwtsj6pe7#

我遇到的问题是Groovy对象没有我试图调用的函数。据我所知,如果Groovy找不到函数,那么Groovy就会开始对对象进行自检,寻找未定义的对象,这就导致了这个错误。
因此,请检查以确保您尝试调用的函数确实存在。

相关问题