Jenkins Pipeline:在重试块内尝试/捕获



我的 Jenkins 管道有问题。我想执行以下操作:如果工作区中已存在生成环境,则使用以前的环境执行(增量)生成。

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

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

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()
        }
    }

当我在 Jenkins 中运行它并且runBuild()步骤失败时,我得到:

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

我认为问题出在重试(1) 块内部的 try/catch。如何解决这个问题的任何建议

我也在没有重试的情况下尝试过。在这里我遇到了一个问题,如果

bat "..." 

runBuild() 中的步骤 返回一个异常,即使我捕获异常并且干净构建成功,管道阶段也被标记为失败。

有什么建议吗?

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

def runBuild() {
    // ...
    error "ERR"
}

此步骤将引发一个包含指定消息的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()
    }
}

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

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

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

尝试取消选中"使用 Groovy 沙盒"复选框。

相关内容

  • 没有找到相关文章

最新更新