我在詹金斯中有一个管道脚本。
我曾经遇到过这个异常:
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:
不允许脚本使用 groovy.json.JsonSlurperClassic 方法
parseText java.lang.String
我查找了异常,发现一些迹象表明我应该注释发生异常的方法@NonCPS
。我这样做了,但并没有真正理解它的作用。
然而,在那之后,我在该方法中抛出的异常不再被捕获try
clause.
那么背后的想法是什么@NonCPS
?使用它有什么效果呢?
您看到的异常是由于脚本安全 https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin和沙箱。基本上,默认情况下,当您运行管道脚本时,它会在沙箱中运行,该沙箱仅允许使用某些方法和类。有多种方法可以将操作列入白名单,请查看上面的链接。
The @NonCPS
当您的方法使用不可序列化的对象时,注释非常有用。通常,您在管道脚本中创建的所有对象都必须是可序列化的(原因是 Jenkins 必须能够序列化脚本的状态,以便可以将其暂停并存储在磁盘上)。
当你把@NonCPS
对于一个方法,Jenkins 会一次性执行整个方法,而不能暂停。此外,您不得从某个管道中引用任何管道步骤或 CPS 转换方法。@NonCPS
带注释的方法。有关这方面的更多信息可以在这里找到 https://github.com/jenkinsci/workflow-cps-plugin/blob/master/README.md#technical-design.
至于异常处理:不能100%确定你遇到了什么;我已尝试以下操作并且它按预期工作:
@NonCPS
def myFunction() {
throw new RuntimeException();
}
try {
myFunction();
} catch (Exception e) {
echo "Caught";
}
and
@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();
按预期全部打印“Caught”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)