news 2026/4/23 13:03:26

<span class=“js_title_inner“>全网最全的 Jenkins + Maven + Git 自动化部署指南!</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>全网最全的 Jenkins + Maven + Git 自动化部署指南!</span>

👉这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:

  • 《项目实战(视频)》:从书中学,往事中“练”

  • 《互联网高频面试题》:面朝简历学习,春暖花开

  • 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题

  • 《精进 Java 学习指南》:系统学习,互联网主流技术栈

  • 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRMAI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本

来源:blog.csdn.net/matrixlzp

  • 一、先决条件

  • 二、环境准备

  • 三、Jenkins CICD

  • 四、总结


我们今天用 Jenkins + Maven + Git 来实现一套简单的自动化部署

  • 首先,程序员将本地代码,git push到远程 GitLab 服务器。

  • 然后,Jenkinsgit pull到 Jenkins 服务器,并用 maven 帮我们打成 jar 包。

  • 最后,Jenkins 将打好的 jar 包通过 SSH Publisher 发布到测试服务器。

一、先决条件

这里需要用到 三台服务器,一台安装 GitLab,一台安装 Jenkins,还有一台测试服务器。

服务器信息如下:

服务器名IP配置安装的软件
gitlab99192.168.40.998C8Ggitlab
jenkins98192.168.40.984C4Gjenkins\jdk\maven\git
test97192.168.40.972C2Gjdk

GitLab 安装可以 戳这里👉

https://blog.csdn.net/matrixlzp/article/details/130773520

Jenkins 安装可以 戳这里👉

https://blog.csdn.net/matrixlzp/article/details/153967848

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、环境准备

1、GitLab 创建空白项目
1)创建分组
  • Your work / Groups / New group

  • Create group

  • 填入组名,点击Create group

2)新建项目
  • 点击New project

  • 创建空白项目

  • 输入项目名,Create project

3)新建 token

点击页面左上角的 头像(或用户名),在下拉菜单中选择 Preferences(偏好设置)或 Settings(设置)。在左侧导航栏中,找到并点击Access Tokens(访问令牌)选项(通常在User Settings分类下)。

拷贝 tokenglpat-qx7VU3J219j1D4_92uqJ

2、IDEA 创建新项目
1)新建项目
  • 选择Spring Web

2)修改配置端口
server.port=8088
3)新建 Controller
@RestController @RequestMapping("/") public class HelloController { @RequestMapping public String sayHello() { return "Hello dev"; } }
4)测试

浏览器访问127.0.0.1:8088

5)给 IDEA 设置GIT

打开 IDEASettings> Git 在Path to Git executable里面选择本机安装的Git目录

6)创建 Git 仓库

Version Control>Create Git repository选择当前项目,意思是把当前项目作为 Git 仓库

点击 OK 后为我们弹开下面的视图,证明成功

7) 关联 Git 远程仓库

对着项目 右键 > Git >Manage Remotes

点击+,弹出Define Remote,在 URL 里面把我们从 gitlab 项目克隆的 http 链接填进去

填入gitlab token

8)把代码提交到本地仓库
9)把代码推送到远程仓库
10)在 GitLab 上合并代码

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、Jenkins CICD

1、安装 Maven 插件

我们想让 Jenkins 能使用 Maven 进行构建,需要安装 Maven 插件。

Dashboard>Manage Jenkins> 插件管理 >Available plugins,搜索 maven,点击 安装

等待安装完成,点击返回首页

2、创建项目

Dashboard > All > 新建 Item

3、配置 Git

Dashboard > first > Configuration

添加 git 凭据

4、配置分支
5、配置 Maven

http://192.168.40.98:8080/configureTools/下配置 maven 安装路径后保存

Root POM 保持不变

Root POM 表示,相对于项目文件夹jenkins-study,pom.xml 的位置,我们的 pom.xml 刚好位于jenkins-study路径下,所以不变。

6、测试 jenkins 打包

保存上述配置,点击 运行

在 Dashboard > first >#1> 控制台输出 的日志中,能看到 Jenkins 将 代码 打包的目录:

进入/root/.jenkins/workspace/first/target/测试打出来的包是否运行成功:

[root@jenkins98 target]# java -jar jenkins-study-0.0.1-SNAPSHOT.jar

看到如下内容,说明 Jenkins 打包成功。接下来,我们要利用 Jenkins 将这个 jar 传到 测试服务器,并运行起来。

报错:

