我试图在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
文件中。添加完之后,我可以在批准的签名列表中看到它,但是错误仍然存在。
我在做错什么吗?
答案 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"]