Jenkins 在宣告式 pipeline 中並行執行任務
在持續整合的過程中,並行的執行那些沒有依賴關係的任務可以縮短整個執行過程。Jenkins 的 pipeline 功能支援我們用程式碼來配置持續整合的過程。 本文將介紹在 Jenkins 中使用宣告式 pipeline 語法完成任務的並行執行。
Stage 內的並行執行
在宣告式 pipeline 版本 1.2 之前,這是唯一的並行方式,我們看一下程式碼的寫法:
stage('run-parallel') { steps { parallel( a: { echo "task 1" }, b: { echo "task 2" } ) } }
在同一個 stage 內部,我們可以並行的執行多個 step。程式碼中的 step a 和 b 會在同一臺 agent 上並行執行。但是我們可以看到,這種並行執行的方式具有很大的侷限性。首先因為 agent 只能在 stage 上設定,所以這種方式不能在不同的 agent 上執行並行的任務。其次並行執行的粒度為 step 級別,執行點小任務還行,但這樣的粒度對設計持續整合的流程來說明顯過小。所以,我們急需的是 stage 級別的並行執行能力。
Stage 級別的並行執行
在剛剛釋出的宣告式 pipeline 版本 1.2 中,Jenkins 終於開始支援 stage 級別的並行執行:

稍微有一點要求是你的 Jenkins 的版本要大於 2.7:

下面的例項程式碼描述瞭如何執行 stage 級別的並行任務:
pipeline { agent any stages { stage('Stage1') { agent { label "test1" } steps { timestamps { echo '這是第一個被執行的 stage.' sleep 5 } } } stage('並行執行的 Stage') { parallel { stage('Stage2.1') { agent { label "test2" } steps { timestamps { echo "在 agent test2 上執行的並行任務 1." sleep 5 echo "在 agent test2 上執行的並行任務 1 結束." } } } stage('Stage2.2') { agent { label "test3" } steps { timestamps { echo "在 agent test3 上執行的並行任務 2." sleep 10 echo "在 agent test3 上執行的並行任務 2 結束." } } } } } stage('Stage3') { agent { label "test1" } steps { timestamps { echo '這是最後一個被執行的 stage.' } } } } }
上面的程式碼描述的執行順序是 Stage1, 並行執行的 Stage 和 Stage3。其中並行執行的 Stage 包含兩個並行執行的子 Stage,分別是 Stage2.1 和 Stage2.2,並且這兩個 Stage 被指定到了不同的 agent。為了能夠在日誌中顯示步驟執行的時間,我們使用了 Timestamper 外掛。所有在 timestamps {} 塊中的命令都會在日誌中顯示執行時間。好了,現在執行上面的配置,然後檢視執行日誌:

從日誌中可看到,Stage.21 和 Stage2.2 中的任務在執行時間上是重疊的,並且執行它們的 agent 也不一樣。
總結
Stage 級別的並行任務處理是非常有用的功能,尤其是在我們設計持續整合的流程時。讓一些可以並行的任務(比如不同平臺上的自動測試)同時執行可以明顯縮短整個過程耗費的時間,從而提升持續執行的效能。
作者:sparkdev
出處: ofollow,noindex">http://www.cnblogs.com/sparkdev/
歡迎進群討論各種技術問題:238757010