在持續(xù)集成的過程中,并行的執(zhí)行那些沒有依賴關(guān)系的任務(wù)可以縮短整個執(zhí)行過程古戴。Jenkins 的 pipeline 功能支持我們用代碼來配置持續(xù)集成的過程畜号。本文將介紹在 Jenkins 中使用聲明式 pipeline 語法完成任務(wù)的并行執(zhí)行。
Stage 內(nèi)的并行執(zhí)行
在聲明式 pipeline 版本 1.2 之前允瞧,這是唯一的并行方式简软,我們看一下代碼的寫法:
stage('run-parallel') {
steps {
parallel(
a: {
echo "task 1"
},
b: {
echo "task 2"
}
)
}
}
在同一個 stage 內(nèi)部,我們可以并行的執(zhí)行多個 step述暂。代碼中的 step a 和 b 會在同一臺 agent 上并行執(zhí)行痹升。但是我們可以看到,這種并行執(zhí)行的方式具有很大的局限性畦韭。首先因為 agent 只能在 stage 上設(shè)置疼蛾,所以這種方式不能在不同的 agent 上執(zhí)行并行的任務(wù)。其次并行執(zhí)行的粒度為 step 級別艺配,執(zhí)行點小任務(wù)還行察郁,但這樣的粒度對設(shè)計持續(xù)集成的流程來說明顯過小衍慎。所以,我們急需的是 stage 級別的并行執(zhí)行能力皮钠。
Stage 級別的并行執(zhí)行
在剛剛發(fā)布的聲明式 pipeline 版本 1.2 中稳捆,Jenkins 終于開始支持 stage 級別的并行執(zhí)行:
稍微有一點要求是你的 Jenkins 的版本要大于 2.7:
下面的實例代碼描述了如何執(zhí)行 stage 級別的并行任務(wù):
pipeline {
agent any
stages {
stage('Stage1') {
agent { label "test1" }
steps {
timestamps {
echo '這是第一個被執(zhí)行的 stage.'
sleep 5
}
}
}
stage('并行執(zhí)行的 Stage') {
parallel {
stage('Stage2.1') {
agent { label "test2" }
steps {
timestamps {
echo "在 agent test2 上執(zhí)行的并行任務(wù) 1."
sleep 5
echo "在 agent test2 上執(zhí)行的并行任務(wù) 1 結(jié)束."
}
}
}
stage('Stage2.2') {
agent { label "test3" }
steps {
timestamps {
echo "在 agent test3 上執(zhí)行的并行任務(wù) 2."
sleep 10
echo "在 agent test3 上執(zhí)行的并行任務(wù) 2 結(jié)束."
}
}
}
}
}
stage('Stage3') {
agent { label "test1" }
steps {
timestamps {
echo '這是最后一個被執(zhí)行的 stage.'
}
}
}
}
}
上面的代碼描述的執(zhí)行順序是 Stage1, 并行執(zhí)行的 Stage 和 Stage3麦轰。其中并行執(zhí)行的 Stage 包含兩個并行執(zhí)行的子 Stage乔夯,分別是 Stage2.1 和 Stage2.2,并且這兩個 Stage 被指定到了不同的 agent款侵。為了能夠在日志中顯示步驟執(zhí)行的時間末荐,我們使用了 Timestamper 插件。所有在 timestamps {} 塊中的命令都會在日志中顯示執(zhí)行時間新锈。好了甲脏,現(xiàn)在執(zhí)行上面的配置,然后查看執(zhí)行日志:
從日志中可看到妹笆,Stage.21 和 Stage2.2 中的任務(wù)在執(zhí)行時間上是重疊的块请,并且運行它們的 agent 也不一樣。
總結(jié)
Stage 級別的并行任務(wù)處理是非常有用的功能晾浴,尤其是在我們設(shè)計持續(xù)集成的流程時。讓一些可以并行的任務(wù)(比如不同平臺上的自動測試)同時執(zhí)行可以明顯縮短整個過程耗費的時間牍白,從而提升持續(xù)執(zhí)行的效能脊凰。
作者:sparkdev
出處:http://www.cnblogs.com/sparkdev/
歡迎進(jìn)群討論各種技術(shù)問題:238757010