每日熱議!Jenkins Pipeline

2023-01-16 14:14:58 來源:51CTO博客

?


(資料圖)

一、Pipeline介紹

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語言編寫的庫

二、Pipeline優(yōu)勢

一致性: pipeline 用統(tǒng)一語法的代碼的方式實現(xiàn)各個CICD的階段的任務(wù),不僅可以被納入版本控制,還可以通過編輯代碼實現(xiàn)目標效果 直觀性: 構(gòu)建過程中每一步都可以直接的圖形化顯示輸出,比如每個階段的執(zhí)行時間,直觀友好,pipeline 幫助我們快速的定位哪個階段的任務(wù)出現(xiàn)錯誤 可持續(xù)性:jenkins的重啟或者中斷后不影響已經(jīng)執(zhí)行的pipeline Job 支持暫停:pipeline可以選擇停止并等待人工輸入或批準后再繼續(xù)執(zhí)行 支持回放: 如果失敗,可以使用回放,進行臨時性的修改 job,再調(diào)試執(zhí)行,如果成功,再真正修改任務(wù)即可 可擴展:通過groovy的編程更容易的擴展插件 并行執(zhí)行:通過groovy腳本可以實現(xiàn)step,stage間的并行執(zhí)行,和更復(fù)雜的相互依賴關(guān)系多功能:支持復(fù)雜CD要求,包括fork/join子進程,條件判斷,循環(huán)和并行執(zhí)行工作的能力

三、Pipeline語法

3.1 Pipeline語法介紹&結(jié)構(gòu)

當(dāng)前 Jenkins 2.X 支持兩種語法的流水線:聲明式和腳本式

腳本式Scripted Pipeline語法: 此語法是 Jenkins最先支持pipeline語法,它采用命令式風(fēng)格,直接在流水線腳本中定義邏輯和程序流程 聲明式Declarative Pipeline語法:后來CloudBees公司為Jenkins引入的一種“流水線即代碼”的 pipeline語法,它允許用戶在pipeline的定義中將更多的精力關(guān)注于期望pipeline的狀態(tài)和輸出之上,而非實現(xiàn)邏輯

3.1.1 Pipeline的基本結(jié)構(gòu)

Pipeline:流水線的最外層結(jié)構(gòu),代表整條pipeline,包含著pipeline的完整邏輯;是聲明式流水線語法的關(guān)健特征 node和agent:用于定義任務(wù)在哪里執(zhí)行.每個node都是一個 Jenkins 節(jié)點,可以是 Jenkins master也可以是 Jenkins agent,node是執(zhí)行 step的具體服務(wù)器。node 代碼塊也是腳本式pipeline語法的關(guān)健特性,聲明式pipeline使用agent關(guān)健字 stages:用于包含所有stage的定義 stage:指定 stage 的名稱, 用于定義每個階段 stage 的主要任務(wù).一個pipeline可以劃分為若干個stage,每個stage都是一個完整的操作,比如: clone代碼、代碼編譯、代碼測試和代碼部署,階段是一個邏輯分組,可以跨多個node執(zhí)行。steps:每個階段stage需要執(zhí)行哪些命令.步驟 steps 是jenkins pipeline最基本的操作單元,從在服務(wù)器創(chuàng)建目錄到構(gòu)建容器鏡像,由各類 Jenkins 插件提供實現(xiàn),例如: sh “make” post:用在stages代碼塊或整個pipeline執(zhí)行完成后的附加步驟,此指令非必須項

3.1.2 常用指令

無論是腳本式語法還是聲明式語法,他們本質(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"

3.1.3 Jenkins內(nèi)置語法幫助?

http://jenkins-server:8080/job/工程名/pipeline-syntax/#注意:需要安裝pipeline插件并且是pipeline風(fēng)格的任務(wù)

3.2 腳本式流水線語法

node {       stage("Source") {         //     }     stage("Build") {         //     }     stage("Test") {         //     }     stage("Deploy") {         //     } }

3.3 聲明式流水線語法?

所有有效的聲明式流水線必須包含在一個 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 插件

五、腳本式Pipeline實戰(zhàn)

這里就用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)建效果如下:

六、聲明式Pipeline實戰(zhàn)

這里用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)建效果如下:

標簽: 并行執(zhí)行 當(dāng)前任務(wù) 出現(xiàn)問題

上一篇:【深入淺出Spring原理及實戰(zhàn)】「源碼調(diào)試分析」結(jié)合DataSourceRegister深入分析ImportBeanDefinitionRegistrar的源碼運作流程
下一篇:從 Kubectl Top 說起, 談?wù)?Kubernetes 是如何進行資源監(jiān)控的?