今天來讓我們介紹在 Jenkinsfile 中 for loop 的實現方式。
現在有一個 A 服務,我們需要監控 A 服務穩定性,而他的穩定性取決於他後面的 API (a server, b server, c server) 是否同時存活。判斷 server 的存活以 curl 每台 server
/healthz
的回傳是否正常為主。
依照之前介紹過的語法我們可以寫出類似下面的 Jenkinsfile
pipeline{
agent any
stages{
stage('check a server'){
steps{
sh 'curl http://a-server:8000/healthz'
}
}
stage('check b server'){
steps{
sh 'curl http://b-server:8000/healthz'
}
}
stage('check c server'){
steps{
sh 'curl http://c-server:8000/healthz'
}
}
}
}
但是應該可以簡單發現,上面的範例 Jenkinsfile 實在是寫的太冗長,且大部分行為都是相同的,故讓我們引入 for loop 的概念來改善 Jenkinsfile 吧。
將我們的 server 清單抽出成一個 list server_list = ['a', 'b', 'c']
,再將主要 health check 的邏輯抽成下列function, input(list) 為 server 清單,output 為多個 stage
def check_server_status(list) {
for (int i = 0; i < list.size(); i++) {
stage("${list[i]} server status"){
sh "curl http://${list[i]}-server:8000/healthz"
// testing
//echo "curl http://${list[i]}-server:8000/healthz"
}
}
}
最後整合成新的 pipeline 如下
server_list = ['a', 'b', 'c']
pipeline{
agent any
stages{
stage('check service status') {
steps{
check_server_status(server_list)
}
}
}
}
def check_server_status(list) {
for (int i = 0; i < list.size(); i++) {
stage("${list[i]} server status"){
sh "curl http://${list[i]}-server:8000/healthz"
// testing
//echo "curl http://${list[i]}-server:8000/healthz"
}
}
}
今天我們成功的將冗長的 Jenkinsfile 以更加精簡的方式修改,明天稍微變化一下今天的需求,再來看看要怎麼修改我們的 Pipeline 吧~
https://gist.github.com/oifland/ab56226d5f0375103141b5fbd7807398