script
: 用來包覆更複雜邏輯,但在一般的 pipeline 不會特別去使用。
回到昨天修改後的 Jenkinsfile 中,觀察 Jenkins pipeline 的介面,沒有辦法簡單看出剛剛的任務與任務之間的關係,因為 stage - check www.example.com response code
中包含了太多邏輯,因此今天主要我們就是來將他的內容進行拆分重組。
我們可以簡單觀察出整個 pipeline 的主要邏輯就是
curl -o /dev/null -s -w %{http_code} www.example.com
200
false
時,進行 telegram alarm。sh
,不但可以執行 shell script,也可以將執行結果進行儲存。sh "response_code=$(curl -o /dev/null -s -w %{http_code} www.example.com)"
// Jenkinsfile
等價於
response_code = sh (
script: "curl -o /dev/null -s -w %{http_code} www.example.com",
returnStdout: true
).toInteger()
// Jenkinsfile
if else
sh '''
......
if [ "${command}" != "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
'''
等價於
......
if ( response_code != 201 ) {
sh '''
message="www.example.com response code != 200."
curl -X GET https://api.telegram.org/bot${TOKEN}/sendMessage \
-d "chat_id=${GROUP_ID}&text=${message}"
'''
}
先來看結果
post
: 可以宣告當 pipeline 完成(包含因失敗而結束的狀態),需要做的行為宣告。
我們剛剛完成 stage - check www.example.com response code
各個步驟進行拆分,但是回到 Pipeline 的主頁面再次觀察,會發現整個流程看起來還是有點像黑盒子,因此這個階段讓我們將剛剛的步驟分別放到新的 stage 中。
大致規劃四個 Stage
pipeline {
agent any
stages {
stage ("Request website") {
steps{
script{
response_code = sh (
script: "curl -o /dev/null -s -w %{http_code} www.example.com",
returnStdout: true
).toInteger()
echo "${response_code}"
}
}
}
stage ("Check response code") {
steps{
script{
if ( response_code != 200 ){
sh "false"
}
}
}
}
}
post {
success{
echo "success"
}
failure{
script {
withCredentials([string(credentialsId: 'ithome-telegram-bot-token', variable: 'TOKEN')]){
withCredentials([string(credentialsId: 'ithome-telegram-notification-group', variable: 'GROUP_ID')]){
sh '''
message="www.example.com response code != 200."
curl -X GET https://api.telegram.org/bot${TOKEN}/sendMessage -d "chat_id=${GROUP_ID}&text=${message}"
'''
}
}
}
}
}
}
今天我們已大致完成 check-website-code 這條 Pipeline 的建置,明天來說明現實上會遇到的需求變更(天花亂墜)吧!