提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
Jenkins+Gitlab+maven项目实战
- 前言
- 一、环境介绍
- 二、部署gitlab
- 三、部署Jenkins环境
-
- [3.1 Jenkins上需要部署哪些软件?](#3.1 Jenkins上需要部署哪些软件?)
- [3.2 安装maven](#3.2 安装maven)
- [3.3 安装插件](#3.3 安装插件)
- [3.4 jenkins配置JDK和Maven](#3.4 jenkins配置JDK和Maven)
- [3.5 配置后端服务器](#3.5 配置后端服务器)
- [3.6 配置Jenkins密钥](#3.6 配置Jenkins密钥)
-
- [3.6.1 生成密钥](#3.6.1 生成密钥)
- [3.6.2 给gitlab配置公钥](#3.6.2 给gitlab配置公钥)
- [3.6.3 给后端服务器设置免密](#3.6.3 给后端服务器设置免密)
- [3.6.4 配置私钥到Jenkins服务器上](#3.6.4 配置私钥到Jenkins服务器上)
- 四、构建项目
-
- [4.1 准备开源项目](#4.1 准备开源项目)
- [4.2 gitlab上新建项目test-project](#4.2 gitlab上新建项目test-project)
- [4.3 推送测试项目到gitlab](#4.3 推送测试项目到gitlab)
- [4.4 jenkins项目配置](#4.4 jenkins项目配置)
-
- [4.4.1 jenkins新建项目](#4.4.1 jenkins新建项目)
- [4.4.2 设置保留策略](#4.4.2 设置保留策略)
- [4.4.3 添加身份验证](#4.4.3 添加身份验证)
- [4.4.4 设置自动编译打包](#4.4.4 设置自动编译打包)
- [4.4.5 配置后端服务器](#4.4.5 配置后端服务器)
- [4.5 构建项目](#4.5 构建项目)
- [4.6 二次构建](#4.6 二次构建)
前言
如果对Jenkins部署不了解的可以参考这篇文章https://blog.csdn.net/m0_63756214/article/details/155387987?spm=1001.2014.3001.5502
如果对gitlab部署不了解的可以参考这篇文章
https://blog.csdn.net/m0_63756214/article/details/155339506?spm=1001.2014.3001.5501
一、环境介绍
| 角色定位 | 主机名 | ip | 部署软件及版本 | 运行内存 | 作用 |
|---|---|---|---|---|---|
| 代码仓库服务器 | gitlab | 192.168.136.10 | gitlab 最新版 | 最少3G | 充当远程代码仓库,存储项目源码,管理代码提交、分支及合并流程 |
| 开发机 | developer | 192.168.136.20 | git 最新版 | 最少1G | 模拟开发人员,通过Git工具与GitLab仓库交互,完成代码拉取、开发及推送 |
| CI/CD调度服务器 | jenkins | 192.168.136.30 | jdk11,tomcat10.1.49,maven3.9.11,jenkins2.504,git 最新版 | 最少3G | 实现自动代码拉取、构建、测试及部署,完成CI/CD全流程自动化 |
| 后端应用服务器-1 | tomcat-1 | 192.168.136.134 | jdk11,tomcat9.0.112 | 最少1G | 模拟生产/测试环境后端节点,接收Jenkins部署的应用程序,提供服务访问 |
| 后端应用服务器-2 | tomcat-2 | 192.168.136.135 | jdk11,tomcat9.0.112 | 最少1G | 模拟生产/测试环境后端节点,接收Jenkins部署的应用程序,提供服务访问 |

二、部署gitlab
如果对gitlab部署不了解的可以参考这篇文章,我在这就不过多赘述了
https://blog.csdn.net/m0_63756214/article/details/155339506?spm=1001.2014.3001.5501
三、部署Jenkins环境
3.1 Jenkins上需要部署哪些软件?
Jenkins机器上除了要安装Jenkins的war包之外,还要安装jdk,tomcat,maven,git,还要生成密钥对
Jenkins 本身只是"自动化调度平台",不自带运行依赖、构建工具和安全通信能力,这些组件是支撑它完成"自动化构建/部署"核心功能的基础
Tomcat(运行容器) → 承载 Jenkins(调度平台) →远程仓库拉取代码→ 调用 JDK(编译基础) + Maven(构建工具) → 依赖 密钥(安全通信) 完成跨服务/跨服务器操作
| 组件 | 核心作用 |
|---|---|
| Jenkins war 包 | 自动化任务的"调度平台"(发号施令) |
| JDK | Jenkins依赖 JDK 提供的 Java 运行环境 |
| Tomcat | 一个专门运行 Java Web 应用的盒子;它会启动自身进程,监听 8080端口,自动解析 Jenkins 的 war 包 |
| git | 从gitlab中拉取代码 |
| Maven | 编译代码、下载依赖、打包成 jar/war |
| 密钥 | 公钥发给gitlab,后端服务器;私钥配置到Jenkins上 |
3.2 安装maven
由于我之前已经配置过Jenkins,并在其安装了jdk,tomcat,所以我现在只需安装git,maven即可
如果对Jenkins部署不了解的可以参考这篇文章https://blog.csdn.net/m0_63756214/article/details/155387987?spm=1001.2014.3001.5502
Maven官网:https://maven.apache.org/install.html
bash
#安装git
[root@jenkins ~]# yum -y install git
#安装maven
[root@jenkins ~]# wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz
[root@jenkins ~]# ls
apache-maven-3.9.11-bin.tar.gz apache-tomcat-10.1.49.tar.gz jenkins.war jdk-17.0.17_linux-x64_bin.tar.gz
[root@jenkins ~]# tar xf apache-maven-3.9.11-bin.tar.gz -C /usr/local/java/
[root@jenkins ~]# mv /usr/local/java/apache-maven-3.9.11/ /usr/local/java/maven
[root@jenkins ~]# vim /etc/profile #在文件中添加以下几行
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export MAVEN_HOME=/usr/local/java/maven
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin:$PATH
[root@jenkins ~]# source /etc/profile #加载配置文件
[root@jenkins ~]# mvn -v #查看maven版本
Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b)
Maven home: /usr/local/java/maven
Java version: 17.0.17, vendor: Oracle Corporation, runtime: /usr/local/java
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
3.3 安装插件
要实现Jenkins CI/CD效果,还需要下载一些插件
Maven 相关插件:用于后端项目的编译与打包操作
Deploy 相关插件:支持将代码自动化部署至 Tomcat 服务器
Git 相关插件:保障与 GitLab 代码仓库的拉取、提交等版本控制操作
SSH 相关插件:通过 SSH 协议完成服务器间的文件传输与远程命令执行
点击"Manage Jenkins"

下拉找到"plugins"


下载完成之后的界面,由于我之前已经安装过一些插件了,所以现在这个界面的插件比较少,大家在选择安装插件的时候可以把相关的都勾选上

安装插件之后最好重启一下Jenkins,输入ip地址:8080/jenkins/restart回车

重新登录

3.4 jenkins配置JDK和Maven


下拉找到"JDK安装"

下拉找到"Maven安装",如果找不到就是没有安装相关插件
点击"保存":保存并退出
点击"应用":保存

3.5 配置后端服务器
后端服务器上需要安装
jdk,tomcat,自动部署脚本jdk:提供Java运行环境
tomcat:用于部署和运行 Java Web 应用,自动解压 WAR 包为可运行的项目目录
自动部署脚本:"人工部署" 转化为 "自动化部署"
bash
#tomcat2同样操作
root@tomcat-1:~# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.112/bin/apache-tomcat-9.0.112.tar.gz #下载tomcat
root@tomcat-1:~# ls
apache-tomcat-9.0.112.tar.gz jdk-17.0.17_linux-x64_bin.tar.gz
root@tomcat-1:~# tar xf jdk-17.0.17_linux-x64_bin.tar.gz -C /usr/local
root@tomcat-1:~# mv /usr/local/jdk-17.0.17/ /usr/local/java
root@tomcat-1:~# tar xf apache-tomcat-9.0.112.tar.gz -C /usr/local/
root@tomcat-1:~# mv /usr/local/apache-tomcat-9.0.112/ /usr/local/tomcat
root@tomcat-1:~# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export TOMCAT_HOME=/usr/local/tomcat
root@tomcat-1:~# source /etc/profile #加载配置文件
root@tomcat-1:~# java --version #一定要能看到版本
java 17.0.17 2025-10-21 LTS
Java(TM) SE Runtime Environment (build 17.0.17+8-LTS-360)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.17+8-LTS-360, mixed mode, sharing)
bash
#部署脚本,脚本逻辑如下:
创建目录 → 迁移新WAR包并校验 → 检查是否有旧WAR包 →
├─ 有旧包:备份 → 停止Tomcat → 删除旧包 → 部署新包 → 启动Tomcat
└─ 无旧包:停止Tomcat → 部署新包 → 启动Tomcat
root@tomcat-1:~# vim /opt/auto-jenkins.sh
#!/usr/bin/bash
#本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
#================
#Defining variables
export JAVA_HOME=/usr/local/java #java环境变量路径
webapp_path="/usr/local/tomcat/webapps" #Tomcat的webapps目录
tomcat_run="/usr/local/tomcat/bin" #Tomcat的bin目录
timestamp=$(date +%F_%H%M%S)
updata_path="/opt/update/${timestamp}" #新war包的临时存放目录
backup_path="/opt/backup/${timestamp}" #旧war包的备份目录
files_dir="easy-springmvc-maven" #war包解压后的项目目录名(Tomcat 会自动解压 WAR 包为同名目录)
files="easy-springmvc-maven.war" #待部署的war包文件名
job_path="/root/upload" #Jenkins上传war包的目录(Jenkins 构建后将 WAR 包放到此目录)
#环境准备:目录创建+war包迁移
echo "Creating related directory"
mkdir -p $updata_path
mkdir -p $backup_path
echo "Move the uploaded war package to the update directory"
mv $job_path/$files $updata_path
if [ ! -f $updata_path/$files ];then
echo "新war包不存在,部署失败"
exit 1
fi
echo "========================================================="
cd /opt
echo "Backing up java project"
if [ -f $webapp_path/$files ];then
# 分支1:存在旧WAR包 → 先备份,再部署
tar czf ${backup_path}/${timestamp}.tar.gz $webapp_path
if [ $? -ne 0 ];then
echo "打包失败,自动退出"
exit 2
else
# 停止Tomcat
echo "Checking if tomcat is started"
$tomcat_run/shutdown.sh
sleep 10 # 等待10秒,让Tomcat优雅停止
# 检查Tomcat是否仍在运行(获取PID)
tomcat_pid=$(ps -ef | grep "CATALINA_HOME=/usr/local/tomcat" | grep -v grep | awk '{print $2}')
if [ -n "$tomcat_pid" ];then
echo "tomcat优雅停止失败,强制终止Tomcat"
kill -9 $tomcat_pid # 强制杀死Tomcat进程
sleep 5
# 再次检查是否终止成功
tomcat_pid_final=$(ps -ef | grep "CATALINA_HOME=/usr/local/tomcat" | grep -v grep | awk '{print $2}')
if [ -n "$tomcat_pid_final" ];then
echo "Tomcat强制终止失败,退出"
exit 3 # 退出码3表示"Tomcat终止失败"
fi
fi
# 删除旧WAR包和解压目录
cd $webapp_path
rm -rf $files && rm -rf $files_dir
# 复制新WAR包到Tomcat的webapps目录
cp $updata_path/$files $webapp_path
# 启动Tomcat
cd /opt
$tomcat_run/startup.sh
sleep 10 # 等待Tomcat启动
# 输出Tomcat的PID,验证是否启动成功
echo "显示tomcat的pid"
echo "`ps -ef | grep "CATALINA_HOME=/usr/local/tomcat" | grep -v grep | awk '{print $2}'`"
echo "tomcat startup"
echo "请手动查看tomcat日志。脚本将会自动退出"
fi
else
# 分支2:不存在旧WAR包 → 直接部署(无需备份)
echo "Checking if tomcat is started"
$tomcat_run/shutdown.sh
sleep 10
# 检查并强制终止Tomcat(逻辑同分支1)
tomcat_pid=$(ps -ef | grep "CATALINA_HOME=/usr/local/tomcat" | grep -v grep | awk '{print $2}')
if [ -n "$tomcat_pid" ];then
echo "tomcat优雅停止失败,强制终止Tomcat"
kill -9 $tomcat_pid
sleep 5
tomcat_pid_final=$(ps -ef | grep "CATALINA_HOME=/usr/local/tomcat" | grep -v grep | awk '{print $2}')
if [ -n "$tomcat_pid_final" ];then
echo "Tomcat强制终止失败,退出"
exit 3
fi
fi
# 复制新WAR包到webapps目录
cp $updata_path/$files $webapp_path
# 启动Tomcat(逻辑同分支1)
$tomcat_run/startup.sh
sleep 10
echo "显示tomcat的pid"
echo "`ps -ef | grep "CATALINA_HOME=/usr/local/tomcat" | grep -v grep | awk '{print $2}'`"
echo "tomcat startup"
echo "请手动查看tomcat日志。脚本将会自动退出"
fi
root@tomcat-1:~# chmod +x /opt/auto-jenkins.sh #给脚本执行权限
3.6 配置Jenkins密钥
3.6.1 生成密钥
bash
[root@jenkins ~]# ssh-keygen #生成密钥对,一直回车
[root@jenkins ~]# ls .ssh/ #id_rsa私钥;id_rsa.pub公钥
id_rsa id_rsa.pub
3.6.2 给gitlab配置公钥
给gitlab配置公钥:让Jenkins免密拉取代码

cat .ssh/id_rsa.pub查看公钥并复制

3.6.3 给后端服务器设置免密
给后端服务器配置公钥:让Jenkins免密部署项目:Jenkins 构建出jar/war 包后,需要把包上传到 "后端服务器",并执行启动/重启服务的命令;这个时候就需要用到免密
bash
[root@jenkins ~]# ssh-copy-id root@192.168.136.134 #公钥发送到tomcat-1
[root@jenkins ~]# ssh-copy-id root@192.168.136.135 #公钥发送到tomcat-2
点击"Manage Jenkins",配置SSH-Server

下拉找到"System"

继续下拉找到"SSH Server",点击"新增"


3.6.4 配置私钥到Jenkins服务器上
把私钥配置到 Jenkins 服务器上:让Jenkins能使用密钥完成认证:如果私钥不在Jenkins服务器上,Jenkins拉取gitlab代码、登录后端服务器时,找不到 "身份凭证",认证会失败


下拉找到"Publish over SSH",cat .ssh/id_rsa查看私钥并复制

四、构建项目
基于已完成部署的 GitLab、Jenkins 及后端服务器环境,我们需通过以下流程验证 Jenkins 自动化运维能力的落地效果:
1,选取一个开源项目作为测试载体,在 GitLab 平台新建名为test-project的代码仓库,并将该开源项目的源码完整推送至该仓库;
2,在 Jenkins 平台创建同名的构建项目,完成 GitLab 仓库地址、代码拉取凭证、构建命令(如 Maven 打包)等核心配置,触发首次构建并验证构建是否成功;
3,模拟开发人员日常迭代场景:手动修改开源项目的代码,将修改后的代码提交并推送到 GitLab 的test-project仓库;
4,再次在 Jenkins 中触发该项目的构建,若构建流程可自动拉取 GitLab 上的最新代码、完成编译打包并成功部署至后端服务器,则表明 Jenkins 已实现完整的自动化运维闭环
4.1 准备开源项目
https://github.com/bingyue/easy-springmvc-maven是我在github上,找的一个开源项目。能进行编译打包,用这个来进行测试
bash
#模拟开发人员
[root@developer ~]# yum -y install git #需要有git工具
[root@developer ~]# git config --global user.email "lisa@163.com"
[root@developer ~]# git config --global user.name "lisa"
[root@developer ~]# git clone https://github.com/bingyue/easy-springmvc-maven #拉取测试项目
[root@developer ~]# ls
easy-springmvc-maven
4.2 gitlab上新建项目test-project



可以看到test-project新建成功,待会要把开源测试项目推送到此

4.3 推送测试项目到gitlab
想要把开源项目推送到gitlab上,先要把gitlab上的test-project拉取下来,然后再把开源项目复制到test-project中,最后把test-project推送到gitlab上
这里为了方便,我就选择用http方式拉取test-project项目

bash
[root@developer ~]# ls
easy-springmvc-maven #开源项目
[root@developer ~]# git clone http://192.168.136.10/root/test-project.git #拉取test-project
Username for 'http://192.168.136.10': root #输入gitlab的用户名
Password for 'http://root@192.168.136.10': #输入gitlab密码
[root@developer ~]# ls
easy-springmvc-maven test-project
[root@developer ~]# ls easy-springmvc-maven/
pom.xml README.md src
[root@developer ~]# cp -r easy-springmvc-maven/* test-project/ #复制项目
[root@developer ~]# ls test-project/
pom.xml README.md src
[root@developer ~]# cd test-project/ #进入test-project项目
[root@developer test-project]# git add * #提交到暂存区
[root@developer test-project]# git commit -m 'version1' #提交到本地仓库
[root@developer test-project]# git push origin main #提交到远程仓库
下图中可以看到test-project中有新增的文件,推送成功

4.4 jenkins项目配置
4.4.1 jenkins新建项目


4.4.2 设置保留策略
下拉找到"Discard old builds"

4.4.3 添加身份验证
去gitlab上复制http代码
注:也可以使用ssh方式,下面配置的时候需要配置jenkins的私钥

下拉找到"源码管理",选择"git",添加身份验证

填写身份验证信息


4.4.4 设置自动编译打包
下拉找到"Build"

4.4.5 配置后端服务器
下拉找到"Environment",其他的填写成和我一样


4.5 构建项目

查看控制台输出的内容,如果构建失败控制台都会有说明

访问页面ip:8080/easy-springmvc-maven/,都成功了


4.6 二次构建
下面模拟开发人员修改代码,推送代码,测试Jenkins是否可以完成自动部署,自动发布
bash
[root@developer ~]# ls
easy-springmvc-maven test-project
[root@developer ~]# rm -rf *
[root@developer ~]# git clone http://192.168.136.10/root/test-project.git #重新拉取代码
Username for 'http://192.168.136.10': root #输入gitlab账号
Password for 'http://root@192.168.136.10': #输入gitlab密码
[root@developer ~]# ls #成功拉取了test-project
test-project
[root@developer ~]# cd test-project/ #进入test-project中
[root@developer test-project]# vim src/main/webapp/index.jsp #编辑该项目页面,模拟开发人员修改代码

bash
[root@developer test-project]# git add * #提交到暂存区
[root@developer test-project]# git commit -m "version2" #提交到本地仓库
[root@developer test-project]# git push origin main #推送到gitlab
Username for 'http://192.168.136.10': root
Password for 'http://root@192.168.136.10':
再次构建,构建的时候Jenkins会自动去gitlab中拉取最新的代码,然后发送到后端服务器,实现自动拉取,自动部署,自动发布


测试效果,刷新页面,页面改动

注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~