在持續集成的過程當中,並行的執行那些沒有依賴關係的任務能夠縮短整個執行過程。Jenkins 的 pipeline 功能支持咱們用代碼來配置持續集成的過程。本文將介紹在 Jenkins 中使用聲明式 pipeline 語法完成任務的並行執行。測試
在聲明式 pipeline 版本 1.2 以前,這是惟一的並行方式,咱們看一下代碼的寫法:spa
stage('run-parallel') { steps { parallel( a: { echo "task 1" }, b: { echo "task 2" } ) } }
在同一個 stage 內部,咱們能夠並行的執行多個 step。代碼中的 step a 和 b 會在同一臺 agent 上並行執行。可是咱們能夠看到,這種並行執行的方式具備很大的侷限性。首先由於 agent 只能在 stage 上設置,因此這種方式不能在不一樣的 agent 上執行並行的任務。其次並行執行的粒度爲 step 級別,執行點小任務還行,但這樣的粒度對設計持續集成的流程來講明顯太小。因此,咱們急需的是 stage 級別的並行執行能力。插件
在剛剛發佈的聲明式 pipeline 版本 1.2中,Jenkins 終於開始支持 stage 級別的並行執行:設計
稍微有一點要求是你的 Jenkins 的版本要大於 2.7:3d
下面的實例代碼描述瞭如何執行 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 {} 塊中的命令都會在日誌中顯示執行時間。好了,如今執行上面的配置,而後查看執行日誌:code
從日誌中可看到,Stage.21 和 Stage2.2 中的任務在執行時間上是重疊的,而且運行它們的 agent 也不同。blog
Stage 級別的並行任務處理是很是有用的功能,尤爲是在咱們設計持續集成的流程時。讓一些能夠並行的任務(好比不一樣平臺上的自動測試)同時執行能夠明顯縮短整個過程耗費的時間,從而提高持續執行的效能。ip