devops系列003——jenkins-pipeline語法

devops系列003——jenkins-pipeline語法


單引號、雙引號,單引號不支持插值

def name = 'hello'

print "${name} world" //結果:hello world

pring '${name} world' //結果: ${name} world

支持明明參數

def createName(String givenName, String familyName){

return giveName + " " + familyName

}

// 調用時可以這樣

createName familyName = "hello", givenName = "xxx"

支持默認參數

def sayHello(String name = "xxx"){

print "hello ${name}"

}

// 調用時可以這樣

sayHello()

pipeline 結構

聲明式:

pipeline: 代表整個流水線

stage: 階段,代表流水線的階段,每個階段都必須有名稱

stages:流水線中多個stage的容器

steps:代表階段中的一個或多個具體步驟的容器

agent:指定流水線的執行位置(jenkins agent)

腳本式:

node:代表整個流水線

stage:代表流水線的階段,每個階段都必須有名稱

node('xxx') 指定流水線的執行位置(jenkins agent)

流水線執行流程

1.觸發任務

指定流水線代碼的觸發事件,有如下3種不同的方法:

  • 如果Jenkins應用的本身就是流水線類型的任務,可以使用傳統的方法通過web界面在項目的基本配置部分指定觸發條件
  • 如果是創建了一個腳本式流水線,可以在代碼中指定一個 properties 代碼塊(通常在流水線開始之前)來定義觸發條件(

注意,這個屬性部分將會和 web 界面中定義的屬性合併,並且web界面上定義的屬性優先級先生效)。

  • 如果是創建了一個聲明式流水線,有個特殊的 triggers 指令可以用來定義流水線的觸發類型。

2.在其他項目構建後構建

這種方式允許在一個或者多個其他項目之後開始你的項目構建。你可以選擇其他項目構建的狀態(穩定的,不穩定的或者失敗的)。

對於一個腳本式流水線,在任務 Job1 成功後構建你的流水線,其語法如下:

properties([

pipelineTriggers([

upstream(

threshold:hudson.model.Result.SUCCESS,

upstreamProjects.'Job1'

)

])

])

如果你需要列出多個任務,可以使用逗號分隔。如果你需要指定一個任務的某個分支,在任務名稱的後面添加斜線和分支名稱(如 'Job1/master')

3.用戶輸入

DSL 的 input 步驟就是讓我們通過流水線獲得用戶輸入的方式。在腳本式流水線中,這個步驟接受與普通Jenkins任務相同的參數類型。

在聲明式流水線中,有一個特殊的 parameters 指令,可以支持那些參數的子集。

輸入:

input 'Continue to next stage ?'

默認的表單是打印一條消息和提供給用戶一個選擇,即繼續執行(Proceed)或者中止(Abort)。請注意,當系統執行了一個 input 步驟時,相應節點上的進程會被暫停,這會導致系統資源被獨佔。會佔用節點的執行器,直到input步驟完成。

input 有幾個參數:

1.消息(message)

顯示給用戶的消息

2.自定義ID(id)

input id:'ctns-prompt', message:'Continue to next stage ?'

然後可以通過 URL 請求 :

http://[jenkins-base-url]/job/[job_name]/[build_id]/input/Ctns-prompt/proceed

http://[jenkins-base-url]/job/[job_name]/[build_id]/input/Ctns-prompt/abort

3.OK按鈕字母(ok)

input message:'', ok:'Yes'

4.允許的提交者(submitter)

input message:'', submitter:'user1,user2'

5.存儲批准提交者的參數

可以使用一個變量來存儲批准執行的用戶。為了使用這個批准提交者,你需要定義一個變量來保存 input 步驟的相應。

stage ('Source') {

def resp = input id:'test-id', message:'Continue to next stage ?',ok:'YYY',submitterParamter:'test'

echo "${resp}"

}

參數:

1.布爾類型(boolean)

def answer = input message:'',parameters:[booleanParam (defaultValue:true, description:'Prerelease setting', name:'prerelease')]

2.選項型(choice)

def choice = input message:'',

parameters:[choice(choices:"a\n b\n c\n d\n")],

description:'選擇一個',

name:'Options'

3.憑證(credential)

def creds = input message:'',

parameters:[[$class:'CredentialsParameterDefinition', credentialType:'com.'],

defaultValue:'jenkins2-ssh',

description:'SSH key for access',

name:'SSH',

required:true

]

echo creds

4.文件

def selectedFile = input message:'',

parameters:[file(description:'choice file to upload',name:'local')]

5.列出SVN 標籤

6.多行字符串

node {

echo 'Hello World'

stage('Source') {

def lines = input message:'',

parameters:[text(defaultValue:''' line 1

line 2

line 3''', description:'',

name:'Input Lines'

)]

echo lines

}

}

三引號是 Groovy 中的標準符號,用來跨越多行。

7.密碼

def pw = input message:'',

parameters:[password(defaultValue:'',

description:'Enter your password',name:'passwd'

)]

8.運行

9.字符串

def pw = input message:'',

parameters:[string(defaultValue:'', description:'Enter your string', name:'Response'

)]

4.使用 GitHub 鉤子觸發器進行 GitSCM 輪詢

如果一個GitHub項目被配置為Jenkins項目的代碼源,就可以設置一個推鉤來觸發Jenkins項目。當設置好之後,當有代碼推送到代碼庫時就會發射鉤子

觸發Jenkins,進而調用Jenkins SCM 輪詢相應的功能。所以必須設置 SCM 輪詢,才能使用 GitHub 鉤子觸發工作。

在一個腳本式流水線中,配置這個屬性的語法如下:

