1. 程式人生 > >Jenkins 在聲明式 pipeline 中並行執行任務

Jenkins 在聲明式 pipeline 中並行執行任務

方式 實例代碼 任務 span 使用 images 代碼 依賴關系 step

在持續集成的過程中,並行的執行那些沒有依賴關系的任務可以縮短整個執行過程。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 級別的並行任務處理是非常有用的功能,尤其是在我們設計持續集成的流程時。讓一些可以並行的任務(比如不同平臺上的自動測試)同時執行可以明顯縮短整個過程耗費的時間,從而提升持續執行的效能。

Jenkins 在聲明式 pipeline 中並行執行任務