一、概述
簡介
Jenkins 2.x的精髓是Pipeline as Code,那為什么要用Pipeline呢?jenkins1.0也能實現自動化構建,但Pipeline能夠將以前project中的配置信息以steps的方式放在一個腳本里,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜流程,形成流水式發布,構建步驟視圖化。簡單來說,Pipeline適用的場景更廣泛,能勝任更復雜的發布流程。舉個例子,job構建工作在master節點,自動化測試腳本在slave節點,這時候jenkins1.0就無法同時運行兩個節點,而Pipeline可以。
基本概念
Stage: 階段,一個Pipeline可以划分為若干個Stage,每個Stage代表一組操作。注意,Stage是一個邏輯分組的概念,可以跨多個Node。
Node: 節點,一個Node就是一個Jenkins節點,或者是Master,或者是slave,是執行Step的具體運行期環境。
Step: 步驟,Step是最基本的操作單元,小到創建一個目錄,大到構建一個Docker鏡像,由各類Jenkins Plugin提供。
語法
Pipeline支持兩種語法:Declarative Pipeline(在Pipeline 2.5中引入,結構化方式)和Scripted Pipeline,兩者都支持建立連續輸送的Pipeline。
共同點:
兩者都是pipeline代碼的持久實現,都能夠使用pipeline內置的插件或者插件提供的steps,兩者都可以利用共享庫擴展。
區別:
兩者不同之處在於語法和靈活性。Declarative pipeline對用戶來說,語法更嚴格,有固定的組織結構,更容易生成代碼段,使其成為用戶更理想的選擇。但是Scripted pipeline更加靈活,因為Groovy本身只能對結構和語法進行限制,對於更復雜的pipeline來說,用戶可以根據自己的業務進行靈活的實現和擴展。
本文主要采取Scripted Pipeline語法
二、項目實戰
環境介紹
環境參考鏈接:
https://www.cnblogs.com/xiao987334176/p/12344871.html
這里面,主要是通過jenkins將Spring Cloud項目發布到一台服務器。
利用了參數化構建,一個jenkins job同時支持發布和回滾。
另外還設置了回滾時,跳過構建,參考鏈接:
https://www.cnblogs.com/xiao987334176/p/12357007.html
pipeline方式
如果要改成pipeline方式,需要新建一個jenkins job,名字為:test_pipeline_eureka-server
基本設置
參數化構建
pipeline腳本
完整代碼如下:
node { if (env.Status == 'Deploy'){ stage('code pull') { checkout([$class: 'GitSCM', branches: [[name: 'test_eureka-server']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'bf8a2a98-bb4f-461e-be46-2b49702d19b0', url: 'ssh://git@gitlab.baidu.com:22/eureka-server.git']]]) } stage('code Build') { sh 'mvn -f pom.xml clean package -Pdev -Dmaven.test.skip=true' } stage('code deploy') { sh 'ansible-playbook -v /opt/ansible/test/deploy_standard_template.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_NUMBER=${BUILD_NUMBER} ENV=test PROJECT_NAME=eureka-server PREFIX=eureka-server PORT=8761"' } }else{ stage('code rollback') { sh 'ansible-playbook -v /opt/ansible/test/rollback_standard_template.yml -e "HOSTS=test_java ENV=test PROJECT_NAME=eureka-server PORT=8761 BUILD_ID=${BUILD_ID}"' } } }
代碼解釋:
node {} 這里面,是Scripted Pipeline語法的主要構成部分。
if (env.Status == 'Deploy'){} 這里做了判斷,判斷是否發布?Status 就是上面我們參數化構建制定的變量。必須通過env.變量名來獲取。
stage('code pull') {} 表示code pull階段
checkout() 表示拉取代碼
$class: 'GitSCM' 表示使用git方式拉取代碼。SCM,分git,svn等等。SCM英文全稱是:供應鏈管理。這里我們指代碼倉庫管理
branches: [[name: 'test_eureka-server']] 表示指定分支為:test_eureka-server
doGenerateSubmoduleConfigurations: false 不生成子模塊設置
extensions 擴展設置
submoduleCfg 子模塊設置
userRemoteConfigs 用戶遠程設置,主要設置gitlab相關配置
credentialsId 憑證id,點擊jenkins-->憑證,就可看到。通過這個用戶,就有權限從gitlab上面拉取代碼了。
url gitlab項目地址,可以是ssh方式,也可以是http方式。
stage('code Build') {} 代碼構建,這里面,主要是指定pom.xml文件,編譯出jar包。
stage('code deploy') {} 代碼發布,執行shell命令。
stage('code rollback') {} 代碼回滾,執行shell命令。
點擊頁面的構建
點擊構建
效果如下:
如果安裝了Blue Ocean插件,點擊左側的Blue Ocean
效果如下:
如果不考慮回滾, pipeline可以精簡一些,比如:

node { stage('code pull') { checkout([$class: 'GitSCM', branches: [[name: 'test_eureka-server']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'bf8a2a98-bb4f-461e-be46-2b49702d19b0', url: 'ssh://git@gitlab.baidu.com:22/eureka-server.git']]]) } stage('code Build') { sh 'mvn -f pom.xml clean package -Pdev -Dmaven.test.skip=true' } stage('code deploy') { sh 'ansible-playbook -v /opt/ansible/test/deploy_standard_template.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_NUMBER=${BUILD_NUMBER} ENV=test PROJECT_NAME=eureka-server PREFIX=eureka-server PORT=8761"' } }
本文參考鏈接:
https://www.cnblogs.com/shenh/p/8963688.html
https://blog.csdn.net/diantun00/article/details/81075007
https://www.cnblogs.com/woshimrf/p/gitlab-with-jenkins.html