iT邦幫忙

2022 iThome 鐵人賽

DAY 12
2
DevOps

從零開始的 Jenkins 之旅系列 第 12

第十二天 Jenkins 之旅: Parallel

  • 分享至 

  • xImage
  •  

前言

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

https://ithelp.ithome.com.tw/upload/images/20220912/20151613FqqQmtsnOr.png

這會導致我們無法準確的判斷到底是一個 server 出問題,還是所有 server 都出問題,需要點到 console log 才能確認,因此會造成我們處理時間被拉長,因此在 Jenkinsfile 中有一個語法可以避免這個狀況的發生 - parallel

for loop

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
                }
            }
        }
    }
}

Github 專案連結

ithome-jenkins

參考資料

https://www.jenkins.io/doc/book/pipeline/syntax/
https://gist.github.com/sheeeng/8d9274ccd9f9d6370feba6f5888f5dee


上一篇
第十一天 Jenkins 之旅:For loop
下一篇
第十三天 Jenkins 之旅:Parameter
系列文
從零開始的 Jenkins 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言