昨天說 "Jenkins 可能會突然死去",就在今天 GitLab 在 19:00 ~ 22:00 進入維運模式,導致我們公司因為 SCM 失敗而使得眾多 Pipeline 直接見紅,在此紀錄一下 QQ
不說了 ...... 回到正題,今天讓我們一起學習 Jenkinsfile 的寫法吧 ~
回到我們最初的 Jenkinsfile,可以大致用 {}
來切分各個區塊以及從屬狀態,這邊利用 IDE 就可以簡單地觀察出階層關係。
pipeline
是整個 Jenkinsfile 最核心的語法,我們需要在 pipeline
的區塊內完整撰寫出我們的 pipeline 流程。
agent
用來宣告我們 pipeline 想要在哪一個 jenkins 節點上進行執行,也可以根據每一個 stage 分別宣吿個別的執行節點。常見的幾個寫法:
agent any
: 代表的是 pipeline 執行可以在任意節點執行。 agent {label "[LABEL]"}
: 指定 pipeline 執行需要在指定的主機類型來執行。agent none
: 代表的是 pipeline 執行暫時不指定任何節點執行。(如果是agent none
的話,會需要在 stage 下指定 agent 不然在 pipeline 執行的時候,jenkins 報錯。)pipeline {
agent none
stages {
stage ("job 1") {
agent {label "master"}
......
}
stage ("job 2") {
agent any
......
}
}
}
更多的 agent 類型宣告請參考 Jenkins 官方網站介紹
stages
實際處理 pipeline 內部流程。stage
細部處理每一個步驟的邏輯宣告。一般來說一個 stages
會有多個 stage
。steps
可以定義在每一個 stage
內更細部的流程安排。pipeline {
agent any
stages {
stage ("Stage 1") {
steps{
echo "Stage 1 - command 1"
echo "Stage 1 - command 2"
echo "Stage 1 - command 3"
}
}
stage ("Stage 2") {
steps{
echo "Stage 2 - command 1"
echo "Stage 2 - command 2"
}
}
}
}
echo
跟在 linux 中的 echo 指令一樣,可以用來打印訊息。sh
可用來執行 shell script 或 linux 指令。現在接到一個業務需求,希望我們去監控 www.example.com 是否可被正常訪問 (Response code 200)。當不能被正常訪問時發出 telegram 告警。
我們用今天介紹到的 Jenkinsfile 語法,以及 linux 即可組合出下列 Pipeline。
Github Link
pipeline {
agent any
stages {
stage ("Check www.example.com response code") {
steps{
sh '''
TOKEN="test-token"
GROUP_ID="-000000000"
CODE=$(curl -o /dev/null -s -w %{http_code} www.example.com)
if [ "${CODE}" != "200" ]; then
message="www.example.com response code != 200."
curl -X GET "https://api.telegram.org/bot${TOKEN}/sendMessage" \
-d "chat_id=${GROUP_ID}&text=${message}"
fi
'''
}
}
}
}
+ TOKEN=test-token
+ GROUP_ID=-000000000
+ curl -o /dev/null -s -w %{http_code} www.example.com
+ CODE=200
+ [ 200 != 200 ]
今天我們利用 Jenkinsfile 基礎元件,組合出第一個實際可被運行的 pipeline,但是目前可以發現還有幾點可以優化
sh
包含的內容過於複雜(test response code + alert)為符合職責單一原則,導致閱讀上有障礙。明天讓我們介紹新的 Jenkinsfile 元件來進行這個 website-code pipeline 的優化吧。