Jenkins實踐指南-07-pipeline 內置基礎步驟

3.3 pipeline 內置基礎步驟

3.3.1 pipeline中使用腳本

    [作者:Surpassme]在實際項目,可能在某些步驟需要使用少量的腳本,這個時候可以使用script來實現,示例如下所示:

pipeline{
    agent any
    stages{
        stage("Script demo"){
            steps{
                script{
                    def personInfo=["Surpass",28,"Shanghai"]
                    for(int i=0;i<personInfo.size();i++){
                        echo "current item is ${personInfo[i]}"
                    }
                }
            }
        }
    }
}

    [作者:Surpassme]script 裏面實際運行就是Groovy代碼,如果script裏面需要大量的代碼,需要進行拆分到不同的階段或者使用共享庫來實現。

3.3.2 pipeline內置步驟

3.3.2.1 目錄和文件相關步驟

  • dir

    [作者:Surpassme]主要功能是切換目錄,默認pipeline是運行其工作目錄中,使用該dir可以切換到其他目錄

  • deleteDir

    [作者:Surpassme]主要功能是刪除當前目錄,是一個無參步驟,通常與dir一起使用。示例如下所示:

pipeline{
    agent any
    stages{
        stage("delete dir demo"){
            steps{
                  dir("/var/log/jenkins"){
                     echo "delete dir /var/log/jenkins"
                     deleteDir()
                }
            }
        }
    }
}
  • fileExists

    [作者:Surpassme]主要功能是判斷文件是否存在,支持絕對路徑相對路徑,結果返回boolean類型,示例如下所示:

pipeline{
    agent any
    stages{
        stage("check file exists demo"){
            when {
                   expression {
                        return fileExists("/etc/hosts")
                    }
                }
            steps{
                echo "file /etc/hosts exists"
            }
        }
    }
}

  或

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("check file exists demo"){
            steps{
                script {
                    println "check /etc/hosts exists"
                    def ret=fileExists("/etc/hosts")
                    println "ret is ${ret}"
                }
            }
        }
    }
}

    運行結果如下所示:

  • isUnix

    [作者:Surpassme]主要功能是判斷是否爲UNIX系統,結果返回boolean類型,示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("check os type demo"){
            steps{
                script {
                    println "check os type"
                    def isUnix=isUnix()
                    println "isUnix:${isUnix}"
                }
            }
        }
    }
}
  • pwd

    [作者:Surpassme]主要功能是打印當前目錄,與Linux中pwd命令類似,示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("print current workdir demo"){
            steps{
                script {
                    println "print current workdir "
                    def curDir=pwd()
                    println "current workdir is:${curDir}"
                }
            }
        }
    }
}

    運行結果如下所示:

pwd還有一個boolean類型的可選參數,示例爲:pwd(tmp:true),用於打印與當前工作空間關聯的臨時目錄

  • writeFile

    [作者:Surpassme]主要功能是將指定內容寫入文件,其主要參數如下所示:
    file:文件路徑,支持絕對路徑相對路徑
    text:寫入文件的數據
    encoding:爲可選參數,寫入文件的編碼格式,如果爲空,則默認使用系統默認的編碼。

  • readFile

    [作者:Surpassme]主要功能是將指定內容讀取文件,其主要參數如下所示:
    file:文件路徑,支持絕對路徑相對路徑
    encoding:爲可選參數,讀取文件的編碼格式,如果爲空,則默認使用系統默認的編碼。

    writeFilereadFile 示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    parameters{
        string(name:"filePath",
               defaultValue:"/var/log/surpass.log",
               description:"read and write file demo"
               )
    }
    stages{
        stage("write and read file demo"){
            steps{
                script {
                    writeFile(
                        file:"${params.filePath}",
                        text:"name:Surpass\nage:28\nlocation:Shanghai\n",
                        encoding:"utf8"
                        )
                    def content=readFile(
                        file:"${params.filePath}",
                        encoding:"utf8"
                        )
                    println "read file:${params.filePath}\nContent is\n${content}"
                }
            }
        }
    }
}

    運行結果如下所示:

3.3.2.2 命令相關步驟

    [作者:Surpassme]pipeline 支持的命令相關步驟主要涉及到命令shbatpowershell,sh主要用於Unix/Linux,bat和powershell主要用於Windows,三者支持參數一樣,我們主要以sh爲例,主要參數如下所示:

  • script: 要運行的腳本
  • encoding: 腳本運行後輸出日誌的編碼,默認爲系統編碼
  • returnStatus: boolean類型,默認值爲腳本返回的狀態碼,如果返回是非零值,則觸發pipeline運行失敗,如果returnStatus爲true,則忽略返回的狀態碼值,pipeline不受其影響
  • returnStdout: boolean類型,如果returnStdout爲true,則標準輸出將做爲返回值,而不是打印到構建日誌中。

