使用Jenkins进行自动化部署和持续集成-Java 项目实战(超详细)
前言在现代软件开发流程中持续集成 CI、持续交付 CD已经成为企业级项目开发、运维的核心标准。Jenkins 作为开源、可扩展的自动化构建平台能够打通代码拉取、编译打包、镜像制作、项目部署全流程结合 GitLab、Maven、Docker、K8s 等技术可实现 Java 项目一键自动化上线极大提升开发与运维效率。本文基于实战项目jpress完整讲解 Jenkins 从环境搭建、基础配置到传统部署、Blue Ocean 可视化部署、Docker 容器化部署、Docker-Compose 编排、Pipeline 流水线部署的全流程涵盖 CI/CD 核心架构、插件配置、认证集成、脚本编写等实战要点。须知学习本文前需提前部署完成GitLab 代码仓库环境、Docker 私有镜像仓库环境Jenkins 部署过程会依赖这两个环境项目源码下载一、Jenkins 安装与基础环境准备1.1 Jenkins 核心介绍Jenkins 是一款开源、跨平台、可扩展的持续集成 持续交付CI/CDWeb 平台支持软件代码的编译、打包、测试、部署全流程自动化适配几乎所有开发语言与项目类型。官网https://jenkins.io/官方文档https://jenkins.io/doc/1.2 安装硬件 软件要求硬件最低 256MB 内存推荐 512MB 以上硬盘≥1GBJDK 环境Jenkins 2.357 版本强制要求Java11 及以上同时支持 Java17需提前安装对应版本 JDK/JRE配套工具Git代码版本管理、MavenJava 项目编译打包、Docker容器化部署。1.3 Linux 环境安装 JenkinsWar 包方式推荐使用war包部署 Jenkins自带 Jetty 内置服务器适配性最强。下载 Jenkins 最新 war 包本文课程提供专属 war 包可直接使用配置环境变量编辑/etc/profile添加 Jenkins 运行目录与 Java 环境export JENKINS_HOME/data/jenkins/data export JAVA_HOME/data/java17 PATH$JAVA_HOME/bin:$PATH source /etc/profile启动 Jenkins将 war 包上传至/data/jenkins目录后台启动服务初始化访问nohup java -jar jenkins.war 查看初始密码cat nohup.out复制 Jenkins 生成的随机口令************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 829482167dd146b6a4d554d71e9d141d This may also be found at: /data/jenkins/data/secrets/initialAdminPassword ************************************************************* ************************************************************* *************************************************************浏览器访问http://服务器IP:8080粘贴口令进入安装界面选择推荐插件安装自动部署常用插件创建admin管理员账号完成初始化。1.4 安装必备依赖工具1.4.1 安装 Gityum install git -y1.4.2 安装 Maven官网下载https://maven.apache.org/download.cgi本文使用apache-maven-3.8.8解压配置cd /usr/local/ tar zxvf apache-maven-3.8.8-bin.tar.gz mv apache-maven-3.8.8 maven # 配置环境变量编辑/etc/profile export M2_HOME/usr/local/maven export PATH$PATH:$M2_HOME/bin source /etc/profile1.4.3 安装 Docker 环境# 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 配置阿里云Docker镜像源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast # 安装启动Docker yum install docker-ce -y systemctl restart docker systemctl enable docker # 验证安装 docker version二、Jenkins 基础配置插件 认证2.1 安装核心必备插件Jenkins 安装完成后需手动安装以下插件用于实现可视化、远程部署、流水线、容器化等功能Blue OceanJenkins 新一代可视化界面优化流水线操作体验Publish Over SSH / SSH Agent Plugin / SSH plugin远程服务器 SSH 连接、文件传输、脚本执行Pipeline流水线核心插件实现 CI/CD 流程编排Kubernetes plugin对接 K8s 容器编排平台Docker、Docker PipelineDocker 镜像构建、推送、容器管理。2.2 配置认证凭据Jenkins 需配置 GitLab、服务器登录凭据用于拉取代码、远程部署支持SSH 密钥认证、账号密码认证两种方式进入 Jenkins【凭据】-【系统】-【全局凭据】添加 3 类核心凭据GitLab SSH 密钥凭据用于 Jenkins 免密拉取 GitLab 代码服务器账号密码凭据用于 SSH 连接远程应用服务器Jenkins 内置 SSH 密钥用于 Blue Ocean 等插件鉴权。三、GitLab 与 Jenkins 集成自动化部署核心架构3.1 整体架构总览Jenkins 打通GitLab 代码仓库→Jenkins 构建服务→应用服务器 / Docker/K8s全链路实现代码提交自动触发构建、打包、部署核心架构分为 5 类通过gitlabjenkins自动化部署常规网站流程通过gitlabjenkins部署一个java maven项目流程通过gitlabjenkins部署一个docker容器项目流程通过gitlabjenkins 部署k8s项目流程3.2 SpringCloud 与 K8s 区别与选型Spring Cloud开发侧微服务框架提供服务发现、负载均衡、配置管理侧重代码开发Kubernetes运维侧容器编排平台提供自动扩缩容、滚动升级、故障自愈侧重容器运维最佳实践不建议两者混用推荐SpringBoot KubernetesSpringBoot 开发业务K8s 管理容器服务。3.3 自动化部署通用流程开发人员将代码 Push 至 GitLab 代码仓库GitLab 触发 Jenkins 构建任务WebHook 钩子Jenkins 拉取最新代码调用 Maven 编译打包制作 Docker 镜像推送至私有镜像仓库远程服务器拉取镜像启动容器 / 服务完成自动化部署。四、实战Jenkins 部署 Java 项目 jpress4 种方式4.1 方式一传统方式部署 Java Web 项目传统部署直接打包代码通过 SSH 传输至远程服务器执行启动脚本无需容器化。Jenkins 项目配置自定义工作空间/data/jenkins/jpress源码管理选择 Git配置 GitLab 仓库地址git172.16.213.65:ops/jpress.git选择配置好的 GitLab SSH 凭据构建环境调用 Maven 执行打包命令mvn clean install -Dmaven.test.skiptrue远程部署配置SSH 插件配置 SSH 服务器连接信息传输启动脚本start-jpress.sh至远程服务器执行远程部署脚本rm -rf /usr/local/jpress mkdir /usr/local/jpress mv /usr/local/start-jpress.sh /usr/local/jpress chmod 755 /usr/local/jpress/start-jpress.sh远程启动脚本start-jpress.shcd /usr/local/jpress unzip starter-4.0.zip sed -i /Dundertow.devMode/s/^#//g jpress.sh sed -i /java.awt.headless/s/^/#/ jpress.sh sed -i /output.log\ 21/s/#//g jpress.sh sed -i 2i source /etc/profile jpress.sh ./jpress.sh start控制台输出如下jpress页面如下4.2 方式二Blue Ocean 可视化部署 Docker 镜像制作Blue Ocean 是 Jenkins 可视化流水线界面支持一键构建 Docker 镜像推送至私有仓库。步骤 1拉取代码 编译打包先创建流水线需要将密钥放置到GitlabGit 拉取 master 分支代码Shell 脚本执行 Maven 打包/usr/local/maven/bin/mvn clean install -Dmaven.test.skiptrue步骤 2编写 Dockerfile制作镜像# 构建基础镜像 cd docker docker build . -t jpress-base:${base_version} -f ./Dockerfile.base cd .. # 编写业务镜像Dockerfile cat dockerfile_jpress EOF FROM jpress-base:${base_version} LABEL maintainergaojf WORKDIR /opt/jpress COPY ./starter/target/starter-4.0/ /opt/jpress/ COPY ./docker/files/jpress.sh /opt/jpress/jpress1.sh COPY ./docker/files/jboot.properties /opt/jpress/config/jboot.properties RUN chmod x /opt/jpress/jpress1.sh \ rm -rf /opt/jpress/jpress.bat \ rm -rf /opt/jpress/config/undertow.txt \ rm -rf /opt/jpress/config/install.lock EXPOSE 8080 CMD [/opt/jpress/jpress1.sh, start] EOF # 构建业务镜像 docker build -t 172.16.213.65:4567/ops/images/jpress:${jpress_version} -f dockerfile_jpress .步骤 3推送镜像至私有仓库# 跳过重复构建 if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT $GIT_COMMIT ];then echo skip build exit 0 fi# 登录私有仓库并推送镜像 docker login 192.168.38.137:4567 -u root -p xxxxxx docker push 192.168.38.137:4567/ops/images/jpress:${jpress_version}4.3 方式三SSH 插件 Docker-Compose 编排部署使用 Docker-Compose 一键编排jpress 应用 MySQL 数据库实现服务依赖、持久化、重启策略管理通过 SSH 插件远程执行编排脚本。远程执行 Docker-Compose 脚本cd /data1 test -d compose || mkdir compose cd compose cat docker-compose.yml EOF version: 3.1 services: db: image: mysql:5.7 command: --default-authentication-pluginmysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: jpress MYSQL_DATABASE: jpress MYSQL_USER: jpress MYSQL_PASSWORD: jpress volumes: - ./docker_volumes/mysql:/var/lib/mysql jpress: depends_on: - db links: - db image: 172.16.213.65:4567/ops/images/jpress:v1.2 ports: - 8000:8080 ulimits: nofile: soft: 65536 hard: 65536 restart: always environment: TZ: Asia/Shanghai JPRESS_DB_HOST: db JPRESS_DB_PORT: 3306 JPRESS_DB_NAME: jpress JPRESS_DB_USER: jpress JPRESS_DB_PASSWORD: jpress volumes: - ./docker_volumes/webapp/attachment:/opt/jpress/webapp/attachment - ./docker_volumes/webapp/addons:/opt/jpress/webapp/addons - ./docker_volumes/webapp/WEB-INF/addons:/opt/jpress/webapp/WEB-INF/addons - ./docker_volumes/webapp/wp-content:/opt/jpress/webapp/wp-content - ./docker_volumes/webapp/templates/dockers:/opt/jpress/webapp/templates/dockers EOF # 重启服务 docker-compose down docker-compose up -d4.4 方式四Pipeline 流水线实现自动化部署Jenkins Pipeline 通过声明式 / 脚本式语法编排完整 CI/CD 流程支持分阶段可视化是企业级项目首选部署方式。4.4.1 Pipeline 核心概念Node执行流水线的 Jenkins 节点Stage流程阶段分为代码拉取、构建打包、远程传输、启动服务Step最小执行单元支持 Shell、Git、SSH 等操作语法分为声明式标准化、脚本式灵活自定义推荐声明式。4.4.2 jpress 项目 Pipeline 完整脚本pipeline { agent any stages { stage(git clone code) { steps { ws(dir: /data/jenkins/work2) { git(url: git172.16.213.65:ops/jpress.git, branch: master) sh /usr/local/maven/bin/mvn clean install -D maven.test.skiptrue } } } stage(Copy to Remote Host) { steps { ws(dir: /data/jenkins/work2) { script { def remoteHost 172.16.213.226 def remoteUser root def shellScript #!/bin/bash ssh ${remoteUser}${remoteHost} rm -rf /usr/local/jpsweb mkdir -p /usr/local/jpsweb scp starter/target/starter-4.0.zip ${remoteUser}${remoteHost}:/usr/local/jpsweb scp start-jpress1.sh ${remoteUser}${remoteHost}:/usr/local/jpsweb ssh ${remoteUser}${remoteHost} cd /usr/local/jpsweb unzip starter-4.0.zip writeFile file: remote_script.sh, text: shellScript } } } } stage(Execute Remote Script) { steps { ws(dir: /data/jenkins/work2) { sh chmod x remote_script.sh sh ./remote_script.sh } } } stage(Start Service) { steps { script { def remoteHost 172.16.213.226 def remoteUser root sh ssh ${remoteUser}${remoteHost} chmod 755 /usr/local/jpsweb/start-jpress1.sh sh ssh ${remoteUser}${remoteHost} /usr/local/jpsweb/start-jpress1.sh } } } } }4.4.3 脚本使用方法Jenkins 新建任务选择【流水线】流水线定义选择【Pipeline script】粘贴上述脚本配置凭据与服务器信息保存后直接构建。五、总结本文完整实现了Jenkins 从环境搭建、基础配置到传统部署、容器化部署、流水线部署的全流程实战覆盖了 Java 项目 CI/CD 的主流方案传统部署快速上线适合简单单体项目Docker 镜像部署标准化环境适配多服务器Docker-Compose 编排管理多服务依赖简化运维Pipeline 流水线企业级标准方案流程可视化、可复用、易维护。Jenkins 结合 GitLab、Maven、Docker、K8s可完全打通开发到运维的自动化链路减少人工操作降低上线风险提升迭代效率是后端开发、运维工程师必备核心技能。

