Jenkins 可視化階段視圖的改進

本文首發於:Jenkins 中文社區編程

原文連接    做者:dwnusbaumbash

譯者:Zhao Xiaojie工具

Jenkins 可視化階段視圖的改進

流水線除了成功或失敗之外,還有一種介於二者之間的狀態測試

superhero

最近發佈了的一些變動給了流水線編輯者新的工具以改善在 Blue Ocean 中的流水線可視化,有一個備受矚目關注的工單JENKINS-39203,這會致使當流水線的構建結果爲不穩定時全部的階段都被設置爲不穩定的。這個缺陷致使沒法快速地識別爲何構建是不穩定的,使得用戶必須查看完整的日誌和 Jenkinsfile 才能弄明白究竟發生了什麼。ui

爲了修復這個問題,咱們引入了一個新的流水線 API 用於爲單個流水線步驟添加額外的結果信息。像 Blue Ocean 這樣的可視化工具在決定階段如何顯示時會使用到這新的 API。像 junit 這樣的步驟只能設置整個構建結果,如今能夠經過新的 API 設置步驟級別的結果信息。咱們建立了新的步驟 unstable 和 warnError,這樣流水線編輯者在更復雜的場景下仍然能夠利用這個新的 API。google

該問題涉及到的重要的修復包含在以下的插件中,它們都須要 Jenkins 2.138.4 以及更新的版本:spa

  • Pipeline: API 2.34
  • Pipeline: Basic Steps 2.18 (須要同步更新到 Pipeline: Groovy 2.70)
  • Pipeline: Graph Analysis 1.10
  • Pipeline: Declarative 1.3.9
  • Blue Ocean 1.17.0

這裏是一條使用了 unstable 步驟的流水線在 Blue Ocean 中的截圖,只會把失敗的階段標識爲不穩定的:插件

只有一個階段爲不穩定的狀態的流水線在 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 Plugin: 更新到 1.28 或者更高的版本,使得步驟 junit 能夠直接把該階段設置爲不穩定的。
  • Warnings Next Generation Plugin: 更新到 5.2.0 或者更高的版本,使得步驟 publishIssues 和 recordIssues能夠直接把該階段設置爲不穩定的。
  • 其餘插件: 若是你的流水線被其餘插件中的步驟標記爲不穩定的,請(在檢查沒有重複項後)給該組件提交一個新的 issue,清晰地描述哪一個步驟是有問題的,以及發生問題的環境,並添加連接到該文章的開發者區域,以便維護者瞭解如何才能解決該問題。

侷限

  • 若是你不遷移到 unstable 或 warnError 步驟,或不升級插件到集成來新 API 的狀況下設置構建狀態,那麼即便構建是不穩定的,Blue Ocean 也不會把任何階段顯示爲不穩定的。
  • 即便在這些變化後,currentBuild.result 繼續只會覆蓋構建狀態。不幸的是,因爲 currentBuild 是做爲全局變量而實現的,所以,沒法讓它設置步驟或者階段級別的結果,這意味這它沒有任何步驟級別的上下文可使用到新的 API。
  • Pipeline Stage View Plugin 還沒有升級到使用這個新的 API,所以,這些變動不會在它提供的可視化中獲得體現。

歷史

Jenkins 流水線步驟能夠以兩種方式完成:成功並返回一個結果(可能爲 null),或者是失敗的,並拋出一個異常。當步驟失敗並拋出異常時,該異常會貫穿整個流水線,直到有其餘的步驟或者 Groovy 代碼捕獲,或者它到達流水線的頂層並致使流水線失敗。基於拋出的異常的不一樣類型,流水線最終的結果可能不是失敗(例如:某些狀況下是被終止的)。基於異常傳播的方式,像 Blue Ocean 這樣的工具能夠輕鬆地識別哪些步驟(以及階段)是失敗的。code

爲了可以讓流水線可以與相應的 Jenkins API 交互,對於流水線構建來講,能夠在構建期間修改構建結果也是有必要的。對於其餘的,這使得流水線可使用構建步驟以及原先出自於自由風格的任務中的項目。

在一些狀況下,一個流水線步驟須要可以成功地完成,以便流水線能夠繼續正常執行,但對此而言可以標記有某種錯誤發生,所以,在可視化時可以識別到發生錯誤的步驟,即便沒有完全失敗。比較好的一個例子就是 junit 步驟。該步驟關注特定的測試結果,若是有任何錯誤,會把整個構建結果標記爲不穩定的。這種行爲對相似 BlueOcean 的可視化工具而言是有問題的,由於該步驟是成功的,並且沒法經過編程的方式覆蓋於該步驟相關的最終結果。

再次查看下 JENKINS-39203,咱們看到關於可視化有兩項基本的選項。由於有的步驟致使構建變成不穩定的,設置整體的構建結果是不穩定的,或者全部的步驟都成功完成來也展現爲不穩定的;或者因爲咱們沒有辦法把特定步驟相關的構建結果做設置,它們可能顯示爲成功的。最後,選擇了第一個選項。

爲了解決該問題,部分用戶嘗試經過拋出異常並在階段中增長 try/catch 這樣的代碼塊用於處理異常,這樣 Blue Ocean 可以藉助這些異常來標記步驟和階段的結果爲指望的狀態,並且,捕獲異常後,流水線能夠繼續正常執行。這種方式不容易理解,脆弱,並且沒法在申明式的流水線中使用。

開發者

若是你是一個插件的開發者,並在集成流水線時使用了步驟,想要利用這個新的 API 的話,你的步驟就能夠給出一個非成功的結果,而不是拋出異常。請查看 Jenkins 開發者郵件列表中的這個帖子,若是你遇到任何問題了,能夠在那裏提問。

相關文章
相關標籤/搜索