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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM