溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Jenkins可視化階段視圖的改進(jìn)是什么

發(fā)布時(shí)間:2021-12-22 16:32:41 來源:億速云 閱讀:145 作者:小新 欄目:云計(jì)算

小編給大家分享一下Jenkins可視化階段視圖的改進(jìn)是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Jenkins 可視化階段視圖的改進(jìn)

流水線除了成功或失敗以外,還有一種介于兩者之間的狀態(tài)

最近發(fā)布了的一些變更給了流水線編輯者新的工具以改善在 Blue Ocean 中的流水線可視化,有一個(gè)備受矚目關(guān)注的工單JENKINS-39203,這會(huì)導(dǎo)致當(dāng)流水線的構(gòu)建結(jié)果為不穩(wěn)定時(shí)所有的階段都被設(shè)置為不穩(wěn)定的。這個(gè)缺陷導(dǎo)致無法快速地識(shí)別為什么構(gòu)建是不穩(wěn)定的,使得用戶必須查看完整的日志和 Jenkinsfile 才能弄明白究竟發(fā)生了什么。

為了修復(fù)這個(gè)問題,我們引入了一個(gè)新的流水線 API 用于為單個(gè)流水線步驟添加額外的結(jié)果信息。像 Blue Ocean 這樣的可視化工具在決定階段如何顯示時(shí)會(huì)使用到這新的 API。像 junit 這樣的步驟只能設(shè)置整個(gè)構(gòu)建結(jié)果,現(xiàn)在可以通過新的 API 設(shè)置步驟級別的結(jié)果信息。我們創(chuàng)建了新的步驟 unstable 和 warnError,這樣流水線編輯者在更復(fù)雜的場景下仍然可以利用這個(gè)新的 API。

該問題涉及到的重要的修復(fù)包含在如下的插件中,它們都需要 Jenkins 2.138.4 以及更新的版本:

  • 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 中的截圖,只會(huì)把失敗的階段標(biāo)識(shí)為不穩(wěn)定的:

Jenkins可視化階段視圖的改進(jìn)是什么

例子

這里給出一些如何在你的流水線中使用該特性的示例:

  • 使用新的步驟 warnError 用于捕獲錯(cuò)誤,并把構(gòu)建和階段標(biāo)記為不穩(wěn)定的。 warnError 只需要一個(gè) 字符串 的參數(shù),用于當(dāng)捕獲到錯(cuò)誤時(shí)以日志的形式輸出。當(dāng) warnError 捕獲到一個(gè)錯(cuò)誤時(shí),它會(huì)記錄該消息以及錯(cuò)誤,并設(shè)置構(gòu)建和階段的結(jié)果為不穩(wěn)定的。效果如下:

warnError('Script failed!') {
  sh('false')
}
  • 使用新的步驟 unstable 設(shè)置構(gòu)建和階段結(jié)果為不穩(wěn)定的。可以使用該步驟直接替換 currentBuild.result = 'UNSTABLE',在 warnError 不夠靈活時(shí)這會(huì)比較有用。步驟 unstable 只需要一個(gè) 字符串 參數(shù),當(dāng)該步驟運(yùn)行時(shí)會(huì)作為消息。使用的方法如下:

try {
  sh('false')
} catch (ex) {
  unstable('Script failed!')
}
  • JUnit Plugin: 更新到 1.28 或者更高的版本,使得步驟 junit 可以直接把該階段設(shè)置為不穩(wěn)定的。

  • Warnings Next Generation Plugin: 更新到 5.2.0 或者更高的版本,使得步驟 publishIssues 和 recordIssues可以直接把該階段設(shè)置為不穩(wěn)定的。

  • 其他插件: 如果你的流水線被其他插件中的步驟標(biāo)記為不穩(wěn)定的,請(在檢查沒有重復(fù)項(xiàng)后)給該組件提交一個(gè)新的 issue,清晰地描述哪個(gè)步驟是有問題的,以及發(fā)生問題的環(huán)境,并添加鏈接到該文章的開發(fā)者區(qū)域,以便維護(hù)者了解如何才能解決該問題。

