我在詹金斯有个剧本。
我曾经得到过这样的例外:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:脚本不允许使用groovy.json.JsonSlurperClassic parseText java.lang.String方法
我查找了异常,并发现了一些指示,说明我应该对异常发生在@NonCPS
中的方法进行注释。我做了这件事,根本不知道这是做什么的。
然而,在那之后,我抛出的异常不再被try
子句捕获。
那么,@NonCPS
背后的想法是什么呢?使用它的效果是什么?
发布于 2017-02-17 16:55:54
您所看到的例外是由于脚本安全性和沙箱。基本上,默认情况下,当您运行管道脚本时,它在沙箱中运行,它只允许使用某些方法和类。有白名单操作的方法,检查上面的链接。
当您有使用不可序列化对象的方法时,@NonCPS
注释非常有用。通常,您在管道脚本中创建的所有对象都必须是可序列化的(原因是Jenkins必须能够序列化脚本的状态,以便它可以暂停并存储在磁盘上)。
当您将@NonCPS
放在一个方法上时,Jenkins将一次执行整个方法,而不需要暂停。此外,不允许从@NonCPS
注释方法中引用任何管道步骤或CPS转换方法。有关这方面的更多信息可以在这里找到。。
至于异常处理:不是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();
所有打印“捕获”如预期。
https://stackoverflow.com/questions/42295921
复制相似问题