iT邦幫忙

2022 iThome 鐵人賽

DAY 6
3
DevOps

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

第六天 Jenkins 之旅:Jenkinsfile 語法介紹(3)

  • 分享至 

  • xImage
  •  

Refactor


script: 用來包覆更複雜邏輯,但在一般的 pipeline 不會特別去使用。


回到昨天修改後的 Jenkinsfile 中,觀察 Jenkins pipeline 的介面,沒有辦法簡單看出剛剛的任務與任務之間的關係,因為 stage - check www.example.com response code 中包含了太多邏輯,因此今天主要我們就是來將他的內容進行拆分重組。
step 0 screen shot

Step 0

我們可以簡單觀察出整個 pipeline 的主要邏輯就是

  1. 去 requests 網址 curl -o /dev/null -s -w %{http_code} www.example.com
  2. 將 response code 進行判斷是否為 200
  3. 根據第二點的判斷式,當為 false 時,進行 telegram alarm。

workflow

Step 1

  • 在 Jenkinsfile 中的 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
  • 接者使用 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}"
    '''
}

先來看結果
step 1 screen shot

Step 2


post: 可以宣告當 pipeline 完成(包含因失敗而結束的狀態),需要做的行為宣告。


我們剛剛完成 stage - check www.example.com response code 各個步驟進行拆分,但是回到 Pipeline 的主頁面再次觀察,會發現整個流程看起來還是有點像黑盒子,因此這個階段讓我們將剛剛的步驟分別放到新的 stage 中。
day 6 pipeline

大致規劃四個 Stage

  1. Declarative: Checkout SCM : 同步指定版本的 source code。
  2. Request website:專注於訪問指定網址,並取得 response code。
  3. Check response code:專注於判斷 response code 是否如預期,非真則拋出錯誤。
  4. Declarative Post Actions:取得 stages 的 exit code ,並產生對應行為。

step 2 flow

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

day6 final screen shot

小結

今天我們已大致完成 check-website-code 這條 Pipeline 的建置,明天來說明現實上會遇到的需求變更(天花亂墜)吧!

Github 專案連結

ithome-jenkins

參考連結

Jenkins syntax -post


上一篇
第五天 Jenkins 之旅:Jenkinsfile 語法介紹(2)
下一篇
第七天 Jenkins 之旅:Jenkinsfile 語法介紹(4)
系列文
從零開始的 Jenkins 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言