今天來讓我們介紹在 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