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

oct*_*ian 92 groovy jenkins

我在Jenkins有一个管道脚本.

我以前得到这个例外:

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

我查看了异常,我发现了一些迹象表明我应该注释发生异常的方法@NonCPS.我做到了这一点,却没有真正理解这是做什么的.

然而,在那之后,我投入该方法的异常不再被一个try子句捕获.

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

Jon*_*n S 114

您看到的例外是脚本安全性和沙盒.基本上,默认情况下,当您运行管道脚本时,它在沙箱中运行,该沙箱仅允许使用某些方法和类.有办法将操作列入白名单,请查看上面的链接.

@NonCPS当您拥有使用不可序列化的对象的方法时,注释很有用.通常,您在管道脚本中创建的所有对象都必须是可序列化的(原因是Jenkins必须能够序列化脚本的状态,以便它可以暂停并存储在磁盘上).

当你@NonCPS使用一个方法时,Jenkins将一次性执行整个方法而无法暂停.此外,您不允许在带@NonCPS注释的方法中引用任何管道步骤或CPS转换的方法.有关这方面的更多信息,请点击此处.

至于异常处理:不是100%肯定你正在经历的事情; 我尝试了以下内容,它按预期工作:

@NonCPS
def myFunction() {
    throw new RuntimeException();
}

try {
    myFunction();
} catch (Exception e) {
    echo "Caught";
}
Run Code Online (Sandbox Code Playgroud)

@NonCPS
def myFunction() {
    throw new RuntimeException();
}

def mySecondFunction() {
    try {
        myFunction();
    } catch (Exception e) {
        echo "Caught";
    }
}

mySecondFunction();
Run Code Online (Sandbox Code Playgroud)

最后:

@NonCPS
def myFunction() {
    throw new RuntimeException();
}

@NonCPS
def mySecondFunction() {
    try {
        myFunction();
    } catch (Exception e) {
        echo "Caught";
    }
}

mySecondFunction();
Run Code Online (Sandbox Code Playgroud)

所有打印都按预期"抓住".

  • 当我使用 @NonCPS 时,jenkins 找不到该方法,因为我收到类似“hudson.remoting.ProxyException:groovy.lang.MissingMethodException:没有方法签名”的错误 (3认同)