本文首發於:Jenkins 中文社區編程
原文連接 做者:dwnusbaumbash
譯者:Zhao Xiaojie工具
流水線除了成功或失敗之外,還有一種介於二者之間的狀態測試
最近發佈了的一些變動給了流水線編輯者新的工具以改善在 Blue Ocean 中的流水線可視化,有一個備受矚目關注的工單JENKINS-39203,這會致使當流水線的構建結果爲不穩定時全部的階段都被設置爲不穩定的。這個缺陷致使沒法快速地識別爲何構建是不穩定的,使得用戶必須查看完整的日誌和 Jenkinsfile 才能弄明白究竟發生了什麼。ui
爲了修復這個問題,咱們引入了一個新的流水線 API 用於爲單個流水線步驟添加額外的結果信息。像 Blue Ocean 這樣的可視化工具在決定階段如何顯示時會使用到這新的 API。像 junit
這樣的步驟只能設置整個構建結果,如今能夠經過新的 API 設置步驟級別的結果信息。咱們建立了新的步驟 unstable
和 warnError
,這樣流水線編輯者在更復雜的場景下仍然能夠利用這個新的 API。google
該問題涉及到的重要的修復包含在以下的插件中,它們都須要 Jenkins 2.138.4 以及更新的版本:spa
這裏是一條使用了 unstable
步驟的流水線在 Blue Ocean 中的截圖,只會把失敗的階段標識爲不穩定的:插件
這裏給出一些如何在你的流水線中使用該特性的示例:日誌
warnError
用於捕獲錯誤,並把構建和階段標記爲不穩定的。 warnError
只須要一個 字符串
的參數,用於當捕獲到錯誤時以日誌的形式輸出。當 warnError
捕獲到一個錯誤時,它會記錄該消息以及錯誤,並設置構建和階段的結果爲不穩定的。效果以下:warnError('Script failed!') {
sh('false')
}
複製代碼
unstable
設置構建和階段結果爲不穩定的。可使用該步驟直接替換 currentBuild.result = 'UNSTABLE'
,在 warnError
不夠靈活時這會比較有用。步驟 unstable
只須要一個 字符串
參數,當該步驟運行時會做爲消息。使用的方法以下:try {
sh('false')
} catch (ex) {
unstable('Script failed!')
}
複製代碼
junit
能夠直接把該階段設置爲不穩定的。publishIssues
和 recordIssues
能夠直接把該階段設置爲不穩定的。unstable
或 warnError
步驟,或不升級插件到集成來新 API 的狀況下設置構建狀態,那麼即便構建是不穩定的,Blue Ocean 也不會把任何階段顯示爲不穩定的。currentBuild.result
繼續只會覆蓋構建狀態。不幸的是,因爲 currentBuild
是做爲全局變量而實現的,所以,沒法讓它設置步驟或者階段級別的結果,這意味這它沒有任何步驟級別的上下文可使用到新的 API。Jenkins 流水線步驟能夠以兩種方式完成:成功並返回一個結果(可能爲 null),或者是失敗的,並拋出一個異常。當步驟失敗並拋出異常時,該異常會貫穿整個流水線,直到有其餘的步驟或者 Groovy 代碼捕獲,或者它到達流水線的頂層並致使流水線失敗。基於拋出的異常的不一樣類型,流水線最終的結果可能不是失敗(例如:某些狀況下是被終止的)。基於異常傳播的方式,像 Blue Ocean 這樣的工具能夠輕鬆地識別哪些步驟(以及階段)是失敗的。code
爲了可以讓流水線可以與相應的 Jenkins API 交互,對於流水線構建來講,能夠在構建期間修改構建結果也是有必要的。對於其餘的,這使得流水線可使用構建步驟以及原先出自於自由風格的任務中的項目。
在一些狀況下,一個流水線步驟須要可以成功地完成,以便流水線能夠繼續正常執行,但對此而言可以標記有某種錯誤發生,所以,在可視化時可以識別到發生錯誤的步驟,即便沒有完全失敗。比較好的一個例子就是 junit
步驟。該步驟關注特定的測試結果,若是有任何錯誤,會把整個構建結果標記爲不穩定的。這種行爲對相似 BlueOcean 的可視化工具而言是有問題的,由於該步驟是成功的,並且沒法經過編程的方式覆蓋於該步驟相關的最終結果。
再次查看下 JENKINS-39203,咱們看到關於可視化有兩項基本的選項。由於有的步驟致使構建變成不穩定的,設置整體的構建結果是不穩定的,或者全部的步驟都成功完成來也展現爲不穩定的;或者因爲咱們沒有辦法把特定步驟相關的構建結果做設置,它們可能顯示爲成功的。最後,選擇了第一個選項。
爲了解決該問題,部分用戶嘗試經過拋出異常並在階段中增長 try/catch
這樣的代碼塊用於處理異常,這樣 Blue Ocean 可以藉助這些異常來標記步驟和階段的結果爲指望的狀態,並且,捕獲異常後,流水線能夠繼續正常執行。這種方式不容易理解,脆弱,並且沒法在申明式的流水線中使用。
若是你是一個插件的開發者,並在集成流水線時使用了步驟,想要利用這個新的 API 的話,你的步驟就能夠給出一個非成功的結果,而不是拋出異常。請查看 Jenkins 開發者郵件列表中的這個帖子,若是你遇到任何問題了,能夠在那裏提問。