Jenkins | jenkins pipeline build job
在撰寫PipelineJob時,很多時候工作是沒有順序相依關係,如果純用stage逐一處理,略顯效率不彰。本篇將介紹Jenkins使用Groovy撰寫PipelineJob的平行處理。GroovyScript假設以下範例,三個stage沒有相依關係:123456789stage("Task1"){}stage("Task2"){}stage("Task3"){}若沒有相依關係就可以改成平行處理,平行處理透過調用parallel方法實現。parallel調用是以String為key,DelegateMethod為Value。範例如下:1234567891011121314151617parallel("Task1":{stage("Task1"){}},"Task2":{stage("Task2"){}},"Task3":{stage("Task3"){}})...
在撰寫 Pipeline Job 時,很多時候工作是沒有順序相依關係,如果純用 stage 逐一處理,略顯效率不彰。本篇將介紹 Jenkins 使用 Groovy 撰寫 Pipeline Job 的平行處理。
Groovy Script假設以下範例,三個 stage 沒有相依關係:
123456789stage("Task 1") { }stage("Task 2") { }stage("Task 3") { }若沒有相依關係就可以改成平行處理,平行處理透過調用 parallel 方法實現。parallel 調用是以 String 為 key, Delegate Method 為 Value。範例如下:
1234567891011121314151617parallel ( "Task 1": { stage("Task 1") { } }, "Task 2": { stage("Task 2") { } }, "Task 3": { stage("Task 3") { } })動態增加工作可以自行建立 HashMap,再把 HashMap 傳入 parallel 方法。範例如下:
1234567891011def tasks = [:]for (int i = 0; i < 5; i++) { tasks["Task ${i+1}"] = { stage("Task ${i+1}") { echo "Task ${i+1}" } }}parallel(tasks)實際執行上面範例,會發現不如預期所想,echo 內容預期應該要是:
12345Task 1Task 2Task 3Task 4Task 5實際上 echo 內容卻是:
12345Task 6Task 6Task 6Task 6Task 6主要是因為 Delegate Method 使用的外部變數,在執行 parallel 時,早就跑完迴圈被改成 6 了。如果真的想要在 Delegate Method 取得外部變數,建議另外用區域變數儲存,避免外部變數在執行前被改變。如下:
12345...