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 快速上手
前置环境:
- 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 块扩展 | 高,完全自定义 |
错误处理 | 内置错误检查 | 需手动处理 |
相关文章:

Jenkins Pipeline 构建 CI/CD 流程
文章目录 jenkins 安装jenkins 配置jenkins 快速上手在 jenkins 中创建一个新的 Pipeline 作业配置Pipeline运行 Pipeline 作业 Pipeline概述Declarative PipelineScripted Pipeline jenkins 安装 安装环境: Linux CentOS 10:Linux CentOS9安装配置Jav…...
蓝桥杯 8. 移动距离
移动距离 原题目链接 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。楼房的编号为 1, 2, 3, ⋯⋯。 当排满一行时,从下一行相邻的楼往反方向排号。 例如,当小区排号宽度为 6 时,排列如下: 1 2 …...

AJAX 介绍
一、什么是AJAX ? AJAX 是 异步的 JavaScript 和 XML(Asynchronous JavaScript And XML) 的缩写,是一种实现浏览器与服务器进行数据通信的技术。其核心是通过 XMLHttpRequest 对象在不重新刷新页面的前提下,与服务器交换数据并更…...
硬盘损坏数据恢复后对python程序的影响
最近硬盘突然间坏掉了,让数据商恢复了2个月今天终于拿到了恢复后的数据。 但是一测试问题就来了: PS E:\geosystem> python manage.py runserver 0.0.0.0:5000 Unhandled exception in thread started by <function check_errors.<locals>.…...

promis(resolve,reject)入门级别
JavaScript Promise 的定义 Promise 是一种用于处理异步操作的对象,表示一个可能已经完成或者尚未完成的操作的结果。它的核心作用在于简化复杂的回调嵌套问题(即所谓的“回调地狱”),使异步代码更加清晰易读。 Promise 的状态 …...

w~嵌入式C语言~合集6
我自己的原文哦~ https://blog.51cto.com/whaosoft/13870384 一、开源MCU简易数字示波器项目 这是一款采用STC8A8K MCU制造的简单示波器,只有零星组件,易于成型。这些功能可以涵盖简单的测量: 该作品主要的规格如下: 单片机…...

学习海康VisionMaster之路径提取
一:进一步学习了 今天学习下VisionMaster中的路径提取:可在绘制的路径上等间隔取点或查找边缘点 二:开始学习 1:什么是路径提取? 相当于事先指定一段路径,然后在对应的路径上查找边缘,这个也是…...
第十二章-PHP文件上传
第十二章-PHP文件上传 一,文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时,浏览器会将表单数据编码为多部分(multipart)格式。 Boundary分隔符:随机生成的…...

第35课 常用快捷操作——用“鼠标左键”拖动图元
概述 拖动某个图元,是设计过程中常需要用到的操作,我们可以在原理图中拖动某个元器件符号,也可以在PCB图中拖动某个焊盘。 和常用的软件类似,用按住鼠标左键的方式来完成拖动操作。 用鼠标左键拖动图元 在想要拖动的图元上&…...
qt.qpa.plugin: Could not find the Qt platform plugin “cocoa“ in “ “
开发的pyqt项目在Windows运行时没啥问题,移植到Mac中时,发现一直报错qt.qpa.plugin: Could not find the Qt platform plugin “cocoa” in " ",一开始认为是pyqt版本问题,换了版本依旧不行。后续按照网上pip install o…...

二、Web服务常用的I/O操作
一、单个或者批量上传文件 前端: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件…...

「Mac畅玩AIGC与多模态04」开发篇01 - 创建第一个 LLM 对话应用
一、概述 本篇介绍如何在 macOS 环境下,基于已部署完成的 Dify 平台和本地 LLM 模型(如 DeepSeek),创建并测试第一个基础对话应用,实现快速验证推理服务与平台交互功能。 二、应用创建流程 1. 通过首页创建应用 打…...

深度探究获取淘宝商品数据的途径|API接口|批量自动化采集商品数据
在电商行业竞争日益激烈的今天,淘宝商品数据如同蕴藏巨大价值的宝藏,无论是商家进行竞品分析、优化商品策略,还是数据分析师挖掘市场趋势,都离不开对这些数据的获取与分析。本文将深入探讨获取淘宝商品数据的多种途径,…...

马哥教育Linux云计算运维课程
课程大小:19.1G 课程下载:https://download.csdn.net/download/m0_66047725/90640128 更多资源下载:关注我 你是否找了很多资料看了很多视频聊了很多群友,却发现自己技术仍然原地踏步?本教程联合BAT一线导师倾囊相授…...

FPGA与边缘AI:计算革命的前沿力量
在数字化转型浪潮中,边缘计算和人工智能正引领着技术革命。而FPGA(现场可编程门阵列)作为一种独特的硬件架构,正逐渐成为边缘AI领域的关键推动力。本文将探讨FPGA与边缘AI的结合如何重塑我们的数字世界,以及这一技术融…...

