干貨!Pipeline腳本穩定運行的核心設計思路
如果想要CI/CD持續穩定的運行,那么pipeline腳本的穩定性就是最核心的問題,那么如何才能讓pipeline腳本穩定的運行呢?就是應用異常!這里以腳本化Pipeline script為例進行講解,如果您使用聲明式pipeline script,請把異常處理機制放在script {}中(這里不對聲明式pipeline script做詳細介紹)。
編碼式Pipline的異常使用
Pipeline 處理異常的形式如下:
- node {
- sh './set-up.sh'
- try {
- sh 'might fail'
- echo 'Succeeded!'
- } catch (err) {
- echo "Failed: ${err}"
- } finally {
- sh './tear-down.sh'
- }
- echo 'Printed whether above succeeded or failed.'
- }
異常通用概念
在這里需要介紹一下異常相關的基礎概念:
Exception
檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略。
運行時異常:運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異常可以在編譯時被忽略。
Error
錯誤:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。下圖顯示了如何組織Groovy中的異常層次結構。它都基于Java中定義的層次結構。

try和catch的使用
方法使用try和catch關鍵字的組合捕獲異常。 try/catch塊放在可能生成異常的代碼周圍。
- try{
- //保護的代碼
- } catch(ExceptionName e1) {
- //處理異常的代碼
- }
可以有多個catch塊來處理多種類型的異常。對于每個catch塊,根據引發的異常類型,您將編寫代碼來相應地處理它。
- try {
- def arr = new int[3];
- arr[5] = 5;
- }
- catch(ArrayIndexOutOfBoundsExceptionex) {
- println("捕獲Array out of Bounds exception");
- }
- catch(IOException ex) {
- println("捕獲 io exception");
- }
結果輸出
捕獲Array out of Bounds exception
finally塊
finally塊遵循try塊或catch塊。無論發生異常,最終都會執行最后一段代碼。
- try {
- def arr = new int[3];
- arr[5] = 5;
- }
- catch(ArrayIndexOutOfBoundsExceptionex) {
- println("捕獲Array out of Bounds exception");
- }
- catch(IOException ex) {
- println("捕獲 io exception");
- }
- finally{
- println("執行final 塊");
- }
結果輸出
捕獲Array out of Boundsexception
執行final塊
備注:如果大家不確認具體的異常類型直接使用exception(或者exp)就可以,因為它是各種exception的父類!
error的處理
當我們需要處理錯誤(錯誤不是異常,而是脫離程序員控制的問題。)的時候,就需要使用error(或者err)了。
- try {
- //保護的代碼
- }
- catch(error) {
- //處理錯誤的代碼
- }
穩定代碼的設計核心點
如果想使我們的代碼穩定運行,既處理異常又捕獲error,可以這樣處理
- try {
- //保護的代碼
- }
- catch(err) {
- //處理錯誤的代碼
- }
- catch(exp){
- //處理異常的代碼
- }
在pipeline中的應用如下所示,這樣設計可以確保我們的pipeline穩定運行。
- node {
- try {
- //pipeline運行的腳本
- }
- catch(err) {
- //處理pipeline中代碼的異常
- }
- catch(exp){
- //處理pipeline中遇到的錯誤信息
- }
- }

























