Jenkins pipeline 語法詳解
原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html
pipeline 是一套運行於jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜流程編排與可視化。
pipeline 是jenkins2.X 最核心的特性, 幫助jenkins 實現從CI 到 CD與 DevOps的轉變
pipeline 提供一組可擴展的工具, 通過 pipeline domain specific language syntax 可以到達pipeline as code 目的
pipiline as code : jenkinsfile 存儲在項目的 源代碼庫
為什麽要使用pipeline
1. 代碼: pipeline 以代碼的形式實現,通過被撿入源代碼控制, 使團隊能夠編譯,審查和叠代其cd流程
2 可連續性: jenkins 重啟 或者中斷後都不會影響pipeline job
3.停頓: pipeline 可以選擇停止並等待人工輸入或者批準,然後在繼續pipeline運行
4.多功能: pipeline 支持現實世界的復雜CD要求, 包括fork、join子進程,循環和並行執行工作的能力
5.可擴展: pipeline 插件支持其DSL的自動擴展以及其插件集成的多個選項。
jenkins pipeline 入門
pipeline 腳本是有groovy 語言實現的
-無需專門學習 groovy
pipeline 支持兩種語法
- Declarative 聲明式
- Scripted pipeline 腳本式
如何創建基本的pipeline
- 直接在jenkins web ui 網頁界面輸入腳本
- 通過常見一個jenkins 可以檢入項目的源代碼管理庫
Declarativ 聲明式 pipeline
聲明式pipeline 基本語法和表達式遵循 groovy語法,但是有以下例外:
- 聲明式pipeline 必須包含在固定格式的pipeline{} 塊內
- 每個聲明語句必須獨立一行, 行尾無需使用分號
- 塊(Blocks{}) 只能包含章節(Sections),指令(Directives),步驟(Steps),或者賦值語句
- 屬性引用語句被視為無參數方法調用。 如input()
塊(Blocks{})
- 由大括號括起來的語句: 如 Pipeline{}, Sections{}, parameters{}, script{}
章節(Sections)
- 通常包括一個或者多個指令或步驟 如 agent,post,stages,steps
指令(Directives)
- environment, options, parameters, triggers, stage, tools, when
步驟(steps)
- 執行腳本式pipeline, 如script{}
agent |
|
需要 | 必須存在,agent必須在pipeline塊內的頂層定義,但是stage內是否使用為可選 |
參數 | any/none/label/node/docker/dockerfile |
常用參數 | label/customWorkspace/reuseNode |
展示: | |
agent { label ‘this k8s-api-label‘} | |
agent { node{ label ‘ this is k8sapi-label‘ customWorkspace ‘/some/other/path‘ } } |
agent { docker { image ‘im-web‘ label ‘this is k8sapi-label‘ args ‘-v /tmp:/tmp‘ } } |
# customWorkspace node節點的工作空間
post |
|
需要 | 否,用於pipeline的最外層或者stage{}中 |
參數 | 無 |
常用選項 |
構建後操作的內置判定條件 always,changed,failure,sucess,unstable,aborted |
展示: | |
pipeline { agent any stages { stage(‘Example‘) { steps { echo ‘Hello World‘ } } } post { always { echo ‘I will ........!‘ } } }
|
stages |
|
需要 | 是,包括順序執行的一個或者多個stage命令 |
參數 | 無 |
常用選項 |
構建後操作的內置判定條件 always,changed,failure,sucess,unstable,aborted |
展示: | |
pipeline { agent any stages { stage(‘Example‘) { steps { echo ‘Hello World‘ } } } stage(‘echo‘) { steps { echo ‘I will ........!‘ } } }
|
steps |
|
需要 | 是,steps位於stage指令塊內部,包括一個或者多個step |
參數 | 無 |
說明 |
僅有一個step的情況下可以忽略關鍵字step及其{} |
展示: | |
pipeline { agent any stages { stage(‘Example‘) { steps { echo ‘Hello World‘ } } } stage(‘echo‘) { steps { echo ‘I will ........!‘ } } }
|
Directives (指令)
environment指令指定一系列鍵值對,這些鍵值對將被定義為所有step或stage-specific step的環境變量,具體取決於environment指令在Pipeline中的位置。
該指令支持一種特殊的方法credentials(),可以通過其在Jenkins環境中的標識符來訪問預定義的憑據。
對於類型為“Secret Text”的憑據,該 credentials()方法將確保指定的環境變量包含Secret Text內容;對於“標準用戶名和密碼”類型的憑證,指定的環境變量將被設置為username:password。
environment |
|
需要 | 是,environment 定義了一組全局的環境變量鍵值對 |
參數 | 無 |
說明 |
存在於pipeline{} 或者stage指令內, 註意特殊方法credentials() ,可以獲取jenkins中預定義的憑證明文內容 |
展示: | |
pipeline { agent any environment { SONAR_SERVER = ‘http://172.16.230.171:9000‘ } stages { stage(‘Example‘) { steps { echo "${SONAR_SERVER}" } } } }
|
options
buildDiscarder
pipeline保持構建的最大個數。例如:options { buildDiscarder(logRotator(numToKeepStr: ‘1‘)) }
disableConcurrentBuilds
不允許並行執行Pipeline,可用於防止同時訪問共享資源等。例如:options { disableConcurrentBuilds() }
skipDefaultCheckout
默認跳過來自源代碼控制的代碼。例如:options { skipDefaultCheckout() }
skipStagesAfterUnstable
一旦構建狀態進入了“Unstable”狀態,就跳過此stage。例如:options { skipStagesAfterUnstable() }
timeout
設置Pipeline運行的超時時間。例如:options { timeout(time: 1, unit: ‘HOURS‘) }
retry
失敗後,重試整個Pipeline的次數。例如:options { retry(3) }
timestamps
預定義由Pipeline生成的所有控制臺輸出時間。例如:options { timestamps() }
options |
|
需要 | 否,預定義pipeline專有的配置信息,僅可定義一次 |
參數 | 無 |
說明 |
authorizationMatrix, buildDiscarder, catchError, disableConcurrentBuilds, overrideIndexTriggers, |
展示: 設置構建超時時間 為1個小時 | |
pipeline { agent any options { timeout(time:1, unit: ‘HOURS‘) } environment { SONAR_SERVER = ‘http://172.16.230.171:9000‘ JAVA_HOME=‘/data/jdk‘ } stages { stage(‘sonarserver‘) { steps { echo "${SONAR_SERVER}" } } stage(‘javahome‘) { steps { echo "${JAVA_HOME}" } } } } |
parameters
parameters指令提供用戶在觸發Pipeline時的參數列表。這些參數值通過該params對象可用於Pipeline步驟
可用參數
string
A parameter of a string type, for example: parameters { string(name: ‘DEPLOY_ENV‘, defaultValue: ‘staging‘, description: ‘‘) }
booleanParam
A boolean parameter, for example: parameters { booleanParam(name: ‘DEBUG_BUILD‘, defaultValue: true, description: ‘‘) }
目前只支持[booleanParam, choice, credentials, file, text, password, run, string]這幾種參數類型,其他高級參數化類型還需等待社區支持。
parameters |
|
需要 | 否,定義參數化構建的參數 |
參數 | 無 |
說明 |
booleanParam,choice,file,text,password,run,string |
示例 | |
pipeline { agent any options { timeout(time:1, unit: ‘HOURS‘) } parameters { choice(name:‘PerformMavenRelease‘,choices:‘False\nTrue‘,description:‘desc‘) // password(name:‘CredsToUse‘,defaultValue:‘‘,description:‘A password to build with‘) } environment { SONAR_SERVER = ‘http://172.16.230.171:9000‘ JAVA_HOME=‘/data/jdk‘ } stages { stage(‘sonarserver‘) { steps { echo "${SONAR_SERVER}" } } stage(‘javahome‘) { steps { echo "${JAVA_HOME}" } } stage(‘get parameters‘) { steps { echo "${params.PerformMavenRelease}" } } } } |
調用定義的參數, 需要使用 params.PerformMavenRelease
triggers
triggers指令定義了Pipeline自動化觸發的方式。對於與源代碼集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基於webhook的集成也已經存在。目前只有兩個可用的觸發器:cron和pollSCM。
triggers |
|
需要 | 否,定義pipeline被自動觸發的方式 |
參數 | 無 |
說明 |
cron,pollSCM,upstream |
示例 | |
pipeline { agent any options { timeout(time:1, unit: ‘HOURS‘) } parameters { choice(name:‘PerformMavenRelease‘,choices:‘False\nTrue‘,description:‘desc‘) // password(name:‘CredsToUse‘,defaultValue:‘‘,description:‘A password to build with‘) } environment { SONAR_SERVER = ‘http://172.16.230.171:9000‘ JAVA_HOME=‘/data/jdk‘ } |
when
when指令允許Pipeline根據給定的條件確定是否執行該階段。該when指令必須至少包含一個條件。如果when指令包含多個條件,則所有子條件必須為stage執行返回true。這與子條件嵌套在一個allOf條件中相同(見下面的例子)。
更復雜的條件結構可使用嵌套條件建:not,allOf或anyOf。嵌套條件可以嵌套到任意深度
內置條件
branch
當正在構建的分支與給出的分支模式匹配時執行,例如:when { branch ‘master‘ }。請註意,這僅適用於多分支Pipeline。
environment
當指定的環境變量設置為給定值時執行,例如: when { environment name: ‘DEPLOY_TO‘, value: ‘production‘ }
expression
當指定的Groovy表達式求值為true時執行,例如: when { expression { return params.DEBUG_BUILD } }
not
當嵌套條件為false時執行。必須包含一個條件。例如:when { not { branch ‘master‘ } }
allOf
當所有嵌套條件都為真時執行。必須至少包含一個條件。例如:when { allOf { branch ‘master‘; environment name: ‘DEPLOY_TO‘, value: ‘production‘ } }
anyOf
當至少一個嵌套條件為真時執行。必須至少包含一個條件。例如:when { anyOf { branch ‘master‘; branch ‘staging‘ } }
when |
|
需要 | 否 |
參數 | 無 |
說明 |
inside a stage directive |
pipeline { agent any stages { stage(‘Example Build‘) { steps { echo ‘Hello World‘ } } stage(‘Example Deploy‘) { when { allOf { branch ‘production‘ environment name: ‘DEPLOY_TO‘, value: ‘production‘ } } steps { echo ‘Deploying‘ } } } }
|
Parallel(並行)
Declarative Pipeline近期新增了對並行嵌套stage的支持,對耗時長,相互不存在依賴的stage可以使用此方式提升運行效率。除了parallel stage,單個parallel裏的多個step也可以使用並行的方式運行。
pipeline { agent any stages { stage(‘Non-Parallel Stage‘) { steps { echo ‘This stage will be executed first.‘ } } stage(‘Parallel Stage‘) { when { branch ‘master‘ } parallel { stage(‘Branch A‘) { agent { label "for-branch-a" } steps { echo "On Branch A" } } stage(‘Branch B‘) { agent { label "for-branch-b" } steps { echo "On Branch B" } } } } } }
變量傳遞
1. 自定義變量(局部)
def username = ‘jenkins‘ echo "hello Mr.${username}"
2. 環境變量
withEnv([‘JAVA_HOME=/data/jdk‘]) { sh ‘$JAVA_HOME/bin/start.sh‘ }
3. 環境變量(全局)
environment { JAVA_HOME=‘/data/jdk‘ } echo " java path $JAVA_HOME"
4. 參數化構建(全局)
parameters { string(name: ‘GIT_BRANCH‘, defaultValue: ‘master‘, description: ‘default build branch‘) } 調用: echo "${params.name}"
判斷:
1.when 僅用於stage內部
2. when 的內置條件
1). when {branch ‘master‘} #當是master的時候,才執行某些事情 2). when {envionment name:‘DEPLOY_TO‘,value:‘production‘} #當環境變量name 的值是production的時候,才執行某些事情 3). when {expression {return params.DEBUG_BUILD}} #表達式的返回值是真的情況下,才執行 4). when {not {branch ‘master‘}} #不是master的情況下,執行 5). when {allOf {branch ‘master‘; environment name: ‘DEPLOY_TO‘,value:‘production‘}} #當大括號中所有的項都成立,才去做某些事情 6). when {anyOf {branch ‘master‘; branch ‘staging‘}} #只要滿足大括號裏面的某一個條件,才去做某些事情
Jenkins pipeline 語法詳解