returnStatus 和 returnStdout 兩個參數一般不會同時使用,如果同時使用,則只有 returnStatus 參數生效。示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("run script cmd demo"){
            steps{
                script {
                    println "將sh的返回值做爲參數使用"
                    def getReturnResult=sh(
                        script:"date '+%Y%m%d-%H%M%S'",
                        encoding:"utf8",
                        returnStdout:true
                        )
                    println "getReturnResult is ${getReturnResult}"

                    sh(
                        script:"ls /var/log/suprass.txt",
                        encoding:"utf8",
                        returnStatus:false
                        )
                }
            }
        }
    }
}

    運行結果如下所示:

    爲了做對比,修改returnStatus爲true

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("run script cmd demo"){
            steps{
                script {
                    println "將sh的返回值做爲參數使用"
                    def getReturnResult=sh(
                        script:"date '+%Y%m%d-%H%M%S'",
                        encoding:"utf8",
                        returnStdout:true
                        )
                    println "getReturnResult is ${getReturnResult}"

                    sh(
                        script:"ls /var/log/suprass.txt",
                        encoding:"utf8",
                        returnStatus:true
                        )
                }
            }
        }
    }
}

    運行結果如下所示:

3.3.2.3 其他相關步驟

  • error

    [作者:Surpassme]用於主動報錯,中止pipeline的運行,主要有一個參數message,示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("throw error demo"){
            steps{
                script {
                    println "主動拋出異常示例"
                    error(
                        message:"主動拋出異常示例"
                        )
                }
            }
        }
    }
}

    運行結果如下所示:

  • timeout

    [作者:Surpassme]用於爲被timeout包含的代碼塊設置超時時間。主要支持的參數如下所示:
    time:整型,超時時間
    unit可選參數,爲時間單位,支持的值有NANOSECONDSMICROSECONDSMILLISECONDDS
        SECONDSMINUTES(默認)HOURSDAYS
    activity可選參數,如果爲true,則代表在日誌沒有活動後,纔算作超時。

    示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("timeout demo"){
            steps{
                script {
                    timeout(time:1,unit:"NANOSECONDS"){
                        sh(
                            script:"sleep 10",
                            encoding:"utf8",
                            returnStatus:true
                        )
                    }
                }
            }
        }
    }
}

    運行結果如下所示:

  • waitUntil

    [作者:Surpassme]不斷重複運行waitUntil裏面的代碼,直至條件爲true。waitUntil不負責處理代碼裏面的異常異常,若遇到錯誤,則直接拋出異常。

    示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("waitUntil demo"){
            steps{
                script {
                    timeout(time:1,unit:"SECONDS"){
                       waitUntil{
                            def statusCodes=sh(
                                    script:"curl -X GET -o /dev/null -I -s -w %{http_code} https://www.baidu.com/",
                                    encoding:"utf8",
                                    returnStdout:true
                                )
                            println "status code is ${statusCodes}"
                            def ret=(statusCodes == 400)
                            println "ret is ${ret}"
                            return ret
                        }
                    }
                }
            }
        }
    }
}

    運行結果如下所示:

waitUntil [作者:Surpassme]一般常與 timeout 一起使用,從而避免死循環

  • retry

    [作者:Surpassme]將被retry包含的腳本按指定次數重複執行。如果其中某一次出現異常,則中止本次執行,再次進行下一次執行。示例如下所示:

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("retry demo"){
            steps{
                script {
                    retry(3){
                        sh(
                          script:"echo surpass",
                          encoding:"utf8",
                          returnStatus:true
                        )
                        error(
                          message:"throw error"
                        )
                    }
                }
            }
        }
    }
}

    運行結果如下所示:

  • sleep

    [作者:Surpassme]sleep 與Linux中的sleep命令類似,一般用於暫停pipeline,其支持的參數如下所示:
    time:整型,超時時間
    unit可選參數,爲時間單位,支持的值有NANOSECONDSMICROSECONDSMILLISECONDDS
        SECONDS(默認)MINUTESHOURSDAYS

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("timeout demo"){
            steps{
                script {
                    sleep(
                       time:10,
                       unit:"SECONDS"
                        )
                    println "after pause 10s"
                }
            }
        }
    }
}

    運行結果如下所示:

原文地址:https://www.jianshu.com/p/e99708a14aa0

本文同步在微信訂閱號上發佈,如各位小夥伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼添加關注:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章