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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@NonCPS在Jenkins管道脚本中的作用是什么?相关的知识,希望对你有一定的参考价值。

我在Jenkins有一个管道脚本。

我以前得到这个例外:

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

我查看异常,我发现一些迹象表明我应该使用@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();

所有打印都按预期“抓住”。

以上是关于@NonCPS在Jenkins管道脚本中的作用是什么?的主要内容,如果未能解决你的问题,请参考以下文章

比较管道插件jenkins中的字符串

如何访问Jenkins管道脚本中的参数?

Jenkins多分支管道脚本

Jenkins管道脚本的开发过程应该如何?

获取已推送更改的已更改分支的名称,Jenkins管道脚本

在 Jenkins 管道中处理秘密