單引號、雙引號,單引號不支持插值
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故事#
還可以關注我之前的文章:
關鍵字: description message 步驟