Jenkins声明管道抛出org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:未分类的getAt方法

时间:2017-09-26 14:49:21

标签: jenkins groovy jenkins-plugins jenkins-pipeline

我在Jenkins中定义了一个共享库:

import com.codependent.jenkins.pipelines.Utils

def call(List<String> mavenGoals){
  def processedMavenGoals = mavenGoals.join ' '
  pipeline {
    agent any
  ...
}

如果我从我的项目的Jenkins文件中这样调用它就可以了:

#!groovy
@Library('jenkins-pipeline-shared-library-example') _
buildPipeline(['clean', 'install'])

但是如果我省略了Groovy语法允许的parethesis:

#!groovy
@Library('jenkins-pipeline-shared-library-example') _
buildPipeline ['clean', 'install']

执行显示以下异常。为什么呢?

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified getAt method buildPipeline[java.util.ArrayList]
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetArray(SandboxInterceptor.java:451)
    at org.kohsuke.groovy.sandbox.impl.Checker$10.call(Checker.java:413)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetArray(Checker.java:418)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getArray(SandboxInvoker.java:45)
    at com.cloudbees.groovy.cps.impl.ArrayAccessBlock.rawGet(ArrayAccessBlock.java:21)
    at WorkflowScript.run(WorkflowScript:3)
    at ___cps.transform___(Native Method)

2 个答案:

答案 0 :(得分:2)

更新了jenkins后,我遇到了类似的问题。

在我的情况下,堆栈跟踪也显示org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException[...]

的原因

Jenkins有一个安全插件,可以阻止Jenkinsfile中的某些方法调用。

解决方案

允许这些有时无害的电话:

  1. 转到:http://JENKINS_HOST/scriptApproval/Official Documentation
  2. 批准Jenkins文件中已拒绝的操作 enter image description here
  3. 重新运行失败的构建以查看Jenkinsfile的工作

答案 1 :(得分:0)

在大多数情况下, / scriptApproval应该足够。但是,在某些情况下,由于某些原因,禁止的方法不会出现在/ scriptApproval 中。其中一些解释如下:Why-am-I-unable-to-see-a-method-in-In-process-Script-Approval

在这种情况下,您可以尝试以编程方式强制批准方法(请参见此处的答案: https://stackoverflow.com/a/48234868/4807875)或手动更新Jenkins服务器上的$ JENKINS_ROOT / scriptApproval.xml文件。后者将需要root权限,并且Jenkins服务器重新启动才能生效(选项“从磁盘重载配置”无效)。

P。 S .:我没有测试它如何使用BlackList方法。