运维|devops|Jenkins Pipeline流程构建
运维|devops|Jenkins Pipeline流程构建 目录1. 运维|devops|Jenkins Pipeline流程构建1.1 Jenkins Pipeline1.1.1 Pipeline script vs Pipeline script from SCM(实操)1.1.2 Jenkinsfile 脚本内容的语法格式如下两种1.2 前置条件1.2.1 服务器端开启ssh登录1.2.2 Jenkinsfile文件和脚本创建1.3 创建Pipeline任务1.3.1 构建相关pipeline1.4 执行构建结果1.5 优化脚本1.5.1 优化脚本之后基于 jenkins Version 2.541.3 实操案例Jenkins Pipeline基于 Groovy 的持续交付流水线代码Pipeline as CodePipeline script vs Pipeline script from SCM(实操)Pipeline script流水线代码直接粘贴在 Jenkins 任务页面文本框内存储在 Jenkins 任务配置数据库中不关联 Git 仓库Pipeline script from SCM流水线代码Jenkinsfile存放在代码仓库 (Git/SVN)Jenkins 运行流水线时先拉取代码读取仓库内的 Jenkinsfile 执行Jenkinsfile 脚本内容的语法格式如下两种Declarative Pipeline声明式-实操语法严格、易读适合绝大多数项目bashpipeline { agent any stages { stage(构建) { steps { echo hello } } } }Scripted Pipeline脚本式原生 Groovy自由度高适合复杂逻辑bashnode { stage(构建) { echo hello } }前置条件git、ssh、jdk、maven 等配置服务器端开启ssh登录生成密钥bashssh-keygen -t rsa -b 4096将公钥添加到本机的 authorized_keysbashcat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys配置 SSH 服务/etc/ssh/sshd_config)bashPubkeyAuthentication yes PasswordAuthentication yes重启 SSH 服务bashsudo systemctl reload sshd将私钥拷贝到Jenkins全局令牌凭证中Jenkinsfile文件和脚本创建Jenkinsfile位置放入项目pom同级别位置参照baseCore仓库根目录父pom ├─ pom.xml 聚合父工程 ├─ common-core 公共依赖模块无需Jenkinsfile │ └─ pom.xml ├─ Core.Api 业务子模块 │ ├─ pom.xml │ └─ Jenkinsfile ✅ 当前模块流水线文件Groovy构建脚本(Jenkinsfile)bashpipeline { agent any options { disableConcurrentBuilds() timeout(time: 20, unit: MINUTES) timestamps() buildDiscarder(logRotator(numToKeepStr: 10)) } parameters { booleanParam( name: AUTO_DEPLOY, defaultValue: false, description: 构建完成自动推送Jar并重启远程服务 ) } environment { SERVICE_DIR app SERVICE_NAME app JAR_VERSION 1.0.0-SNAPSHOT JAR_FILE ${SERVICE_NAME}-${JAR_VERSION}.jar REMOTE_SUB_DIR ${SERVICE_NAME} REMOTE_FULL_DIR /usr/local/${REMOTE_SUB_DIR} LOCAL_JAR_PATH ${SERVICE_DIR}/target/${JAR_FILE} JAVA_HOME /usr/local/jdk21 M2_HOME /usr/local/maven // SSH 配置 REMOTE_HOST 192.168.0.66 REMOTE_USER test SSH_CREDENTIALS_ID test } stages { stage(1. 环境信息打印) { steps { echo 【构建信息】服务名${env.SERVICE_NAME}Jar包${env.JAR_FILE} echo 本地路径${env.LOCAL_JAR_PATH} echo 远端目录${env.REMOTE_FULL_DIR} } } stage(2. Maven编译打包) { steps { sh test -d ${JAVA_HOME} || { echo ❌ JAVA_HOME目录不存在; exit 1; } test -d ${M2_HOME} || { echo ❌ M2_HOME目录不存在; exit 1; } ${JAVA_HOME}/bin/java -version ${M2_HOME}/bin/mvn -v cd ${SERVICE_DIR} ${M2_HOME}/bin/mvn clean package -DskipTests } } stage(3. 归档构建产物) { steps { archiveArtifacts artifacts: ${env.LOCAL_JAR_PATH}, fingerprint: true, onlyIfSuccessful: true } } stage(4. 远程发布部署) { when { expression { params.AUTO_DEPLOY } } steps { echo 开始推送Jar包并远程重启服务 withCredentials([sshUserPrivateKey( credentialsId: ${env.SSH_CREDENTIALS_ID}, keyFileVariable: SSH_KEY, usernameVariable: SSH_USER )]) { sh set -e -x # 传输 JAR scp -i \$SSH_KEY -o StrictHostKeyCheckingno ${LOCAL_JAR_PATH} ${REMOTE_USER}${REMOTE_HOST}:${REMOTE_FULL_DIR}/${JAR_FILE} # 远程执行部署【修复pgrep匹配BUG】 ssh -i \$SSH_KEY -o StrictHostKeyCheckingno ${REMOTE_USER}${REMOTE_HOST} EOF export JAVA_HOME/usr/local/jdk-21.0.11 SERVICE_NAME${SERVICE_NAME} REMOTE_FULL_DIR${REMOTE_FULL_DIR} JAR_FILE${JAR_FILE} mkdir -p \${REMOTE_FULL_DIR} cd \${REMOTE_FULL_DIR} # 根据服务名杀死进程不再写死jar名称 pkill -f \${SERVICE_NAME} || true sleep 1 # 后台启动服务 nohup \${JAVA_HOME}/bin/java -jar \${JAR_FILE} app.log 21 sleep 3 # 校验进程匹配服务名称不再匹配jar短文件名 if pgrep -f \${SERVICE_NAME} /dev/null; then echo ✅ 服务启动成功 else echo ❌ 服务启动失败打印最近日志 [ -f app.log ] tail -15 app.log || echo app.log 文件尚未生成 exit 1 fi EOF } echo 远程部署流程执行完毕 } } } post { always { echo 【Post钩子】流水线构建结束 } success { cleanWs() echo 流水线全部执行成功 } failure { echo 流水线执行失败请查看日志排查问题 } } }创建Pipeline任务构建相关pipeline脚本指向路径执行构建结果优化脚本增加git 打印、和后台应用日志bashpipeline { agent any options { disableConcurrentBuilds() timeout(time: 20, unit: MINUTES) timestamps() buildDiscarder(logRotator(numToKeepStr: 10)) } parameters { booleanParam( name: AUTO_DEPLOY, defaultValue: false, description: 构建完成自动推送Jar并重启远程服务 ) } environment { SERVICE_DIR app SERVICE_NAME app JAR_VERSION 1.0.0-SNAPSHOT JAR_FILE ${SERVICE_NAME}-${JAR_VERSION}.jar REMOTE_SUB_DIR ${SERVICE_NAME} REMOTE_FULL_DIR /usr/local/${REMOTE_SUB_DIR} LOCAL_JAR_PATH ${SERVICE_DIR}/target/${JAR_FILE} JAVA_HOME /usr/local/jdk21 M2_HOME /usr/local/maven REMOTE_HOST 192.168.0.66 REMOTE_USER test SSH_CREDENTIALS_ID test } stages { stage(1. 环境信息 Git提交日志打印) { steps { sh #!/bin/bash echo Git 最新提交信息 echo 短提交号: $(git rev-parse --short HEAD) echo 完整commit: $(git rev-parse HEAD) echo 提交人姓名: $(git log -1 --pretty%an) echo 提交备注: git log -1 --pretty%B echo echo 【构建信息】服务名${env.SERVICE_NAME}Jar包${env.JAR_FILE} echo 本地路径${env.LOCAL_JAR_PATH} echo 远端目录${env.REMOTE_FULL_DIR} } } stage(2. Maven编译打包) { steps { sh #!/bin/bash test -d ${JAVA_HOME} || { echo ❌ JAVA_HOME目录不存在; exit 1; } test -d ${M2_HOME} || { echo ❌ M2_HOME目录不存在; exit 1; } ${JAVA_HOME}/bin/java -version ${M2_HOME}/bin/mvn -v cd ${SERVICE_DIR} ${M2_HOME}/bin/mvn clean package -DskipTests } } stage(3. 归档构建产物) { steps { archiveArtifacts artifacts: ${env.LOCAL_JAR_PATH}, fingerprint: true, onlyIfSuccessful: true } } stage(4. 远程发布部署) { when { expression { params.AUTO_DEPLOY } } steps { echo 开始推送Jar包并远程重启服务 withCredentials([sshUserPrivateKey( credentialsId: ${env.SSH_CREDENTIALS_ID}, keyFileVariable: SSH_KEY, usernameVariable: SSH_USER )]) { // 使用三双引号 允许Groovy解析Jenkins环境变量 sh #!/bin/bash set -e -x scp -i \$SSH_KEY -o StrictHostKeyCheckingno ${LOCAL_JAR_PATH} ${REMOTE_USER}${REMOTE_HOST}:${REMOTE_FULL_DIR}/${JAR_FILE} ssh -i \$SSH_KEY -o StrictHostKeyCheckingno ${REMOTE_USER}${REMOTE_HOST} EOF SERVICE_NAME${SERVICE_NAME} REMOTE_FULL_DIR${REMOTE_FULL_DIR} JAR_FILE${JAR_FILE} mkdir -p \${REMOTE_FULL_DIR} cd \${REMOTE_FULL_DIR} echo 【1】优雅停止旧服务进程 pgrep -f java.*\${SERVICE_NAME} | xargs kill -15 2/dev/null || true sleep 2 pgrep -f java.*\${SERVICE_NAME} | xargs kill -9 2/dev/null || true sleep 1 echo 【2】启动新服务 追加日志不再清空日志文件 # 远端服务器JAVA路径【硬编码】彻底避开变量冲突大坑 nohup /usr/local/jdk-21.0.11/bin/java -Dfile.encodingUTF-8 -jar \${JAR_FILE} app.log 21 sleep 3 echo 远端应用启动日志尾部30行 [ -f app.log ] tail -30 app.log || echo app.log 文件尚未生成 echo echo 【3】校验进程状态 if pgrep -f java.*\${SERVICE_NAME} /dev/null; then echo ✅ 服务进程启动成功 else echo ❌ 服务启动失败 exit 1 fi EOF } echo 远程部署流程执行完毕 } } } post { always { echo 【Post钩子】流水线构建结束 } success { cleanWs() echo 流水线全部执行成功 } failure { echo 流水线执行失败请查看日志排查问题 } } }优化脚本之后

相关新闻

使用OpenSSL制作SAN证书:多域名HTTPS安全配置详解

使用OpenSSL制作SAN证书:多域名HTTPS安全配置详解

1. 项目概述:从单域名到多域名的安全升级在构建现代Web服务时,HTTPS早已是标配。但你是否遇到过这样的场景:一个应用需要同时通过www.example.com和example.com提供服务,或者一个API服务需要同时支持api.service.com和service.int…

2026/7/30 3:39:30阅读更多 →
AI如何重塑本科论文写作:智能文献检索与格式校对实践

AI如何重塑本科论文写作:智能文献检索与格式校对实践

1. 项目概述:AI如何重塑本科论文写作体验第一次写本科论文的新手常会遇到这样的困境:面对空白的文档不知从何下笔,文献综述像大海捞针,格式调整耗费数小时却依然不符合要求。三年前我指导表弟修改毕业论文时,亲眼见证了…

2026/7/30 3:39:30阅读更多 →
2026论文分阶段工具排行榜|开题/写作/降重/查重/答辩全覆盖✅

2026论文分阶段工具排行榜|开题/写作/降重/查重/答辩全覆盖✅

很多人选论文工具翻车,根本原因只有一个:用一个工具搞定全流程,选错阶段直接报废。 有的工具查重强但降重必翻车,有的写作快但AI痕迹爆表,有的润色好但收费巨贵。 写论文五大核心阶段:开题→初稿写作→内…

2026/7/30 3:39:30阅读更多 →
C#高性能实时曲线控件开发:从GDI+到WPF的架构设计与性能优化

C#高性能实时曲线控件开发:从GDI+到WPF的架构设计与性能优化

1. 项目缘起:为什么我们需要一个自己的曲线控件?在工业监控、数据分析和上位机软件开发中,实时绘制动态变化的曲线是一个极其普遍且核心的需求。无论是监控设备温度、压力,还是分析股票行情、传感器数据流,一个响应迅速…

2026/7/30 4:45:43阅读更多 →
C# WinForms单页面应用开发:基于UserControl的动态视图切换方案详解

C# WinForms单页面应用开发:基于UserControl的动态视图切换方案详解

1. 项目概述:为什么我们需要单页面窗口切换在桌面应用开发中,尤其是使用 C# WinForms 进行快速原型开发或构建内部工具时,我们经常会遇到一个经典问题:如何在一个主窗体(Form)内,优雅、流畅地切…

2026/7/30 4:45:43阅读更多 →
三菱PLC与组态王仿真:基于MX OPC Server的零成本调试环境搭建

三菱PLC与组态王仿真:基于MX OPC Server的零成本调试环境搭建

1. 项目背景与核心价值:为什么需要OPC Server进行仿真连接? 在工业自动化项目的前期开发、调试和教学培训中,直接连接物理PLC设备往往面临诸多不便:设备成本高、接线复杂、存在安全风险,并且难以模拟各种异常工况。这时…

2026/7/30 4:45:43阅读更多 →
C/C++内存管理:从堆栈原理到智能指针实战

C/C++内存管理:从堆栈原理到智能指针实战

1. 从“堆栈”到“自由”:理解C/C内存管理的核心战场干了这么多年C,我越来越觉得,内存管理这门手艺,是区分“会写代码”和“能写好代码”的一道分水岭。新手可能觉得指针、地址这些概念很抽象,老手也可能在复杂的项目里…

2026/7/30 4:45:43阅读更多 →
51单片机定时器中断编程:告别delay函数实现多任务并发处理

51单片机定时器中断编程:告别delay函数实现多任务并发处理

如果你还在用delay()函数来实现51单片机的延时功能,那么你可能正在错过单片机开发中最核心的能力提升机会。很多初学者在接触51单片机时,第一个学会的就是delay()函数,但它恰恰是阻碍你真正理解单片机工作原理的最大障碍。delay()函数的问题不…

2026/7/30 4:45:42阅读更多 →
Redis 进阶:Bitmaps、HyperLogLog 与 GEO,三种特殊数据类型的深度解析

Redis 进阶:Bitmaps、HyperLogLog 与 GEO,三种特殊数据类型的深度解析

📕一、引言在日常后端开发工作中,大家对 Redis 五大基础数据类型 String、List、Hash、Set、ZSet 早已耳熟能详,绝大多数数据存储、缓存、排序、去重场景都能通过它们实现。但在海量数据、高并发、精细化资源管控的业务场景下,基础…

2026/7/30 4:43:42阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →