聲明:學習資料來源於 https://blog.csdn.net/u011541946/category_8223796.html ,本人只是做了一些歸納和練習
一、創建項目
1、在創建項目類型時選擇流水線(pipeline)項目;
2、在創建頁面的pipeline區域(類型默認是pipeline script),輸入框右上角有示例選擇,選擇其中一個后,點擊保存。
3、構建
這樣一個簡單的流水線demo就完成了
一般我們類型選擇pipeline script from SCM(pipeline來自於配置)
1、SCM選擇Git
2、填寫好git路徑和鑒權秘鑰
3、腳本路徑填寫groove文件在git項目中的路徑。比如HelloWorld.groovy文件在根目錄,我直接填寫HelloWorld.groovy即可
二、groovy語法
官網語法:https://jenkins.io/doc/book/pipeline/syntax/
三、關鍵字pipeline、agent、node、stages、stage、steps
// Declarative類型 pipeline { agent any // 指定運行機器 // agent { // node { // label "win-anthony" // customWorkspace "${env.JOB_NAME}/${env.BUILD_NUMBER}" // } // } stages { stage('Build') { steps { // 這里是Groovy語法,寫了一個打印語句 println "Build" } } stage('Test') { steps { // 在linux上執行 sh "echo `pwd`" } } stage('Deploy') { steps { println "Deploy" } } } } // Scripted類型: // 1、行數精簡,很短。但是不好寫,也不好讀,維護起來相等困難; // 2、沒有stages這個關鍵字; // 3、可以node('Node name') {}來開頭,Node name就是從節點或master節點的名稱 // node { // stage('Build') { // // // } // stage('Test') { // // // } // stage('Deploy') { // // // } // }
1、pipeline
告訴Jenkins接下來{}中的代碼就是pipeline代碼,和普通的函數或者方法隔離出來。
2、agent
代理,一般在pipeline下面,這個和選擇用jenkins平台上那一台機器去執行任務構建有關;
如果 agent 設置為none,那么stage中則需要指定 agent;
如果 agent 設置為指定機器,需要用到機器標簽名、運行路徑等信息(在jenkins的系統管理—節點管理頁面,新建節點時會有這些信息填寫)參考:https://blog.csdn.net/u011541946/article/details/83591148
3、node
用來區分Jenkins環境中不同的節點環境
4、stages和 stage
a、一個stages包含多個stage;
b、stage指一段代碼塊,一般一個stage包含一個業務場景的自動化,例如build是一個stage, test是第二個stage,deploy是第三個stage;
c、在一個Declarative Pipeline腳本中,只允許出現一次stages ;
通過stage隔離,讓Pipeline代碼讀寫非常直觀。
5、steps
a、Declarative 模式中,不支持在steps {…} 里面嵌套寫step{…} ,一個stage 下至少有一個steps,一般也就是一個steps
b、steps指一個步驟,一般來說,一個steps{}里面就寫幾行代碼,或者一個try catch語句
四、關鍵字post、environment、options、parameters、triggers、tools
pipeline { agent any environment { // 定義一些變量並賦值,這些變量就是環境變量; unit_test = true } options { // options指令允許在Pipeline本身內配置Pipeline專用選項;下面示例是構建失敗會執行三次 retry(3) } parameters { // 提供用戶在觸發Pipeline時應提供的參數列表 } triggers { // 觸發條件 pollSCM (‘H H(9-16)/2 * * 1-5)’) } tools { // 自動安裝和放置工具的部分PATH jdk 'jdk8' } stages { stage('Deploy') { steps { if(unit_test == true) { // call run unit test methods } } } } post { //寫相關post部分代碼 always { script { //寫相關清除/恢復環境等操作代碼 } } } }
1、post
a、和agent{…}同級,也可以放在stage里面
b、使用post的場景基本上執行完一個構建,進行發送消息通知,例如構建失敗會發郵件通知
c、在post代碼塊區域,支持多種條件指令,這些指令有
always(無論Pipeline運行的完成狀態如何都會執行這段代碼)、
changed(與上一次構建的結果不同時就執行。例如,你最近幾次構建都是成功,突然變成不是成功狀態,里面就觸發發郵件通知)、
failure(構建失敗)、
success(構建失敗)、unstable,和aborted
2、environment
environment{…}, 定義一些變量並賦值,這些變量就是環境變量;
作用范圍取決你environment{…}所寫的位置
3、options
該options指令允許在Pipeline本身內配置Pipeline專用選項;比如retry,失敗會重復執行
作用范圍取決於你寫的位置
4、parameters
jenkins項目配置中的General中的參數化構建也可以,這里是代碼的方式來創建,不需要在jenkins UI上一個一個創建
parameters指令提供用戶在觸發Pipeline時應提供的參數列表
5、triggers 觸發器
對於與源代碼集成的Pipeline,如GitHub或BitBucket,triggers可能不需要基於webhook的集成可能已經存在。
目前有三個可用的觸發器是cron(定時任務)和pollSCM(輪詢) 和 upstream
6、tools
a、定義自動安裝和放置工具的部分PATH。如果agent none指定,這將被忽略。
b、只支持定義maven jdk gradle三種工具的環境變量。
c、工具名稱必須在Jenkins 管理Jenkins → 全局工具配置中預配置。例如,上面代碼寫了jdk,那么必須在jenkins管理的全局工具配置中有jdk配置
四、關鍵字input、when
1、input
該指令允許在一個stage{…}顯示提示輸入等待。
在inpt{…}寫一些條件,然后用戶觸發構建這個job,但是這個時候沒有接收到有效的input, job會一直在等待中。
需要在構建頁面點擊這個stage,就會彈出input中的內容
pipeline { agent any stages { stage('Example') { input { message "Should we continue?" ok "Yes, we should." submitter "admin,anthony" parameters { string(name: 'PERSON', defaultValue: 'Mr Anthony', description: 'Who should I say hello to?') } } steps { echo "Hello, ${PERSON}, nice to meet you." } } } }
貌似上面的submitter限制無效
2、when
a、When{…}是寫在stage{…}里面一層條件控制,根據給定的條件確定是否執行該階段。
b、必須至少包含一個條件,且所有條件為真
c、when{…}支持的一些內置條件命令,如下
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' } }
pipeline { agent any environment { quick_test = false } stages { stage('Example Build') { steps { script { echo 'Hello World' } } } stage('Example Deploy') { when { expression { return (quick_test == "true" ) } } steps { echo 'Deploying' } } } }
判斷條件那里的true得帶雙引號,不知道為什么。因為我寫false的時候不會執行后面的steps,但是帶雙引號的false后則會執行后面的steps
五、stage順序嵌套
1、所有的stage,都會內嵌在最外層的stages{…}
2、一個stage{…}下可以內嵌有且只有一個stages{…}
3、多層嵌套只支持在最后一個stage{…}里面
4、嵌套越多越復雜,最簡單就是觀察每一個stage的大括號的范圍

pipeline { agent none stages { stage('Non-Sequential Stage') { agent { label 'for-non-sequential' } steps { echo "On Non-Sequential Stage" } } stage('Sequential') { agent { label 'for-sequential' } environment { FOR_SEQUENTIAL = "some-value" } stages { stage('In Sequential 1') { steps { echo "In Sequential 1" } } stage('In Sequential 2') { steps { echo "In Sequential 2" } } } } } }
六、stage並行
1、並行stage{…}需要用到指令paraller, 有一個paraller{…} 里面包含多個stage{…},最后一個stage{…}內部支持嵌套多個stages{…}。
2、在paraller{…}如果要設置只要里面有一個stage{…}運行失敗就強制停止,可以使用表達式failFast true 來條件控制。

pipeline { agent any stages { stage('Non-Parallel Stage') { steps { echo 'This stage will be executed first.' } } stage('Parallel Stage') { // 並行二給了一個錯誤的指令,構建時出現問題,並行三會終止 failFast true parallel { stage('並行一') { steps { echo "並行一" } } stage('並行二') { steps { // 錯誤的指令 echo1 "並行二" } } stage('並行三') { stages { stage('Nested 1') { steps { echo "In stage Nested 1 within Branch C" } } stage('Nested 2') { steps { echo "In stage Nested 2 within Branch C" } } } } } } } }