properties([pipelienTriggers[githubPush()]])

聲明式流水線中還不支持。

5.參數與聲明式流水線

pipeline {

agent any

parameters {

string(name:'USERID', defaultValue:'',description:'Enter your userid')

}

stages {

stage('login') {

steps {

echo 'Active user is now ' + "${params.USERID}"

}

}

}

6.流程控制選項

1.超時(timeout)

允許你限制等待某個行為發生時腳本所花費的時間。語法如下:

timeout(time:60, unit:'SECONDS') {

//該代碼塊中的過程被設置為超時

}

默認是 min。如果超時,將拋出一個異常。

最佳的做法是,使用 timeout 對任何可能造成流水線暫停的步驟進行封裝。這樣做的結果是,即使出現差錯導致在限定的時間內沒有得到期望的輸入,你的

流水線也會繼續執行。

//超過10秒,拋出異常

node {

def response

stage('input') {

timeout(time:10, unit:'SECONDS') {

response = input message:'User',

parameters:[string(defaultValue:'user1'),

description:'Enter Userid:',

name:'userid'

]

}

echo 'Username = ' + response

}

}

node {

def response

stage('input') {

try {

timeout(time:10, unit:'SECONDS') {

response = input message:'User',

parameters:[string(defaultValue:'user1'),

description:'Enter Userid:',

name:'userid'

]

}

echo 'Username = ' + response

}

catch(err) {

response = 'user1'

}

}

}

2.重試(retry)

將代碼封裝為一個步驟,當代碼中有異常發生時,該步驟可以重試過程 n 次。這裡的 n 表示你傳入的數值。其語法如下:

retry() {

//代碼

}

3.睡眠(sleep)

這是一個基本延遲的步驟。它接收一個數值並且延遲相應的時間後再繼續執行。默認的時間單位是s。語法如下:

sleep time:5, unit:'MINUTES'

4.等待直到(waitUnitl)

這個步驟會導致整個過程一直等待某事的發生。這裡的某事指的是可以返回 true的閉包。

如果代碼塊中返回 false,那麼這個步驟會在等待更長的時間後進行下一次嘗試,過程中拋出的任何異常都會導致這個步驟立即退出並拋出一個錯誤。

timeout(time:120,unit:'SECONDS') {

waitUntil {

try {

return true

}

catch(exception) {

return false

}

}

}

7.併發處理

1.使用 lock 步驟對資源加鎖

//提供資源的名字作為默認參數

lock('worker_node1') {

//...

}

//標籤,資源的數量

lock(label:'doker-node', quantity:3) {

//..

}

2.使用 milestone 來控制併發構建

milestone label:'After build', ordinal:1

3.在多分支流水線中限制併發

//腳本式語法

properties([disableConcurrentBuilds()])

//聲明式語法

options {

disableConcurrentBuilds()

}

4.併發的運行任務

1.傳統的並行語法

stash 和 unstash (跨節點共享文件)

在Jenkins的 DSL中,stash 和 unstash 函數允許在流水線的節點間和/或階段間保存和獲取文件。它們的格式是:

stash name:"" [includes:"" excludes:""]

unstash ""

2.聲明式流水線中的替代並行語法

stage('Unit Test') {

parallel {

stage('Util unit tests') {

agent { label 'worker_node1' }

steps {

...

}

}

stage('API unit tests') {

agent { label 'worker_node2' }

steps {

...

}

}

}

}

parallel 和 failFast : 如果一個分支失敗了,就退出所有的步驟

5.把stage分別在不同的agent上執行,如果使用docker作為agent,每個stage都分別運行在一個新的容器中

options {

newContainerPerStage()

}

8.有條件的執行功能

條件性構建步驟插件(Conditional BuildStep plugin)可以讓用戶在Jenkins自由風格類型的任務中添加一些有條件的執行功能。

if ((條件1) && (條件2))

//聲明式流水線

會採用一個 when 形式來測試一個或者多個 expression 代碼塊是否為 true。如果為 true,階段中剩下的代碼才會被執行。否則不執行。

pipeline {

agent any

parameters {

...

}

stages {

stage('...') {

when {

allof {

expression {params.BRANCH_NAME=='master'}

expression {params.BUILD_TYPE=='release'}

}

}

steps {

echo '...'

}

}

}

}

9.構建後處理

1.腳本式流水線構建後處理

沒有內置支持構建後處理,通常依靠 Groovy 程序結構提供此功能。我們會使用 try-catch-finally 機制。

然後,Jenkins DSL 包含了另外一個步驟,可以作為 try-catch-finally 功能的快捷方法:catchError

def err=null

try {

node ('node1') {

stage('first stage') {

...

}

}

}

catch(err) {

...

}

finally {

...

}

catchError :

使用 catchError結構,如果一個代碼塊拋出了一個異常,那麼這個構建會被標記為失敗狀態。但是,流水線中從 catchError 代碼塊

往後的語句可以繼續執行。這樣做的有點是,在處理失敗後,你依然可以做一些類似發送通知的事情。

node('node1') {

catchError {

stage('first stage') {

...

}

}

//發送郵件

...

}

2.聲明式構建與構建後處理

聲明式流水線中有一個專門的部分用於構建後處理。這個部分被稱為構建後操作(post)。一個 post 部分可以放在一個階段的結尾或者一個流水線的結尾,

或者同時放在這2個地方。

post {

always {

...

}

failure {

...

}

success {

...

}

}

如果對您有幫助,記得不要忘了給個關注哦!!!#上海IT故事#

還可以關注我之前的文章:

監控系列 Prometheus

公司IT系統賬號大統一體系


分享到:


相關文章: