【问题标题】:What is the effect of @NonCPS in a Jenkins pipeline script@NonCPS 在 Jenkins 流水线脚本中的作用是什么
【发布时间】:2017-07-06 20:40:05
【问题描述】:

我在 Jenkins 中有一个流水线脚本。

我曾经遇到过这个异常:

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

我查看了异常,发现一些迹象表明我应该用@NonCPS 注释发生异常的方法。我这样做了,但并没有真正理解它的作用。

然而,在那之后,我在该方法中抛出的异常不再被 try 子句捕获。

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

【问题讨论】:

标签: jenkins groovy


【解决方案1】:

您看到的异常是由于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();

全部按预期打印“Caught”。

【讨论】:

  • 当我使用@NonCPS 时,jenkins 找不到该方法,因为我收到了hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method 之类的错误
猜你喜欢
  • 2021-03-07
  • 2022-08-25
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多