如果运行java -jar报错no main manifest attribute, in jenkins-study-0.0.1-SNAPSHOT.jar

说明spring-boot-maven-plugin打包得有问题,把项目 pom.xmlskip改为false即可。

7、安装 SSH Publisher 插件

要利用 Jenkins 将这个 jar 传到 测试服务器,需要使用插件SSH Publisher

Dashboard >Manage Jenkins> 插件管理 >Available plugins

安装完,返回首页

8、配置测试服务器信息

Dashboard > Manage Jenkins > System,新增测试服务器

填上测试服务器信息并保存

Test Configuration 测试连接

9、配置 Post Steps
Dashboard` > `first` > `Configuration` > `Post Steps` > `Send files or execute commands over SSH

配置Post Steps

Source files表示从 workspace 开始找编译后的包,Jenkins 将我们的代码编译到

/root/.jenkins/workspace/first/target
  • **:表示任意路径

  • jenkin*.jar:表示通配符匹配

  • Remote directory:包存放的远程服务器目录,默认是~,即当前使用的 SSH 账户的 家目录。root 用户是/root,普通用户是/home/当前用户名

10、测试 jenkins 传包

立即构建

在 test97 这台服务器/root下看到多添加了/target目录:

配置Remove prefix,去掉/target

重新运行构建:

可见,Jenkins 多次构建并不会帮我清除旧的构建,需要我们编写 Exec command 来做这些工作。

通常,我们会将包放置在项目文件夹里,方便不同的项目管理。

配置Remote director

保存后重新运行构建:

11、运行 jar 包

配置Exec command

nohup java -jar /root/jenkins-study/jenkins*.jar >> /root/jenkins-study/log.out 2>&1 &
  • nohup(忽略挂起信号):进程与终端解耦,即使终端关闭,进程仍能继续运行。

  • >>:将nohup java -jar的日志输出,从标准输出(控制台)重定向到/root/jenkins-study/log.out文件。并且是以追加的方式。

  • 2>&1:将标准错误输出(2)重定向到标准输出(1),而标准输出在前面已经被重定向到/root/jenkins-study/log.out文件,所以标准错误输出也被重定向到/root/jenkins-study/log.out文件。

  • 最后一个&:后台运行程序,此时终端会立即返回控制权(可以继续输入其他命令)。

保存并重新构建,在测试服务器执行 jps 命令,能看到jenkins-study项目已运行。

报错:

如果 jps 只有一个 Jps 进程在跑:

[root@test97 ~]# jps 20876 Jps

查看/root/jenkins-study/log.out日志,如果看到

nohup: failed to run command ‘java’: No such file or directory

用如下方法发解决:

vim /etc/bashrc # 在最后一行添加 export JAVA_HOME=/usr/local/jdk/jdk-17.0.12 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/

这是因为/bin/bash启动的终端也需要配置JAVA_HOME

我们现在这样的配置还是有问题:

多次构建,看看测试服务器 jps

[root@test97 ~]# jps 20807 jenkins-study-0.0.1-SNAPSHOT.jar 20895 Jps [root@test97 ~]# jps 20807 jenkins-study-0.0.1-SNAPSHOT.jar 20968 Jps [root@test97 ~]# jps 20807 jenkins-study-0.0.1-SNAPSHOT.jar 20987 Jps

会发现jenkins-study的 pid 并没有变化,查看/root/jenkins-study/log.out,端口被占用。

因为 8088 端口已经被第一次运行的 java 程序占用了,所以后续 nohup 都启动不成功,所以 pid 一直是第一次运行的 java 程序。解决这个问题的方法,就是进行构建前清理,清理 java 进程,和旧的 jar 包。

12、配置 Pre Steps

在测试服务器/root下创建一个clean.sh清理脚本,脚本内容如下:

#!/bin/bash appname=$1 # 如果appname为空,提示返回; if [ -z $appname ]; then echo"应用名称不能为空!" exit -1 else echo"应用名称为$1" fi # 清理旧版本jar包 rm -rf $appname/"${appname}"*.jar # 获取正在运行的项目pid pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'` echo"pid为$pid" # 如果pid为空,提示一下;否则,执行kill命令 if [ -z $pid ]; then echo"$appname is not started" else kill -9 $pid echo"$appname was stopped" fi
  • $1:表示Shell脚本的第一个参数,就比如./clean.sh test$1就等于 test;以此类推,$2表示第二个,$3 表示第三个......

  • -z:字符串运算符,检测字符串长度是否为0,为0返回true。z zero 的意思。

  • ps -ef:打印进程信息。

