Jenkins Pipeline script 指令建立和變數定義
一、Jenkins Pipeline
Pipeline,是一套運行於Jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連線起來,實現單個任務難以完成的複雜流程編排與視覺化。
Stage:階段,一個Pipeline可以劃分成若干個Stage,每個Stage代表一組操作,例如:“Build”,“Test”,“Deploy”。
【注意】Stage是一個邏輯分組的概念,可以跨多個Node
Node:節點,一個Node就是一個Jenkins節點,或者是Master,或者是Agent,是執行Step的具體執行環境。
Step:步驟,Step是最基本的操作單元,小到建立一個目錄,大到構建一個Docker映象,由各類Jenklins Plugin提供,例如:sh ‘make’
Pipeline五大特性 程式碼:Pipeline以程式碼的形式實現,通常被檢入原始碼控制,使團隊能夠編輯、審查和迭代其CD流程。 可持續性:Jenklins重啟或者中斷後都不會影響Pipeline Job。 停頓:Pipeline可以選擇停止並等待任工輸入或批准,然後再繼續Pipeline執行。 多功能:Pipeline支援現實世界的複雜CD要求,包括fork/join子程序,迴圈和並行執行工作的能力 可擴充套件:Pipeline外掛支援其DSL的自定義擴充套件以及與其他外掛整合的多個選項。
宣告式Pipeline的基本語法和表示式遵循與Groovy語法相同的規則,但有以下例外:
1、宣告式pipeline必須包含在固定格式pipeline{}快內
2、每個宣告語句必須獨立一行,行尾無需使用分號
3、塊(blocks{})
4、屬性引用語句被視為無引數方法呼叫。例:輸入被視為 input()
塊(blocks{})
由大括號括起來的語句,如pipeline{},Section{},parameters{},script{}
章節(Sections)
通常包含一個或多個指令或步驟。如 agent 、post、stages、steps
指令(Directives)
environment、options、parameters、triggers(觸發)、stage、tools、when
步驟(Steps)
Pipeline steps reference
執行指令碼式pipeline:使用script{}
指令agent
必須存在,agent必須在pipeline塊內的頂層定義,但stage內是否使用使可選的
指令stages 必須,包括順序執行的一個或多個stage命令,在pipeline內僅能使用一次,通常位於agent/options後面,例子如上
指令steps 必須,steps位於stage指令塊內部,包括一個或多個step。僅有一個step的情況下可以忽略關鍵字step及其{},例子如上
指令environment 不是必須的,該environment指令指定一系列鍵值對,這些對值將被定義為所有步驟的環境變數或階段特定步驟,具體取決於environment指令位於Pipeline中的位置。
解釋一下什麼意思,environment{…}, 大括號裡面寫一些鍵值對,也就是定義一些變數並賦值,這些變數就是環境變數。環境變數的作用範圍,取決你environment{…}所寫的位置,你可以寫在頂層環境變數,讓所有的stage下的step共享這些變數,也可以單獨定義在某一個stage下,只能供這個stage去呼叫變數,其他的stage不能共享這些變數。一般來說,我們基本上上定義全域性環境變數,如果是區域性環境變數,我們直接用def關鍵字宣告就可以,沒必要放environment{…}裡面。
environment {CC='clang'} environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')} steps {sh 'printenv'}
指令options ,該options指令允許在Pipeline本身內配置Pipeline專用選項,不是必須的 預定義pipeline專有的配置資訊,僅可定義一次
pipeline { agent any options{ timeout(time:1,unit: 'HOURS') } ... }
指令parameters ,改parameters是引數的意思,不是必須的 定義引數化構建的引數,可選引數如下:
booleanParam布林值引數
就是定義一個布林型別引數,使用者可以在Jenkins UI上選擇是還是否,選擇是表示程式碼會執行這部分,如果選擇否,會跳過這部分。一般需要使用布林值的場景有,執行一些特定整合的指令碼或則工作,或者事後清除環境,例如清楚Jenkins的workspace這樣的動作。
Pipeline { agent any parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') } }
choice選擇引數
#選擇(choice)引數就是支援使用者從多個選擇項中,選擇一個值用來表示這個變數的值。工作中常用的場景,有選擇伺服器型別,選擇版本號等。
Pipeline { agent any parameters { choice(name: 'ENV_TYPE', choices: ['test', 'dev', 'product'], description: 'test means test env,….') } }
file檔案引數
檔案(file)引數就是在Jenkins 引數化構建UI上提供一個檔案路徑的輸入框,Jenkins會自動去你提供的網路路徑去查詢並下載。一般伴隨著還有你需要在Pipleline程式碼中寫解析檔案。也有這樣場景,這個構建job就是把一個war包部署到伺服器上特定位置,你可以使用這個檔案引數。
Pipeline { agent any parameters { name: 'FILE', description: 'Some file to upload') } }
text文字引數
文字(text)的引數就是支援寫很多行的字串:
Pipeline { agent any parameters { text(name: 'Welcome_text', defaultValue: 'One\nTwo\nThree\n', description: '') } }
password密碼引數
密碼(password)引數就是在Jenkins 引數化構建UI提供一個暗文密碼輸入框,例如,我需要在一些linux機器上做自動化操作,需要提供機器的使用者名稱和密碼,由於密碼涉及安全問題,一般都採用暗文顯示,這個時候你就不能用string型別引數,就需要使用password引數型別。
Pipeline { agent any parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') } }
string字串引數
就是定義一個字串引數,使用者可以在Jenkins UI上輸入字串,常見使用這個引數的場景有,使用者名稱,收件人郵箱,檔案網路路徑,主機名稱的或者url等
Pipeline { agent any parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') } }
多引數情況
paramenters { choice(name:'PerformMavenRelease',choices:'False\nTrue',description:'desc') choice(name:'ENV_TYPE',choices:['test', 'dev', 'product'],description:'test means test env,…') password(name:'CredsToUse',description:'Apassword to build with',defaultValue:'') string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') } environment { BUILD_USR_CHOICE="${params.PerformMavenRelease}" BUILD_USR_CREDS="${params.CredsToUse}" }
二、快速建立一個pipeline
1.新建 Item ,點選紅框中的"新建Item":
2.新建 pipeline,輸入任務名稱,點選紅框中的"新建流水線",點選確定:
3.接下來會彈出詳細設定的表單,如下圖,選擇"流水線"的Tab頁,在頁面上直接輸入一段pipeline內容,再點選左下角的"儲存"按鈕:
pipeline script參考:
pipeline{ agent any stages { stage('Build') { steps{ echo 'This is a build step' } } stage('Test') { steps{ echo 'This is a test step' } } stage('Deploy') { steps{ echo 'This is a deploy step' } } } }
4.點選下圖紅框中的"立即構建",即可執行剛才輸入的pipeline指令碼:
5.任務執行完畢後如下圖所示,點選紅框中的圖示,即可檢視本次任務執行過程中的控制檯輸出:
常用的輔助工具
· Snipper Generator(程式碼片段生成器,語法檢查器)
· Replay Pipeline(重放pipeline,可以修改script,修改後的不存入config.xml)
· DSL Reference 語法參考手冊
· 全域性變數引用
· Stage View
· BlueOcean(視覺化)
· Pipeline神器:視覺化編輯器
· 命令列Pipeline除錯工具
三、變數的傳遞
- 自定義變數(區域性)
def username = 'Jenkins' echo "Hello Mr.${username}" #注意一定要用雙引號,單引號識別為字串
2.環境變數(區域性)
withEnv(['MYTOOL_HOME=/usr/local/mytool']){ sh '$MYTOOL_HOME/bin/start' }
3.環境變數(全域性)
environment {CC='clang'} echo "Compiler is ${env.CC}"
4.引數化構建(全域性)
parameters {string(name:'Jenkins',defaultValue:'Hello',description:'How should I greet the world')} ehco "${params.Greeting} World!"
判斷
when僅用於stage內部
when的內建條件為:
- when {branch 'master'} - when {environment name:'DEPLOY_TO',value:'production'} #當有環境變數 name 為 DEPLOY_TO 值是 production 條件成立 - when {expression {return params.DEBUG_BUILD}} #表示式返回值為真時 - when {not {branch 'master'}} - when {allOf {branch 'master'; environment name:'DEBUG_TO',value:'production'}} #allOf 所有條件都滿足時 - when {anyOf {branch 'master' ; branch 'staging'}} #anyOf有一個條件滿足時即可
判斷和異常處理
流程控制if/else條件
node { stage('Example'){ if(env.BRANCH_NAME == 'master'){ echo 'I only execute on the master branch' }else { echo 'Iexecute elsewhere' } } }
迴圈
for迴圈僅存在域指令碼式pipeline中,但是可以通過在宣告式pipeline中呼叫script step來執行
pipeline { agent any stages { stage('Example'){ steps{ echo 'Hello world!' script { def browsers = ['chrome','firefox'] for (int i = 0;i < browers.size();++i){ echo "Testing the ${browsers[i]} browser" } } } } } }
————————————————
參考連結:https://blog.csdn.net/diantun00/article/details/81075007