文章目錄
- jenkins 安裝
- jenkins 配置
- jenkins 快速上手
- 在 jenkins 中創建一個新的 Pipeline 作業
- 配置Pipeline
- 運行 Pipeline 作業
- Pipeline
- 概述
- Declarative Pipeline
- Scripted Pipeline
jenkins 安裝
安裝環境:
- Linux CentOS 10:Linux CentOS9安裝配置
- Java 21:Java downloads
- jenkins WAR 包:下載 Jenkins
官方給的下載方式很簡單明了
此處博主的Jenkins 安裝目錄為:/home/fishpie/workspace/apps/
運行安裝命令:
java -jar jenkins.war --httpPort=8080
如果遇到字體配置(Fontconfig)失敗,可能是因為 linux 操作系統采用了最小化安裝,缺失
- fontconfig 包或相關字體
- 缺少 libfontconfig 或其他圖形依賴
SEVERE hudson.util.BootFailure#publish: Failed to initialize Jenkins java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration
解決辦法:
# 安裝 fontconfig 和默認字體 sudo dnf install -y fontconfig dejavu-sans-fonts # 安裝圖形相關依賴 sudo dnf install -y libX11 libXext libXrender libXtst libXi
另外如果出現
security
問題,需要注意系統時間是否正確
出現此頁面證明Jenkins 安裝完成,此時訪問本機的 8080
端口即可訪問 Jenkins
例如我本地裝了 Jenkins 的機器:
http://192.168.156.129:8080/
jenkins 配置
密碼登錄進入后建議選擇 安裝推薦的插件
如果遇到插件安裝錯誤可以多次嘗試安裝,可在
Manage Jenkins -> Plugins -> Download progress
中找到 安裝完成后重啟Jenkins 選項并勾選
正常的 jenkins 界面
jenkins 快速上手
前置環境:
- git
- docker
- 更新 OpenSSL 和 SSL 證書
# 安裝或更新 OpenSSL
sudo dnf install -y openssl
# 更新 CA 證書
sudo dnf install -y ca-certificates
sudo update-ca-trust
- 安裝 jenkins 的 docker pipline 插件
采用 github 項目 https://github.com/yeasy/simple-web 演示使用jenkins 構建和部署一個項目的完整過程
在 jenkins 中創建一個新的 Pipeline 作業
- 登錄到你的 Jenkins 控制臺。
- 在左側菜單中點擊 New Item(新建項目)。
- 輸入作業名稱,例如 SimpleWebPipeline。
- 選擇 Pipeline(流水線)作為項目類型,然后點擊 OK。
配置Pipeline
- 在作業配置頁面,向下滾動到 Pipeline(流水線)部分。
- 在 Definition(定義)下拉菜單中,選擇 Pipeline script(流水線腳本)。
- 在 Script(腳本)文本框中,粘貼以下 Jenkinsfile 代碼:
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/yeasy/simple-web.git'}}stage('Build') {steps {script {// 驗證 Docker 環境sh 'docker version'// 構建 Docker 鏡像def image = docker.build("simple-web:latest")}}}stage('Deploy') {steps {script {// 停止并刪除已存在的容器sh 'docker rm -f simple-web || true'// 運行新容器docker.image("simple-web:latest").run("-d -p 8081:80 --name simple-web")}}}}
}
- 點擊 Save(保存)以保存作業配置。
運行 Pipeline 作業
- 在作業頁面,點擊 Build Now(立即構建)以啟動流水線。
- 通過點擊 Build History(構建歷史)下的構建編號并選擇 Console Output(控制臺輸出),監控構建過程。你將看到每個階段(Checkout、Build、Deploy)的執行情況。
如果構建成功,則可在本機看到構建成功的鏡像與進程
訪問本機的 8081 端口可以正常看到網頁
Pipeline
概述
Jenkins Pipeline(或簡稱為 “Pipeline”)是一套插件,將持續交付的實現和實施集成到 Jenkins 中
Jenkins Pipeline 有兩種主要語法:
-
Declarative Pipeline:結構化、易讀,適合大多數場景,推薦初學者使用。
-
Scripted Pipeline:基于 Groovy 語言,靈活但復雜,
Declarative Pipeline
固定結構,主要由 pipeline
塊構成,包含以下核心部分:
- agent:定義執行 Pipeline 的環境。
- stages:定義一系列構建階段。
- steps:每個階段的具體操作。
- post:構建后的處理邏輯。
pipeline 塊
- 作用:pipeline 的根節點,包含整個流水線的定義
- 要求:所有的 Declarative Pipeline 必須以
pipeline {}
開始 - 示例:
pipeline {// 流水線內容
}
agent 指令
- 作用:指定 pipeline或特定階段運行的執行環境(節點或容器)
- 常用選項:
any
:可在任何節點上運行(默認)none
:不指定全局代理,需要在每個stage
中定義docker
:在 Docker 容器中運行label
:在帶有特定標簽的節點上運行
- 示例:
// 表示 pipeline 在 jenkins 主節點或任意代理節點上運行
pipeline {agent any
}
//使用 Docker 容器運行
pipeline {agent {docker {image 'maven:3.6.3-jdk-11'args '-v /root/.m2:/root/.m2'}}
}
//在 Maven 容器中運行,掛載本地 Maven 緩存
stages 和 stage
- 作用:
stages
:包含所有階段的集合stage
:定義單個階段(如拉取代碼、構建、部署)
可以把“步驟(step)”看作一個執行單一動作的單一的命令。 當一個步驟運行成功時繼續運行下一個步驟。 當任何一個步驟執行失敗時,Pipeline 的執行結果也為失敗
當所有的步驟都執行完成并且為成功時,Pipeline 的執行結果為成功
- 結構:
stages {stage('Stage Name') {steps {// 操作}}
}
- 示例:
pipeline {agent anystages {stage('Checkout') {steps {git 'https://github.com/yeasy/simple-web.git'}}stage('Build') {steps {script {// 驗證 Docker 環境sh 'docker version'// 構建 Docker 鏡像def image = docker.build("simple-web:latest")}}}stage('Deploy') {steps {script {// 停止并刪除已存在的容器sh 'docker rm -f simple-web || true'// 運行新容器docker.image("simple-web:latest").run("-d -p 8081:80 --name simple-web")}}}}
}
- Checkout:從 github 克隆代碼
- Build:構建 Docker 鏡像
- Deploy:運行 Docker 容器
每個
stage
是一個邏輯單元,失敗后會阻止后續階段執行階段名稱(如 Checkout)會顯示在 Jenkins 的 Pipeline 視圖中
節點名稱可以自定義
steps 指令
-
作用:定義階段內的具體操作(如執行命令、調用插件)
-
常用步驟:
sh
:執行 Linux、BSD 和 Mac OS(類 Unix ) 系統中的 shell 命令bat
:執行 Windows 批處理命令git
:拉取 Git 倉庫代碼docker
:調用 Docker 命令(需要 Docker Pipeline 插件)archiveArtifacts
:歸檔構建產物
如果在
archiveArtifacts
步驟中指定了多個參數, 那么每個參數的名稱必須在步驟代碼中明確指定, 即文件的路徑、文件名和fingerprint
三個參數。 如果只需指定文件的路徑和文件名, 那么可以省略參數名稱artifacts
,例如:archiveArtifacts 'build/libs/**/*.jar'
junit
:發布測試報告
-
示例:
// 拉取指定 Git 倉庫
steps {git 'https://github.com/yeasy/simple-web.git'
}
pipeline {agent anystages {stage('Build') {steps {sh './gradlew build'}}stage('Test') {steps {sh './gradlew check'}}}post {always {archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: truejunit 'build/reports/**/*.xml'}}
}
script 塊
- 作用:允許在 Declarative Pipeline 中嵌入 Scripted Pipeline 的 Groovy 代碼,用于復雜邏輯
// 檢查 docker 環境并構建鏡像,負載操作采用 script 塊包裹
steps {script {sh 'docker version'def image = docker.build("simple-web:latest")}
}
post 指令
-
作用:鉤子函數,定義構建完成后執行的操作,基于構建結果觸發
-
常用條件:
always
:無論成功或失敗都執行success
:構建成功時執行failure
:構建失敗時執行unstable
:構建不穩定時執行(如測試失敗)
-
示例:
// 如果構建成功則打包為 jar 包,否則發送指定郵件提醒
post {always {echo 'Pipeline finished!'}success {archiveArtifacts artifacts: '**/target/*.jar', allowEmptyArchive: true}failure {mail to: 'admin@example.com', subject: 'Build Failed', body: 'Check Jenkins for details.'}
}
pipeline {agent anystages {stage('No-op') {steps {sh 'ls'}}}post {always {echo 'One way or another, I have finished'deleteDir() /* clean up our workspace */}success {echo 'I succeeeded!'}unstable {echo 'I am unstable :/'}failure {echo 'I failed :('}changed {echo 'Things were different before...'}}
}
tools 指令
- 作用:指定構建所需的工具版本(如 JDK、Maven),從 jenkins 全局工具配置中加載
- 示例:
自動配置 Maven 和 JDK 環境
tools {maven 'Maven 3.6.3'jdk 'JDK 21'
}
需要在 Manage Jenkins > Tool 中預先配置工具
environment 指令
- 作用:定義環境變量
- 示例:
// 創建環境變量,相當于 Java 中的定義字符串
environment {DOCKER_IMAGE = 'simple-web:latest'APP_PORT = '8081'
}
// 引用上面的環境變量
sh "docker run -p ${APP_PORT}:80 ${DOCKER_IMAGE}"
同時,我們可以將 simple-web 的 pipeline 部分優化為:
environment {IMAGE_NAME = 'simple-web:latest'
}
stages {stage('Build') {steps {script {docker.build("${IMAGE_NAME}")}}}
}
when 指令
Java 語言的本性
- 作用:控制階段是否執行,基于條件判斷
- 示例:
stage('Deploy') {when {branch 'main'}steps {// 僅在 main 分支上部署}
}
- 常用條件
branch
:指定分支environment
:檢查環境變量expression
:自定義 Groovy 表達式
try-catch
- 作用:捕獲并處理階段失敗,異常處理
- 示例:
steps {script {try {sh 'make test'} catch (Exception e) {echo "Tests failed: ${e}"currentBuild.result = 'UNSTABLE'}}
}
// 執行 make test 命令,如果未能正常執行,則回顯異常并設置當前構建結果為 UNSTABLE
retry-timeout
- 作用:重復執行步驟直到成功(重試)和如果一個步驟執行花費的時間太長則退出
stage('Deploy') {steps {retry(3) {sh './flakey-deploy.sh'}timeout(time: 3, unit: 'MINUTES') {sh './health-check.sh'}}
}
// 在 Deploy 階段重復執行 flakey-deploy.sh 腳本 3 次,然后等待 health-check.sh 腳本最長執行 3 分鐘,如果 health-check.sh 超過 3 分鐘內沒有完成,pipeline 會標記此 Deploy 階段為失敗
Scripted Pipeline
Scripted Pipeline 是 Jenkins Pipeline 的另一種語法,基于 Groovy 語言,結構更自由但復雜
核心特點:
- 使用 node 塊定義執行環境
- 直接編寫 Groovy 代碼,沒有固定的 stages 或 steps 結構
- 適合需要高度自定義的場景。
可以將上述的 jenkins 快速上手 中的 Declarative Pipeline 改寫為 Scripted Pipeline
node {stage('Checkout') {git 'https://github.com/yeasy/simple-web.git'}stage('Build') {def image = docker.build("simple-web:latest")}stage('Deploy') {sh 'docker rm -f simple-web || true'docker.image("simple-web:latest").run("-d -p 8081:80 --name simple-web")}
}
Declarative Pipeline 與 Scripted Pipeline 的區別
特性 | Declarative Pipeline | Scripted Pipeline |
---|---|---|
語法 | 結構化,固定格式 | 自由,基于 Groovy |
易用性 | 簡單,適合初學者 | 復雜,需熟悉 Groovy |
可讀性 | 高,清晰的階段劃分 | 較低,代碼風格自由 |
靈活性 | 有限,需用 script 塊擴展 | 高,完全自定義 |
錯誤處理 | 內置錯誤檢查 | 需手動處理 |