
?
(資料圖)
Pipeline流水線,其實就是將之前的一個任務(wù)或者一個腳本就做完的工作,用Pipeline語法劃分為多個子任務(wù)然后分別執(zhí)行。二者實現(xiàn)的最終效果是一樣的,但是由于原始任務(wù)劃分為多個子任務(wù)之后,以流水線的方式來執(zhí)行,那么就可以隨時查看任意子任務(wù)的執(zhí)行效果,即使在某個階段出現(xiàn)問題,也可以隨時直接定位問題的發(fā)生點。
Pipeline基于Groovy DSL(領(lǐng)域特定語言Domain Specific Language )實現(xiàn),任何發(fā)布流程都可以表述為 一段Groovy腳本。 Groovy是一種基于JVM虛擬機的敏捷開發(fā)語言,它結(jié)合了Python、Ruby和Smalltalk的許多強大的特性,Groovy 是用Java寫的,Groovy語法與Java語法類似, Groovy 代碼不僅能夠與 Java 代碼很好地結(jié)合,也能用于擴展現(xiàn)有代碼。由于其運行在 JVM 上的特性,Groovy也可以使用其他非Java語言編寫的庫
當(dāng)前 Jenkins 2.X 支持兩種語法的流水線:聲明式和腳本式
腳本式Scripted Pipeline語法: 此語法是 Jenkins最先支持pipeline語法,它采用命令式風(fēng)格,直接在流水線腳本中定義邏輯和程序流程 聲明式Declarative Pipeline語法:后來CloudBees公司為Jenkins引入的一種“流水線即代碼”的 pipeline語法,它允許用戶在pipeline的定義中將更多的精力關(guān)注于期望pipeline的狀態(tài)和輸出之上,而非實現(xiàn)邏輯無論是腳本式語法還是聲明式語法,他們本質(zhì)上都是執(zhí)行各種命令,對于不同的命令需要采用專用的語法來實現(xiàn)指定的功能,常見的語法命令及其樣式如下:
echo: 輸出信息,echo "Building" sh: 執(zhí)行命令,sh "command" sh([script: "echo hello"]) git: 克隆代碼,git branch: "main", credentialsId: "d532ca28-c238-432c-97c3-a001f45f0aaf", url: "git@gitlab.wxd.com:dev1/hello-world-war.git" env: 設(shè)置變量, env.PATH="/usr/local/java/bin:$PATH"http://jenkins-server:8080/job/工程名/pipeline-syntax/#注意:需要安裝pipeline插件并且是pipeline風(fēng)格的任務(wù)
node { stage("Source") { // } stage("Build") { // } stage("Test") { // } stage("Deploy") { // } }
所有有效的聲明式流水線必須包含在一個 pipeline 塊中, 比如:
pipeline {/* insert Declarative Pipeline here */}
Pipeline 的聲明式語法要點
steps內(nèi)部的命令,每一條單獨的命令都在當(dāng)前任務(wù)的工作目錄下執(zhí)行。 即使A命令切換到了一個新的目錄,接下來的B命令并不會在對應(yīng)的新目錄中執(zhí)行,而是在當(dāng)前任務(wù) 的工作目錄下執(zhí)行。如果非要在切換后的目錄下執(zhí)行命令B,那么采用shell中的&&符號將多條命令拼接在一起即可。 默認情況下,不支持shell里面的復(fù)雜語法,因為groovy有自己的條件表達式 如果jenkins的工作目錄下存在同名目錄,則獲取失敗基本語法
pipeline { agent any stages { stage("獲取代碼") { steps { echo "獲取代碼" } } stage("構(gòu)建代碼") { steps { echo "構(gòu)建項目代碼" } } stage("代碼測試") { steps { echo "測試項目功能" } } stage("項目部署") { steps { echo "部署項目" } } }}
安裝 Pipeline 和 Pipeline Stage View 插件
這里就用hello-world-war項目
Pipeline script的內(nèi)容如下:
node { stage("clone代碼"){ git branch: "main", credentialsId: "d532ca28-c238-432c-97c3-a001f45f0aaf", url: "git@gitlab.wxd.com:dev1/hello-world-war.git" } stage("代碼復(fù)制"){ sh "ssh 192.168.1.105 "rm -rf /var/lib/tomcat9/webapps/*"" sh "scp -r /var/lib/jenkins/workspace/hello-world-war/* 192.168.1.105:/var/lib/tomcat9/webapps/" } stage("停止tomcat服務(wù)"){ sh "ssh 192.168.1.105 "systemctl stop tomcat9"" } stage("啟動tomcat服務(wù)"){ sh "ssh 192.168.1.105 "systemctl start tomcat9"" } }
項目構(gòu)建效果如下:
這里用Spring Boot Helloworld項目。 在聲明式Pipeline中,steps 內(nèi)部的命令,每一條單獨的命令都在當(dāng)前任務(wù)的工作目錄下執(zhí)行。 之前是選擇Pipeline script在那里直接寫腳本內(nèi)容,但是當(dāng)腳本內(nèi)容過多時,如果項目運行出現(xiàn)問題,要想檢查腳本內(nèi)容就非常麻煩,不便于維護。因此可以使用Jenkinsfile的形式去運行項目。 在項目目錄中新建Jenkinsfile文件,內(nèi)容即為聲明式Pipeline的內(nèi)容:
pipeline { agent any tools { #這里的配置跟Jenkins全局配置有關(guān)系 maven "maven-3.6.3" } stages { stage("code clone") { steps { git branch: "main", credentialsId: "d532ca28-c238-432c-97c3-a001f45f0aaf", url: "git@gitlab.wxd.com:dev1/spring-boot-helloWorld.git" } } stage("Build") { steps { sh "mvn clean package -Dmaven.test.skip=true" } } stage("停止spring boot服務(wù)"){ steps { sh "ssh 192.168.1.105 "killall -0 java && killall -9 java"" } } stage("代碼復(fù)制"){ steps { sh "scp target/spring-boot-helloworld-*.jar 192.168.1.105:/data/" } } stage("啟動spring boot服務(wù)"){ steps { sh "ssh 192.168.1.105 "nohup java -jar /data/spring-boot-helloworld-0.9.0-SNAPSHOT.jar --server.port=8888 &>/dev/null & "" } } }}
將更新的內(nèi)容再提交
git add .;git commit -m "jenkinsfile";git push origin main
修改Pipeline使用Jenkinsfile文件,注意使用SCM 軟件配置管理(Software Configuration Management)選項
構(gòu)建效果如下: