我在 Jenkins 有一个管道脚本。
我曾经得到这个异常:
我查找了异常,发现一些迹象表明应使用@NonCPS
注释发生异常的方法。我这样做的时候并没有真正理解它的作用。
但是在那之后,我在该方法中抛出的异常不再被try
子句捕获。
那么@NonCPS
背后的想法是什么?使用它有什么作用?
最佳答案
您看到的异常是由于script security和沙箱。基本上,默认情况下,默认情况下,当您运行管道脚本时,它会在沙箱中运行,仅允许使用某些方法和类。有多种方法可以将操作列入白名单,请检查上面的链接。
当您具有使用无法序列化的对象的方法时,@NonCPS
批注很有用。通常,您在管道脚本中创建的所有对象都必须可序列化(原因是Jenkins必须能够序列化脚本的状态,以便可以将其暂停并存储在磁盘上)。
当您将@NonCPS
放在方法上时,Jenkins将一次性执行整个方法,而无法暂停。此外,您也不能在@NonCPS
注释的方法中引用任何管道步骤或CPS转换的方法。 More information about this can be found here。
至于异常处理:不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();
所有打印“捕获”按预期方式。