干貨!Pipeline腳本穩(wěn)定運行的核心設(shè)計思路
如果想要CI/CD持續(xù)穩(wěn)定的運行,那么pipeline腳本的穩(wěn)定性就是最核心的問題,那么如何才能讓pipeline腳本穩(wěn)定的運行呢?就是應(yīng)用異常!這里以腳本化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.'
- }
異常通用概念
在這里需要介紹一下異常相關(guān)的基礎(chǔ)概念:
Exception
檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預(yù)見的。例如要打開一個不存在文件時,一個異常就發(fā)生了,這些異常在編譯時不能被簡單地忽略。
運行時異常:運行時異常是可能被程序員避免的異常。與檢查性異常相反,運行時異??梢栽诰幾g時被忽略。
Error
錯誤:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中通常被忽略。例如,當(dāng)棧溢出時,一個錯誤就發(fā)生了,它們在編譯也檢查不到的。下圖顯示了如何組織Groovy中的異常層次結(jié)構(gòu)。它都基于Java中定義的層次結(jié)構(gòu)。

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