Jenkins管道:在重试块中尝试/捕获

Dit*_*chi 6 groovy try-catch jenkins jenkins-pipeline

我的詹金斯管道有问题。我要执行以下操作:如果工作区中已经存在构建环境,则使用以前的环境执行(增量)构建。

如果失败,请使用干净的构建重试一次(删除以前的构建环境,然后重新构建)

我正在尝试通过以下方式做到这一点:

retry(1) {
        try {
            prepareEnvironment()
            setupBuildEnvironment() // sets up environment if it is not present yet
            runBuild()
        } catch (e) {
            echo 'Err: Incremental Build failed with Error: ' + e.toString()
            echo '     Trying to build with a clean Workspace'
            removeOldBuildEnvironment()
        } finally {
            cleanupEnvironment()
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我在詹金斯(Jenkins)中运行此命令而该runBuild()步骤失败时,我得到:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许脚本使用新的java.lang.Exception java.lang.String

我认为问题是retry(1)块中的try / catch。任何建议如何解决

我也尝试过,没有重试。在这里我有一个问题,如果

bat "..." 
Run Code Online (Sandbox Code Playgroud)

runBuild()中的step返回一个异常,即使我捕获到该异常并且干净的构建成功,管道Stage也被标记为fail。

有什么建议么?

Ger*_*oth 6

错误消息不是因为,try/catch而是因为在prepareEnvironment,setupBuildEnvironmentrunBuild方法中抛出异常,例如throw new Exception("message")沙箱模式下不允许的。允许使用如下error步骤:

def runBuild() {
    // ...
    error "ERR"
}
Run Code Online (Sandbox Code Playgroud)

此步骤将抛出hudson.AbortException带有指定消息的消息。

代码中的 catch 块将捕获此异常并打印正确的消息然后调用 removeOldBuildEnvironment

另一方面,完成此修改后,您的脚本仍无法按预期工作,因为异常被 catch 块吞下,因此重试步骤不会再次执行代码。要使其工作,需要从 catch 块再次抛出异常(请注意,您必须使用retry(2)而不是retry(1)

retry(2) {
    try {
        prepareEnvironment()
        setupBuildEnvironment() // sets up environment if it is not present yet
        runBuild()
    } catch (e) {
        echo 'Err: Incremental Build failed with Error: ' + e.toString()
        echo '     Trying to build with a clean Workspace'
        removeOldBuildEnvironment()
        throw e
    } finally {
        cleanupEnvironment()
    }
}
Run Code Online (Sandbox Code Playgroud)


Krz*_*soń 4

转到脚本批准(在“管理 Jenkins”中,底部的某个位置)并批准toString异常的方法。

如果找不到脚本批准,请先安装插件https://wiki.jenkins-ci.org/display/JENKINS/Script+Security+Plugin

当您看到 时,您可能需要访问该页面RejectedAccessException