Kafka 架构设计和组件介绍
什么是Apache Kafka? Apache Kafka 是一个强大的开源分布式事件流平台。它最初由 LinkedIn 开发,最初是一个消息队列,后来发展成为处理各种场景数据流的工具。 Kafka 的分布式系统架构支持水平扩展,使消费者能够按照自己的节奏检…...
虚函数表的设计和多态的实现
虚函数表 1.包含虚函数的类会有对应的虚函数表,这个表在编译时就初始化好了 2.本质是一个函数指针数组,里面是虚函数的指针 3.该类实例化的对象共用一张虚函数表 4.子类的虚函数表会继承父类的虚函数,如果继承多个父类那就把父类的虚函数…...

【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务
一、引言 DPlayer官网:DPlayer 官方弹幕后端服务:DPlayer-node MoePlayer/DPlayer-node:使用 Docker for DPlayer Node.js 后端(https://github.com/DIYgod/DPlayer) 本来想直接使用官网提供的DPlayer-node直接搭建…...

OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理
OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理 目录 OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理 一、MS ODBC驱动 1.1、安装到Windows后的表现形式 1.2、版本的互斥性 1.3、安装程序 1.4、配置后才可用 二、Navicat数据库管理工具 2.1、安…...
织梦dedecms调用会员详细字段信息
织梦如何调用会员详细信息: 在include/extend.func.php function GetMemberInfos($fields,$mid){ global $dsql; if($mid < 0){ $revalue "Error"; } else{ $row$dsql->GetOne("sele ct * fr…...
MySQL 8.0 忘记登录密码 mysqld --init-file重置
看到了很多跳过授权表的办法,这里通过mysqld --init-file办法。 适用情况: 服务器可以启动但无法登录/忘记登录密码。 一、首先停止 MySQL 服务: 按下 Win R 组合键,输入 services.msc 并点击“确定”,打开“服务”…...
Python 学习路线与笔记跳转(持续更新笔记链接)
这里写目录标题 Python 学习路线与笔记Python 简介学习路线第一阶段:Python 基础第二阶段:Python 进阶第三阶段:实用库与框架第四阶段:DevOps 与 Python第五阶段:最佳实践与高级技巧 学习资源官方资源在线学习平台书籍…...

操作系统:计算机世界的基石与演进
一、操作系统的本质与核心功能 操作系统如同计算机系统的"总管家",在硬件与应用之间架起关键桥梁。从不同视角观察,其核心功能呈现多维价值: 硬件视角的双重使命: 硬件管理者:通过内存管理、进程调度和设…...

Codeium 免费的AI编程助手
Codeium 由 Exafunction 团队(主要也是美国华人)开发的一款免费AI编程助手,是一个建立在顶尖AI技术上的代码加速工具,其背后的老板非常厉害,据说投资过马斯克的SpaceX。Codeium 本身具有颇多的亮点,支持70种…...

在MySQL Shell里 重启MySQL 8.4实例
前一段时间看到MySQL官方视频的Oracle工程师在mysql shell里面重启mysql实例,感觉这个操作很方便,所以来试试,下面为该工程师的操作截图 1.MySQL Shell 通过root用户连上mysql,shutdown mysql实例 [rootmysql8_3 bin]# mysqlshMy…...

FANUC机器人GI与GO位置数据传输设置
FANUC机器人GI与GO位置数据传输设置(整数小数分开发) 一、概述 在 Fanuc 机器人应用中,如果 IO 点位足够,可以利用机器人 IO 传输位置数据及偏移位置数据等。 二、操作步骤 1、确认通讯软件安装 首先确认机器人控制柜已经安装…...

LeetCode 24 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3,4] 输出:[2,1…...

低代码平台开发手机USB-HID调试助手
项目介绍 USB-HID调试助手是一种专门用于调试和测试USB-HID设备的软件工具。USB-HID设备是一类通过USB接口与计算机通信的设备,常见的HID设备包括键盘、鼠标、游戏控制器、以及一些专用的工业控制设备等。 主要功能包括: 数据监控:实时监控和…...
Java 深度与实战 · 每日一读 :高频面试真题解析 · ReentrantLock / CAS / AQS 篇
ReentrantLock 深层分析:CAS、AQS原理全揭秘 此文为「Java 深度与实战每日一读」系列第1篇,原创专栏,全篇不含水分,该系列整个面向:初学、进阶、面试、原理、实战,全综合型导向。 目标:让任何级…...
golang goroutine(协程)和 channel(管道) 案例解析
文章目录 goroutine和channel概念开启线程与channel简单通信流程多个工作协程并发执行流程 goroutine和channel概念 goroutine(协程),一般我们常见的是进程,线程,进程可以理解为一个软件在运行执行的过程,线程跟协程比较类似&…...