今天來讓我們介紹在 Jenkinsfile 中 parallel 的實現方式。
現在有一個 A 服務,我們需要監控 A 服務穩定性,而他的穩定性取決於他後面的API (a server, b server, c server) 是否同時存活。判斷 server 的存活以 curl 每台 server
/healthz
的回傳是否正常為主。
昨日我們以 for loop 的方式實現上述監控的需求,但是會有個隱憂 - 在 for loop 當中,如果第一台 a server 的 healthz 沒過,讓後面的 stage 會直接判定失敗。Stage "check b server" skipped due to earlier failure(s)
這會導致我們無法準確的判斷到底是一個 server 出問題,還是所有 server 都出問題,需要點到 console log 才能確認,因此會造成我們處理時間被拉長,因此在 Jenkinsfile 中有一個語法可以避免這個狀況的發生 - parallel
可以從上圖觀察出,雖然以結果來說皆為失敗,但是我們可以簡單判斷第二張圖的 pipeline 看出只有 a server 出狀況,因此我們只要去處理 a server 的問題即可。但是第一張圖的 pipeline 中,只能發現 a server 有出狀況,至於 b c server 是不是正常,還需要等 a server 的問題處理完才能判斷。
因此下面以 parallel
來修改昨天的 pipeline
def server_list = [
"a",
"b",
"c"
]
def parallelStagesMap = server_list.collectEntries {
["${it}" : generateStage(it)]
}
def generateStage(server) {
return {
stage("${server} server status") {
script {
sh "curl http://${server}-server:8000/healthz"
}
}
}
}
pipeline {
agent any
stages {
stage('check service status') {
steps {
script {
parallel parallelStagesMap
}
}
}
}
}
https://www.jenkins.io/doc/book/pipeline/syntax/
https://gist.github.com/sheeeng/8d9274ccd9f9d6370feba6f5888f5dee