相关新闻

AI Agent的工具调用机制架构设计:从单工具调用到多工具智能编排的完整方案

AI Agent的工具调用机制架构设计:从单工具调用到多工具智能编排的完整方案

AI Agent的工具调用机制架构设计:从单工具调用到多工具智能编排的完整方案 一、Tool Calling的架构困境——当Agent不再是单一LLM推理 LLM驱动的AI Agent与传统聊天机器人的核心差异在于能力——Agent不输出文本就结束交互,而是像人类一样使用工具、调用…

2026/10/5 10:50:22 阅读更多 →
DXPopover高级特性探索:动画效果、手势控制与性能优化

DXPopover高级特性探索:动画效果、手势控制与性能优化

DXPopover高级特性探索:动画效果、手势控制与性能优化 【免费下载链接】DXPopover A Popover mimic Facebook app popover using UIKit 项目地址: https://gitcode.com/gh_mirrors/dx/DXPopover DXPopover是一款基于UIKit开发的高质量弹窗组件,完…

2026/10/6 11:49:28 阅读更多 →
操作系统中作业的本质

操作系统中作业的本质

作业本质 作业 = 用户交给系统的****完整程序+数据+作业说明书 就是一整套完整任务 作业本质还是由进程完成的 提交状态 用户刚提交,系统还没接收 后备状态 系统接收,放外存队列,等待调度 运行状态 调入内存,创建进程开始执行 完成状态 执行结束,等待善后退出 流转顺序 提…

