在Jenkinsfile中使用元组时,出现无法批准的RejectedAccessException

时间:2019-03-17 17:12:41

标签: jenkins jenkins-pipeline jenkins-groovy

我试图在Jenkins文件中使用元组。

我写的行是def tupleTest = new Tuple('test', 'test2')

但是,Jenkins不接受这一行,并继续将以下错误写入控制台输出:

  

未找到此类构造函数:new groovy.lang.Tuple java.lang.String java.lang.String。管理员可以决定是批准还是拒绝此签名。

     

...

     

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:未找到此类构造函数:new groovy.lang.Tuple java.lang.Integer java.lang.String

     

...

当我访问“脚本批准”配置时,我看不到任何需要批准的脚本。

this链接之后,我尝试安装并启用“ Permissive Security”插件,但该插件也无济于事-错误相同。

我什至尝试将有问题的签名手动添加到scriptApproval.xml文件中。添加完之后,我可以在批准的签名列表中看到它,但是错误仍然存​​在。

我在做错什么吗?

2 个答案:

答案 0 :(得分:0)

这或多或少是由groovy.lang.Tuple构造函数+ Jenkins沙箱Groovy模式引起的问题。如果您看一下此类的构造函数,您将看到something like this

package groovy.lang;

import java.util.AbstractList;
import java.util.List;

public class Tuple extends AbstractList {
    private final Object[] contents;
    private int hashCode;

    public Tuple(Object[] contents) {
        if (contents == null) throw new NullPointerException();
        this.contents = contents;
    }

    //....
}

Groovy沙箱模式(默认为所有Jenkins管道启用),确保每次调用都通过脚本批准检查。这不是万无一失的,并且当它看到new Tuple('a','b')时,会认为用户正在寻找与两个String类型的参数完全匹配的构造函数。并且由于此类构造函数不存在,因此将引发此异常。但是,有两个简单的解决方法可以解决此问题。

改为使用groovy.lang.Tuple2

如果元组是一对,请改用groovy.lang.Tuple2。关于此类的好消息是它提供了一个构造函数that supports two generic types,因此可以在您的情况下使用。

使用精确的Object[]构造函数

或者,您可以使用精确的构造函数,例如

def tuple = new Tuple(["test","test2"] as Object[])

这两个选项都需要脚本批准才能使用它们(但是,在这种情况下,两个构造函数都出现在进程内脚本批准页面中)。

答案 1 :(得分:0)

您可以直接使用列表文字:

def tuple = ["test1", "test2"]

等效于

def (a, b) = ["test1", "test2"]