首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@NonCPS在Jenkins管道脚本中的作用是什么?

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

Stack Overflow用户
提问于 2017-02-17 10:46:49
回答 1查看 99.2K关注 0票数 138

我在詹金斯有个剧本。

我曾经得到过这样的例外:

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

我查找了异常,并发现了一些指示,说明我应该对异常发生在@NonCPS中的方法进行注释。我做了这件事,根本不知道这是做什么的。

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

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

EN

回答 1

Stack Overflow用户

发布于 2017-02-17 16:55:54

您所看到的例外是由于脚本安全性和沙箱。基本上,默认情况下,当您运行管道脚本时,它在沙箱中运行,它只允许使用某些方法和类。有白名单操作的方法,检查上面的链接。

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

当您将@NonCPS放在一个方法上时,Jenkins将一次执行整个方法,而不需要暂停。此外,不允许从@NonCPS注释方法中引用任何管道步骤或CPS转换方法。有关这方面的更多信息可以在这里找到。

至于异常处理:不是100%确定您正在经历什么;我已经尝试了以下方法,并且它可以像预期的那样工作:

代码语言:javascript
运行
复制
@NonCPS
def myFunction() {
    throw new RuntimeException();
}

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

代码语言:javascript
运行
复制
@NonCPS
def myFunction() {
    throw new RuntimeException();
}

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

mySecondFunction();

最后:

代码语言:javascript
运行
复制
@NonCPS
def myFunction() {
    throw new RuntimeException();
}

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

mySecondFunction();

所有打印“捕获”如预期。

票数 179
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42295921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档