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.mzph.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常用开…