局限

  • 如果你不遷移到 unstable 或 warnError 步驟,或不升級插件到集成來新 API 的情況下設(shè)置構(gòu)建狀態(tài),那么即使構(gòu)建是不穩(wěn)定的,Blue Ocean 也不會(huì)把任何階段顯示為不穩(wěn)定的。

  • 即使在這些變化后,currentBuild.result 繼續(xù)只會(huì)覆蓋構(gòu)建狀態(tài)。不幸的是,由于 currentBuild 是作為全局變量而實(shí)現(xiàn)的,因此,無法讓它設(shè)置步驟或者階段級別的結(jié)果,這意味這它沒有任何步驟級別的上下文可以使用到新的 API。

  • Pipeline Stage View Plugin 尚未升級到使用這個(gè)新的 API,因此,這些變更不會(huì)在它提供的可視化中得到體現(xiàn)。

歷史

Jenkins 流水線步驟可以以兩種方式完成:成功并返回一個(gè)結(jié)果(可能為 null),或者是失敗的,并拋出一個(gè)異常。當(dāng)步驟失敗并拋出異常時(shí),該異常會(huì)貫穿整個(gè)流水線,直到有其他的步驟或者 Groovy 代碼捕獲,或者它到達(dá)流水線的頂層并導(dǎo)致流水線失敗?;趻伋龅漠惓5牟煌愋?,流水線最終的結(jié)果可能不是失?。ɡ纾耗承┣闆r下是被終止的)?;诋惓鞑サ姆绞?,像 Blue Ocean 這樣的工具可以輕松地識(shí)別哪些步驟(以及階段)是失敗的。

為了能夠讓流水線能夠與相應(yīng)的 Jenkins API 交互,對于流水線構(gòu)建來說,可以在構(gòu)建期間修改構(gòu)建結(jié)果也是有必要的。對于其他的,這使得流水線可以使用構(gòu)建步驟以及原先出自于自由風(fēng)格的任務(wù)中的項(xiàng)目。

在一些情況下,一個(gè)流水線步驟需要能夠成功地完成,以便流水線可以繼續(xù)正常執(zhí)行,但對此而言能夠標(biāo)記有某種錯(cuò)誤發(fā)生,因此,在可視化時(shí)能夠識(shí)別到發(fā)生錯(cuò)誤的步驟,即使沒有徹底失敗。比較好的一個(gè)例子就是 junit 步驟。該步驟關(guān)注特定的測試結(jié)果,如果有任何錯(cuò)誤,會(huì)把整個(gè)構(gòu)建結(jié)果標(biāo)記為不穩(wěn)定的。這種行為對類似 BlueOcean 的可視化工具而言是有問題的,因?yàn)樵摬襟E是成功的,而且無法通過編程的方式覆蓋于該步驟相關(guān)的最終結(jié)果。

再次查看下 JENKINS-39203,我們看到關(guān)于可視化有兩項(xiàng)基本的選項(xiàng)。因?yàn)橛械牟襟E導(dǎo)致構(gòu)建變成不穩(wěn)定的,設(shè)置總體的構(gòu)建結(jié)果是不穩(wěn)定的,或者所有的步驟都成功完成來也展示為不穩(wěn)定的;或者由于我們沒有辦法把特定步驟相關(guān)的構(gòu)建結(jié)果作設(shè)置,它們可能顯示為成功的。最后,選擇了第一個(gè)選項(xiàng)。

為了解決該問題,部分用戶嘗試通過拋出異常并在階段中增加 try/catch 這樣的代碼塊用于處理異常,這樣 Blue Ocean 能夠借助這些異常來標(biāo)記步驟和階段的結(jié)果為期望的狀態(tài),而且,捕獲異常后,流水線可以繼續(xù)正常執(zhí)行。這種方式不容易理解,脆弱,而且無法在申明式的流水線中使用。

    以上是“Jenkins可視化階段視圖的改進(jìn)是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI