Jenkins Pipeline 構建 CI/CD 流程

文章目錄

    • 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 快速上手

前置環境:

  1. git
  2. docker
  3. 更新 OpenSSL 和 SSL 證書
# 安裝或更新 OpenSSL
sudo dnf install -y openssl
# 更新 CA 證書
sudo dnf install -y ca-certificates
sudo update-ca-trust
  1. 安裝 jenkins 的 docker pipline 插件

采用 github 項目 https://github.com/yeasy/simple-web 演示使用jenkins 構建和部署一個項目的完整過程

在 jenkins 中創建一個新的 Pipeline 作業

  1. 登錄到你的 Jenkins 控制臺。
  2. 在左側菜單中點擊 New Item(新建項目)。
  3. 輸入作業名稱,例如 SimpleWebPipeline。
  4. 選擇 Pipeline(流水線)作為項目類型,然后點擊 OK

在這里插入圖片描述
在這里插入圖片描述


配置Pipeline

  1. 在作業配置頁面,向下滾動到 Pipeline(流水線)部分。
  2. Definition(定義)下拉菜單中,選擇 Pipeline script(流水線腳本)。
  3. 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")}}}}
}
  1. 點擊 Save(保存)以保存作業配置。

在這里插入圖片描述


運行 Pipeline 作業

  1. 在作業頁面,點擊 Build Now(立即構建)以啟動流水線。
  2. 通過點擊 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 PipelineScripted Pipeline
語法結構化,固定格式自由,基于 Groovy
易用性簡單,適合初學者復雜,需熟悉 Groovy
可讀性高,清晰的階段劃分較低,代碼風格自由
靈活性有限,需用 script 塊擴展高,完全自定義
錯誤處理內置錯誤檢查需手動處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80456.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CF】Day43——Codeforces Round 906 (Div. 2) E1

E1. Doremys Drying Plan (Easy Version) 題目: 思路: very好題,加深對掃描線的應用,值得深思 由于k 2,那我們就可以使用簡單一點的方法來寫 題目可以轉化為:給定n個線段,現在讓你刪去2條線段…

電子設備的“記憶大腦”:NAND、NOR、EEPROM誰在掌控你的數據?

大家好,我是硅言。存儲芯片是電子設備的“記憶大腦”,未進入存儲行業工作之前,一聽到NAND、NOR、EEPROM這些專業名詞就頭大。本文用通俗的語言,帶大家了解這三種常見存儲芯片的核心區別和應用場景。 一、存儲芯片的“門派”&#…

可視化程序設計|| 實驗三:C#面向對象編程(二)

一、實驗目的 1.加深理解面向對象編程的概念,如類、對象、實例化等。 2.熟練掌握類的封裝、繼承和多態機制。 3.掌握編程常用的幾種排序算法。 4.理解異常的產生過程和異常處理的概念,掌握C#異常處理的方法。 5.能夠將面向對象思想應用與編程實踐&a…

STM32MPU開發之旅:從零開始構建嵌入式Linux鏡像

前言 在工業4.0與邊緣計算深度融合的今天,STM32MP257F作為意法半導體第二代工業級64位微處理器的旗艦產品,憑借異構計算架構、1.35 TOPS邊緣AI算力和軍工級安全特性,已成為工業自動化、機器視覺和新能源控制等領域的標桿方案。 性能躍遷的異…

大模型應用開發(PAFR)

Prompt問答 特征:利用大模型推理能力完成應用的核心功能 應用場景: 文本摘要分析 輿情分析 坐席檢查 AI對話 AgentFunction Calling 特征:將應用端業務能力與AI大模型推理能力結合,簡化復雜業務功能開發 應用場景: 旅行指南 數據…

SpringClound 微服務分布式Nacos學習筆記

一、基本概述 在實際項目中,選擇哪種架構需要根據具體的需求、團隊能力和技術棧等因素綜合考慮。 單體架構(Monolithic Architecture) 單體架構是一種傳統的軟件架構風格,將整個應用程序構建為一個單一的、不可分割的單元。在這…

WebRTC服務器Coturn服務器用戶管理和安全性

1、概述 Coturn服務器對用戶管理和安全方面也做了很多的措施,以下會介紹到用戶方面的設置 1.1、相關術語 1.1.1 realm 在 coturn 服務器中,域(realm)是一種邏輯上的分組概念,用于對不同的用戶群體、應用或者服務進行區…

基于opencv和PaddleOCR識別身份證信息

1、安裝組件 pip install --upgrade paddlepaddle paddleocr 2、完整code import cv2 import numpy as np from paddleocr import PaddleOCR# 初始化 PaddleOCR use_angle_clsTrue, lang"ch", det_db_thresh0.1, det_db_box_thresh0.5)def preprocess_image(image…

【6】GD32 高級通信外設 CAN、USBD

高級通信外設:CAN、USBD CAN CAN簡介、主要功能與相關API回環模式收發發送特定ID的數據幀實驗CAN數據幀的接收實驗使用過濾器接收特定的數據幀 USBD USB通信簡介USBD設備固件庫架構、分層文件與庫函數說明USBD模擬鍵盤應用USBD虛擬串口應用USBD模擬U盤應用

【LLM+Code】Windsurf Agent 模式PromptTools詳細解讀

一、前言 https://windsurf.com/ https://windsurf.com/blog/why-we-built-windsurf https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/Windsurf 二、System Prompt 相比于cursor和claude code, windsurf的system prompt非常長&am…

安全性測試常規測試點全解析:從基礎到高級的實戰指南

引言 安全性測試是保障軟件系統免受惡意攻擊的核心環節,其目標是識別系統在設計、開發、部署過程中存在的安全漏洞。本文將圍繞12大常規安全測試點展開,結合具體測試方法、示例代碼及防范建議,幫助讀者構建完整的安全測試體系。 一、認證與授權測試 1. 認證機制測試 測試…

OpenCV 圖形API(55)顏色空間轉換-----將圖像從 RGB 色彩空間轉換為 I420 格式函數RGB2I420()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 將圖像從 RGB 色彩空間轉換為 I420 色彩空間。 該函數將輸入圖像從 RGB 色彩空間轉換為 I420。R、G 和 B 通道值的常規范圍是 0 到 255。 輸出圖…

Pycharm(十六)面向對象進階

一、繼承 概述: 實際開發中,我們發現很多類中的步分內容是相似的,或者相同的,每次寫很麻煩,針對這種情況, 我們可以把這些相似(相同的)部分抽取出來,單獨地放到1個類中&…

Codeforces Round 1020 (Div. 3)(題解ABCDEF)

A. Dr. TC 有n次翻轉,從1到n,0->1,1->0,每次統計1的數量,設cnt1是字符串1的數量,n次就是n*cnt1, 但每個1都會被翻轉一次減去一個cnt1,再統計cnt0,每個被翻轉一次,答案就是(n-1)*cnt1cnt0…

HTML字符實體和轉義字符串

HTML字符實體和轉義字符串用于處理特殊字符,確保它們在不同上下文中正確顯示或解析。以下是詳細總結: HTML字符實體(Character Entities) ?定義?:用于在HTML中表示保留字符或不可見字符,避免與HTML語法…

FreeRTOS菜鳥入門(六)·移植FreeRTOS到STM32

目錄 1. 獲取裸機工程模版 2. 下載 FreeRTOS V9.0.0 源碼 3. FreeRTOS文件夾內容簡介 3.1 FreeRTOS文件夾 3.1.1 Demo文件夾 3.1.2 License 文件夾 3.1.3 Source 文件夾 3.2 FreeRTOS-Plus 文件夾 4. 往裸機工程添加 FreeRTOS 源碼 5. 拷貝 FreeRTOSConfig…

通過 Tailwind CSS 自定義樣式 實現深色模式切換

創建vite項目或者vue-cli配置大同小異 1、當前環境 Vue.js 3.5nuxtjs/tailwindcss 6.13.1nuxt3.15.4node18 這里主要依賴是tailwindcss 因為當前項目是使用nuxt開發。 2、配置顏色模式 在assets/css下創建main.css * {padding: 0;margin: 0;box-sizing: border-box; }[dat…

PWNOS:2.0(vulnhub靶機)

文章目錄 靶機地址主機發現、端口掃描web滲透目錄探測漏洞利用權限提升 解密工具地址總結 靶機地址 https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z 這里如果是windows系統直接使用vmware或者virtubox打開可以使用,如果是mac系統需再去做一個配置,比較麻煩 這里…

Gartner魔力象限(Gartner Magic Quadrant)

Gartner魔力象限(Gartner Magic Quadrant)是由全球領先的研究和咨詢公司Gartner發布的市場研究報告,廣泛應用于IT行業,尤其是在技術供應商評估中。它以圖形化的方式展示了不同技術領域中各個供應商的市場表現,幫助企業…

信創時代開發工具選擇指南:國產替代背景下的技術生態與實踐路徑

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開…