我在Jenkins有一个管道脚本。
我曾经得到过这个例外:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 脚本不允许使用方法groovy.json.JsonSlurperClassic parseText java.lang.String
我查看了异常,我发现了一些迹象表明我应该使用@NonCPS
注释出现异常的方法。我做到了这一点,却没有真正理解它的作用。
然而,在那之后,我投入该方法的异常不再被try
子句捕获。
那么@NonCPS
背后的想法是什么?使用它有什么影响?
答案 0 :(得分:87)
您看到的异常是由IANA和沙盒引起的。基本上,默认情况下,当您运行管道脚本时,它在沙箱中运行,该沙箱仅允许使用某些方法和类。有办法将操作列入白名单,请查看上面的链接。
当您拥有使用不可序列化的对象的方法时,@NonCPS
注释很有用。通常,您在管道脚本中创建的所有对象都必须是可序列化的(原因是Jenkins必须能够序列化脚本的状态,以便它可以暂停并存储在磁盘上)。
当你在方法上放置@NonCPS
时,Jenkins会一次性执行整个方法而无法暂停。此外,您不允许在@NonCPS
带注释的方法中引用任何管道步骤或CPS转换的方法。 script security
至于异常处理:不是100%肯定你正在经历的事情;我尝试了以下内容,它按预期工作:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
和
@NonCPS
def myFunction() {
throw new RuntimeException();
}
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
最后:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
@NonCPS
def mySecondFunction() {
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
}
mySecondFunction();
所有打印都按预期“抓住”。