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

时间:2016-07-15 09:12:27

标签: jenkins groovy try-catch 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

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

我也尝试过没有重试。在这里我遇到了问题,如果

bat "..." 

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

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

错误消息不是因为CONTAINER,F/E,B/L No,FCL/LCL,COMMODITY,WGT ,而是因为在try/catchprepareEnvironmentsetupBuildEnvironment方法中抛出异常,例如runBuild允许沙箱模式。允许的是使用throw new Exception("message")步骤,如下所示:

error

此步骤将使用指定的消息抛出def runBuild() { // ... error "ERR" }

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

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

retry(1)

答案 2 :(得分:-1)

尝试取消选中“使用Groovy Sandbox”复选框。