直接ps -ef | grep appname会把 grep 进程也打印出来

[root@test97 ~]# ps -ef|grep jenkins-study root 20807 1 1 19:40 ? 00:00:33 java -jar /root/jenkins-study/jenkins-study-0.0.1-SNAPSHOT.jar root 21223 21093 0 20:31 pts/0 00:00:00 grep --color=auto jenkins-study

所以需要grep 'java -jar'再过滤一次

[root@test97 ~]# ps -ef|grep jenkins-study|grep 'java -jar' root 20807 1 1 19:40 ? 00:00:33 java -jar /root/jenkins-study/jenkins-study-0.0.1-SNAPSHOT.jar

grep -v grep,排除掉 grep 也可以

[root@test97 ~]# ps -ef|grep jenkins-study|grep -v grep root 20807 1 1 19:40 ? 00:00:33 java -jar /root/jenkins-study/jenkins-study-0.0.1-SNAPSHOT.jar

awk '{printf $2}':对字符串进行匹配,打印出第二个参数,也即 20807,也就是我们的 pid。

更改一下clean.sh脚本的模式,使其具有可执行权限

[root@test97 ~]# chmod 777 clean.sh

配置Pre Steps

加上我们的脚本

保存并重新构建

# 重新构建前 [root@test97 ~]# jps 20807 jenkins-study-0.0.1-SNAPSHOT.jar 21445 Jps # 重新构建后 [root@test97 jenkins-study]# jps 21562 jenkins-study-0.0.1-SNAPSHOT.jar 21610 Jps

可以看到 pid 已经不同了。

13、测试

浏览器访问192.168.40.97:8088

四、总结

至此,我们完成了一个简单的 Jenkins CICD,大家思考一下还有什么需要改进的地方?


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。 谢谢支持哟 (*^__^*)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:53:29

已经上了数据中台,还要做数据治理吗?

在数字化转型浪潮中,不少企业已陆续投入资源搭建数据中台、开发领导驾驶舱、部署生产与质量管控等系统。由此也引出了一系列现实疑问:既然已经建设了数据中台,是否还有必要专门开展数据治理?如果项目中已包含数据管理模块&#xf…

作者头像 李华
网站建设 2026/4/23 12:53:52

药企客商域主数据管理实践与挑战

在医药企业中,客商域主数据的管理不仅是信息系统的基础,更是合规经营和质量管理的核心。本文基于对某医药集团(以下简称:B药企)的业务实践分析,系统梳理了药企在客商分类、资质管理、数据编码、流程控制等方…

作者头像 李华
网站建设 2026/4/18 3:30:22

MATLAB中编写不平衡磁拉力方程

MATLAB中编写不平衡磁拉力方程通常涉及电机/发电机转子偏心时的电磁力计算。 1. 基本物理方程 不平衡磁拉力的径向分量可表示为: % UMP基本方程 function [Fx, Fy] calculateUMP(eccentricity, theta, params)% 输入参数:% eccentricity: 偏心距 [m]…

作者头像 李华
网站建设 2026/4/23 12:29:37

向沙漠蚂蚁学习导航:我用ZYNQ造了个仿生偏振光指南针

当你在沙漠中迷失方向时,蚂蚁却总能找到回家的路。这背后的秘密,现在被我用一块ZYNQ开发板“窃取”了。 当我在实验室里盯着眼前的ZYNQ开发板时,窗外一只蚂蚁正沿着窗台直线前进。这只看似普通的昆虫,其实携带了自然界最精巧的导航系统之一——偏振光感知能力。 沙漠蚂蚁能…

作者头像 李华
网站建设 2026/4/22 22:15:01

基于MATLAB/Simulink的自适应巡航控制(ACC)实现示例

基于MATLAB/Simulink的自适应巡航控制(ACC)实现示例,结合模型预测控制(MPC)和传感器融合技术,支持与CarSim联合仿真。一、系统架构设计核心模块 车辆动力学模型:基于简化的纵向运动方程&#xf…

作者头像 李华
网站建设 2026/4/17 19:28:35

Java序列化:面试必看的深层解析!

文章目录Java序列化:面试必看的深层解析!一、什么是 Java 序列化?二、为什么需要 Java 序列化?三、Java 序列化的核心机制1. Serializable 接口2. transient 关键字四、深入分析 Serializable 接口1. serialVersionUID 的作用2. 如…

作者头像 李华