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é)果如下所示:

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é)果如下所示:

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)默認的編碼。
? ? writeFile和readFile 示例如下所示:
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é)果如下所示:

3.3.2.2 命令相關(guān)步驟
? ? pipeline 支持的命令相關(guān)步驟主要涉及到命令sh、bat和powershell,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é)果如下所示:

? ? 為了做對比,修改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é)果如下所示:

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é)果如下所示:

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é)果如下所示:

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é)果如下所示:

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é)果如下所示:

sleep
? ? sleep 與Linux中的sleep命令類似,一般用于暫停pipeline,其支持的參數(shù)如下所示:
? ? time:整型,超時時間
? ? unit:可選參數(shù),為時間單位,支持的值有NANOSECONDS、MICROSECONDS、MILLISECONDDS、
? ? ? ? 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é)果如下所示:
