jenkins pipeline持續集成

一、概述

簡介

 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://[email protected]: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://[email protected]: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"'
   }
}
View Code

 

 

本文參考鏈接:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章