2026/9/29 22:44:15 阅读更多 →

最新新闻

机器学习入门第一性原理:线性模型核心推导与工程实践

机器学习入门第一性原理:线性模型核心推导与工程实践

1. 为什么线性模型是机器学习入门的“第一性原理”很多人学机器学习,一上来就被各种深度网络、注意力机制、Transformer 架构唬住了,觉得线性模型太简单、太基础,不值得花时间。但我带了这么多届学生、看了这么多份简历和项目,一个…

2026/10/13 11:02:04 阅读更多 →
HarmonyOS实战:用PixelMap实现图片颜色翻转与负片效果

HarmonyOS实战:用PixelMap实现图片颜色翻转与负片效果

如果你在搜索HarmonyOS开发里关于 PixelMap 的资料,看到最多的解释多半是“PixelMap是一张位图对象”。这句话没错,但基本等于没说。真正上手做图像处理时你会发现, PixelMap 既不是 Image 组件里那个能直接显示的图片,也不…

2026/10/13 11:02:04 阅读更多 →
免费绘画软件FireAlpaca完全指南:轻量替代PS/SAI的插画与动画实践

免费绘画软件FireAlpaca完全指南:轻量替代PS/SAI的插画与动画实践

1. 我为什么从 PS 和 SAI 换到 FireAlpaca 先交代背景。我一直是个靠画图吃饭的人,平时主要用 Photoshop 做商业插画和排版,但说实话,PS 对我的工作负担太重了:启动慢、吃内存、订阅费一年比一年贵。前几年还流行用 SAI&#xff0…

