2016-07-15 46 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沙盒」。