2016-07-15 110 views
2

我有我的Jenkins管道的Probems。我想要执行以下操作: 如果构建环境已经存在于Workspace中,则执行使用先前环境的(增量)构建。Jenkins管道:Try/catch insyde重试块

如果失败了干净的构建重试(删除以前Buiod环境,然后重新编译)

我试图做到这一点:

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

当我在詹金斯和运行这个runBuild()一步失败了,我得到:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 脚本不得使用新java.lang.Except ion java.lang.String

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

我也尝试过没有重试。在这里,我不得不说,如果

bat "..." 

步内runBuild()返回一个例外管道为失败,即使我赶上exeption和干净的构建是成功的舞台被标记的问题。

有什么建议吗?

回答

3

错误消息是不是因为try/catch但因为在prepareEnvironmentsetupBuildEnvironmentrunBuild方法抛出异常,如throw new Exception("message")其未在沙盒模式允许的。什么是允许使用error一步,像这样的:

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

这一步将引发与指定的消息hudson.AbortException

在你的代码将捕获这个异常并打印正确的消息catch块,然后调用removeOldBuildEnvironment

在另一方面与此修改完成预期你的脚本将仍然无法正常工作异常被捕捉吞噬块,所以重试步骤不会再次执行代码。为了使其工作异常,需要从catch块(注意,你必须使用retry(2)代替​​)再次抛出

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

尝试取消勾选“使用Groovy沙盒”。