2026/10/13 11:02:04 阅读更多 →
级联故障风险评估:随机化学算法如何高效搜索最坏停电场景

级联故障风险评估:随机化学算法如何高效搜索最坏停电场景

做电力系统风险评估的同行,应该都遇到过这个尴尬:蒙特卡洛抽样跑了几万次,期望损失算出来漂漂亮亮,可一旦想回答“哪几组初始故障组合能把系统搞瘫”,统计结果往往是“查无此案”。原因很简单,大面积停电属…

2026/10/13 11:02:04 阅读更多 →
全链路 Trace 标签化染色与慢执行步骤智能归因

全链路 Trace 标签化染色与慢执行步骤智能归因

在传统的微服务架构中,一次 HTTP 请求通常沿着“网关 -> 业务中台 -> 缓存/数据库”的确定性静态调用拓扑展开,分布式追踪系统(如 Jaeger、Zipkin、SkyWalking)能够非常清晰地展现各服务的 RPC 耗时与依赖拓扑。 然而&#…

2026/10/13 11:02:04 阅读更多 →
C++数组指针字符串:从内存视角彻底搞懂核心难点

C++数组指针字符串:从内存视角彻底搞懂核心难点

我知道很多人第一次翻开郑莉这本《C语言程序设计》,到第六章"数组、指针和字符串"就开始心里打鼓。说实话,我当年也是这样:前面的流程控制、函数调用,照着抄总能写出来,可数组和指针一上来,什么&…

2026/10/13 11:01:04 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →