【Jenkins+GitLab 自动化构建部署实战教程:环境介绍、服务部署、密钥配置、项目推送与自动编译打包全流程详解】

提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会

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 配置后端服务器

后端服务器上需要安装jdktomcat自动部署脚本

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%原创,转载请务必标注原创作者,尊重劳动成果。

求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

相关推荐
古城小栈1 小时前
Jenkins 自动构建 搞起来
java·servlet·jenkins
axihaihai1 小时前
jenkins下微服务的cicd流程
运维·微服务·jenkins
江池俊1 小时前
openEuler开发与自动化运维实战:从系统部署到CI/CD流水线构建
运维·ci/cd·自动化
御控工业物联网1 小时前
工业网关新玩法:手机变“移动触摸屏”,局域网内远程操控PLC
物联网·智能手机·自动化·数据采集·plc·远程控制·远程操控plc
要站在顶端1 小时前
Jenkins设备监控(手机、手表)适配Windows、Linux
windows·智能手机·jenkins
HIT_Weston2 小时前
50、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(二)
前端·ubuntu·gitlab
水星灭绝2 小时前
win11下desktop-docker安装gitlab-ce
docker·容器·gitlab
梦想的旅途212 小时前
企业群运营自动化:RPA技术高效赋能
运维·自动化·rpa
阿蔹15 小时前
抓包工具Charles——介绍、篡改数据、弱网环境测试
java·自动化·抓包·charles