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

在持續集成的過程當中,並行的執行那些沒有依賴關係的任務能夠縮短整個執行過程。Jenkins 的 pipeline 功能支持咱們用代碼來配置持續集成的過程。本文將介紹在 Jenkins 中使用聲明式 pipeline 語法完成任務的並行執行。測試

Stage 內的並行執行

在聲明式 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 級別的並行執行能力。插件

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

相關文章
相關標籤/搜索