Jenkins實踐指南-07-pipeline 內(nèi)置基礎(chǔ)步驟

3.3 pipeline 內(nèi)置基礎(chǔ)步驟

3.3.1 pipeline中使用腳本

? ? 在實際項目,可能在某些步驟需要使用少量的腳本,這個時候可以使用script來實現(xiàn),示例如下所示:

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

? ? script 里面實際運行就是Groovy代碼,如果script里面需要大量的代碼,需要進行拆分到不同的階段或者使用共享庫來實現(xiàn)。

3.3.2 pipeline內(nèi)置步驟

3.3.2.1 目錄和文件相關(guān)步驟

  • dir

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

  • deleteDir

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

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

? ? 主要功能是判斷文件是否存在,支持絕對路徑相對路徑,結(jié)果返回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}"
                }
            }
        }
    }
}

? ? 運行結(jié)果如下所示:

0313 fileExists示例.png
  • isUnix

? ? 主要功能是判斷是否為UNIX系統(tǒng),結(jié)果返回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

? ? 主要功能是打印當前目錄,與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}"
                }
            }
        }
    }
}

? ? 運行結(jié)果如下所示:

0314 pwd示例.png

pwd還有一個boolean類型的可選參數(shù),示例為:pwd(tmp:true),用于打印與當前工作空間關(guān)聯(lián)的臨時目錄

  • writeFile

? ? 主要功能是將指定內(nèi)容寫入文件,其主要參數(shù)如下所示:
? ? file:文件路徑,支持絕對路徑相對路徑
? ? text:寫入文件的數(shù)據(jù)
? ? encoding:為可選參數(shù),寫入文件的編碼格式,如果為空,則默認使用系統(tǒng)默認的編碼。

  • readFile

? ? 主要功能是將指定內(nèi)容讀取文件,其主要參數(shù)如下所示:
? ? file:文件路徑,支持絕對路徑相對路徑
? ? encoding:為可選參數(shù),讀取文件的編碼格式,如果為空,則默認使用系統(tǒng)默認的編碼。

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

? ? 運行結(jié)果如下所示:

0315 readAndWriteFile示例.png

3.3.2.2 命令相關(guān)步驟

? ? pipeline 支持的命令相關(guān)步驟主要涉及到命令sh、batpowershell,sh主要用于Unix/Linux,bat和powershell主要用于Windows,三者支持參數(shù)一樣,我們主要以sh為例,主要參數(shù)如下所示:

  • script: 要運行的腳本
  • encoding: 腳本運行后輸出日志的編碼,默認為系統(tǒng)編碼
  • returnStatus: boolean類型,默認值為腳本返回的狀態(tài)碼,如果返回是非零值,則觸發(fā)pipeline運行失敗,如果returnStatus為true,則忽略返回的狀態(tài)碼值,pipeline不受其影響
  • returnStdout: boolean類型,如果returnStdout為true,則標準輸出將做為返回值,而不是打印到構(gòu)建日志中。

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

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("run script cmd demo"){
            steps{
                script {
                    println "將sh的返回值做為參數(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
                        )
                }
            }
        }
    }
}

? ? 運行結(jié)果如下所示:

0316 運行腳本示例returnStatust-false.png

? ? 為了做對比,修改returnStatus為true

pipeline{
    agent any
    options {
        timestamps()
    }
    stages{
        stage("run script cmd demo"){
            steps{
                script {
                    println "將sh的返回值做為參數(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
                        )
                }
            }
        }
    }
}

? ? 運行結(jié)果如下所示:

0317 運行腳本示例returnStatus-true.png

3.3.2.3 其他相關(guān)步驟

  • error

? ? 用于主動報錯,中止pipeline的運行,主要有一個參數(shù)message,示例如下所示:

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

? ? 運行結(jié)果如下所示:

0318 主動拋出異常示例.png
  • timeout

? ? 用于為被timeout包含的代碼塊設(shè)置超時時間。主要支持的參數(shù)如下所示:
? ? time:整型,超時時間
? ? unit可選參數(shù),為時間單位,支持的值有NANOSECONDS、MICROSECONDS、MILLISECONDDS
? ? ? ? SECONDS、MINUTES(默認)、HOURS、DAYS
? ? activity可選參數(shù),如果為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
                        )
                    }
                }
            }
        }
    }
}

? ? 運行結(jié)果如下所示:

0319 timeout示例.png
  • waitUntil

? ? 不斷重復(fù)運行waitUntil里面的代碼,直至條件為true。waitUntil不負責(zé)處理代碼里面的異常異常,若遇到錯誤,則直接拋出異常。

? ? 示例如下所示:

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

? ? 運行結(jié)果如下所示:

0320 waitUntil示例.png

waitUntil 一般常與 timeout 一起使用,從而避免死循環(huán)

  • retry

? ? 將被retry包含的腳本按指定次數(shù)重復(fù)執(zhí)行。如果其中某一次出現(xiàn)異常,則中止本次執(zhí)行,再次進行下一次執(zhí)行。示例如下所示:

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

? ? 運行結(jié)果如下所示:

0321 retry 示例.png
  • sleep

? ? sleep 與Linux中的sleep命令類似,一般用于暫停pipeline,其支持的參數(shù)如下所示:
? ? time:整型,超時時間
? ? unit可選參數(shù),為時間單位,支持的值有NANOSECONDS、MICROSECONDSMILLISECONDDS、
? ? ? ? SECONDS(默認)、MINUTES、HOURS、DAYS

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

? ? 運行結(jié)果如下所示:

0322 sleep 示例.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容