Jenkins管道脚本中@NonCPS的作用是什么


110

我在詹金斯有一个管道脚本。

我曾经得到这个异常:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用groovy.json.JsonSlurperClassic方法parseText java.lang.String

我查找了异常,发现了一些迹象,我应该对发生异常的方法进行注释@NonCPS。我这样做的时候并没有真正理解它的作用。

但是在那之后,我在该方法中引发的异常不再被try子句捕获。

那么背后的想法是@NonCPS什么?使用它有什么作用?


1
jenkins官方博客上有一篇文章介绍了此注释,可能会对您有所帮助。jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
袁文涛

Answers:


141

您看到的异常是由于脚本安全性和沙箱引起的。基本上,默认情况下,默认情况下,当您运行管道脚本时,它会在沙箱中运行,仅允许使用某些方法和类。有多种方法可以将操作列入白名单,请查看上面的链接。

@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();

所有打印“捕获”按预期方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.