Jenkins实战:从零到一自动化部署若依前后端分离项目
在当今快速迭代的软件开发环境中,自动化部署已成为提升团队效率、保障发布质量的核心环节。对于采用前后端分离架构的流行项目,如基于Spring Boot和Vue的若依(RuoYi)框架,如何构建一套稳定、高效的CI/CD流水线,是每一位开发者和运维工程师需要掌握的技能。本文将手把手带你使用Jenkins,完成若依项目的全流程自动化部署,涵盖环境搭建、工具配置、项目构建与发布验证,助你打通从代码提交到服务上线的最后一公里。
一、若依项目与自动化部署的价值
若依(RuoYi)是国内广泛使用的企业级开源开发平台,它并非一个单纯的前端框架或后端框架,而是一个集成了权限管理、菜单配置等通用功能的一站式解决方案。其典型架构采用前后端分离模式:后端基于Spring Boot提供RESTful API,前端则可以使用Vue或React等前端框架进行UI开发。对于运维和DevOps工程师而言,掌握若依的部署,实质上是掌握了大多数Java + Vue前后端分离项目的部署范式,技能迁移性极强。
自动化部署的核心价值在于将重复、易错的手工操作(如编译、打包、上传、重启服务)转化为可重复、可追踪的自动化流程。通过Jenkins,我们可以实现:
- 代码提交即触发构建:开发者推送代码到GitLab后,Jenkins自动拉取最新代码。
- 标准化构建环境:统一使用配置好的Maven、Node.js等前端工具进行构建,避免环境差异导致的问题。
- 自动化测试与部署:构建完成后,自动将前端静态资源部署至Nginx服务器,将后端Jar包部署至应用服务器并重启。
- 快速回滚与迭代:每次构建都有记录,出现问题可快速回退到上一稳定版本。
二、部署环境规划与基础服务安装
在开始之前,我们需要一个清晰的环境规划。一个典型的最小化部署环境包含以下角色:
- 代码仓库服务器:GitLab,用于存储和管理项目代码。
- 持续集成服务器:Jenkins,作为自动化流水线的控制中心。
- 前端服务器:部署Nginx,用于托管Vue打包生成的静态资源(HTML、JS、CSS)。
- 后端应用服务器:运行Java环境,部署Spring Boot后端Jar包。
- 数据库服务器:运行MySQL和Redis,分别存储业务数据和缓存会话。
为了简化,可以将部分服务部署在同一台机器。以下是本次演示的环境参考:
| 主机名 | IP地址 | 最低配置 | 运行服务 | 作用 |
|---|---|---|---|---|
| gitlab | 192.168.136.10 | 2cpu,内存最少3G | gitlab | 为developer提供代码推送/拉取服务,为jenkins提供源码拉取地址 |
| developer | 192.168.136.20 | 1cpu,内存0.5G即可 | git | 模拟开发者修改代码,修改后的代码推送至gitlab远程仓库 |
| jenkins | 192.168.136.30 | 2cpu,内存最少3G | jenkins2.504.2,jdk 17,git,tomcat10.1.49,maven3.9.11,node.js16.20.2 | 核心调度节点,从gitlab拉取代码,打包后分别推送至frontend、backend主机,依赖mysql/redis提供服务支撑 |
| frontend | 192.168.136.134 | 1cpu,内存1G即可 | nginx | 部署前端静态资源,通过nginx对外提供访问,依赖backend提供接口服务 |
| backend | 192.168.136.135 | 1cpu,内存1G即可 | jdk17,mysql连接工具,redis连接工具 | 部署后端服务,依赖mysql存储业务数据,依赖redis实现缓存功能 |
| mysql | 192.168.136.138 | 1cpu,内存1G即可 | mysql | 仅为backend提供数据库服务 |
| redis | 192.168.136.139 | 1cpu,内存0.5G即可 | redis | 为backend提供缓存服务 |
部署前,请确保各服务器时间同步,并正确配置防火墙规则(或暂时关闭防火墙)。各核心软件的安装步骤(如Jenkins、JDK、MySQL等)可参考官方文档,本文重点在于配置与集成。安装完成后,我们将在Jenkins中配置必要的构建工具。
三、Jenkins核心工具与插件配置
Jenkins的强大依赖于其丰富的插件生态。首先,我们需要在Jenkins服务器上安装构建若依项目所需的工具:Maven(用于后端Java项目)和Node.js(用于前端Vue项目)。
你可以通过Jenkins的“全局工具配置”界面进行安装和指定路径:
#下载maven,node.js我是直接下载到了电脑上,上传到本机的
[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 node-v16.20.2-linux-x64.tar.xz
[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 ~]# tar xf node-v16.20.2-linux-x64.tar.xz -C /usr/local/
[root@jenkins ~]# mv /usr/local/node-v16.20.2-linux-x64/ /usr/local/node
[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 NODE_HOME=/usr/local/node
export NODE_PATH=$NODE_HOME/lib/node_modules/
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$MAVEN_HOME/bin:$NODE_HOME/bin:$PATH
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# mvn -v #一定要能显示版本,查看maven版本Java项目构建工具
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"
[root@jenkins ~]# node -v #查看node.js版本;js运行环境
v16.20.2
[root@jenkins ~]# npm -v #查看npm版本;node.js包管理工具
8.19.4
[root@jenkins ~]#
接下来,安装关键的Jenkins插件,它们是实现自动化流程的“齿轮”:
- Maven Integration (
Maven 相关插件:):提供对Maven项目的原生支持。 - NodeJS (
NodeJS 相关插件:):提供Node.js环境,用于前端构建。 - Publish Over SSH (
SSH 相关插件:):核心插件!允许Jenkins通过SSH向远程服务器发送文件和执行命令,这是实现自动部署的关键。 - GitLab (
Git 相关插件:):增强与GitLab仓库的集成能力。
插件安装完成后,建议重启Jenkins服务使其生效。配置界面可参考:


四、项目准备:从官方仓库到私有GitLab
我们不会直接在Jenkins中构建若依官方仓库的代码。最佳实践是将项目Fork或克隆到自己的GitLab私有仓库中,以便进行定制化开发和权限控制。
首先,在GitLab上创建一个新项目,例如命名为 test-ruoyi-vue。


接着,在本地或某个临时环境克隆若依官方项目,并完成基础的数据库配置:
#developer机器
[root@developer ~]# git clone https://gitee.com/y_project/RuoYi-Vue.git #拉取若依开源项目
[root@developer ~]# ls
RuoYi-Vue
配置MySQL数据库,创建若依项目所需的数据库和用户:
#developer机器
#若依的sql脚本在源码的sql目录下,包含两个核心文件
[root@developer ~]# ls RuoYi-Vue/sql/
quartz.sql ry_20250522.sql
[root@developer ~]# scp RuoYi-Vue/sql/* 192.168.136.138:/root #拷贝给mysql数据库机器
#mysql机器
root@mysql:~# mysql -uroot -p'Admin@123'
mysql> CREATE DATABASE ruoyi CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; #创建ruoyi数据库,待会把数据导入到此
mysql> quit
root@mysql:~# ls
quartz.sql ry_20250522.sql
root@mysql:~# mysql -uroot -p'Admin@123' ruoyi < ry_20250522.sql #导入数据
root@mysql:~# mysql -uroot -p'Admin@123' ruoyi < quartz.sql #导入数据
root@mysql:~# mysql -uroot -p'Admin@123'
mysql> use ruoyi ; show tables; #去ruoyi库中看看有没有成功导入数据
mysql> GRANT ALL PRIVILEGES ON ruoyi.* TO 'ruoyi'@'%' IDENTIFIED BY 'Ruoyi@123'; #创建一个用户
#后端机器测试能否连接
root@backend:~# mysql -u'ruoyi' -p -h 192.168.136.138
Enter password: #输入密码
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ruoyi |
+--------------------+
2 rows in set (0.08 sec)
#developer机器
[root@developer ~]# vim RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml #修改若依项目的mysql配置
配置Redis,确保其可以远程连接或本地访问:
#redis机器
root@redis:/data/application/redis# nohup src/redis-server redis.conf & #后台重启redis
root@redis:/data/application/redis# src/redis-cli 进入redis
127.0.0.1:6379> ping
PONG
#后端机器测试能否连接
root@backend:~# redis-cli -h 192.168.136.139 -p 6379
192.168.136.139:6379> ping
PONG
192.168.136.139:6379> exit
#developer机器
[root@developer ~]# vim RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml #修改redis配置,填写ip地址和密码
最后,将配置好的若依项目代码推送到我们自建的GitLab仓库中:
#developer机器
[root@developer ~]# git clone http://192.168.136.10/root/test-ruoyi-vue.git #拉取test-ruoyi-vue空项目
[root@developer ~]# ls
RuoYi-Vue test-ruoyi-vue
[root@developer ~]# cp -r RuoYi-Vue/* test-ruoyi-vue/
[root@developer ~]# cd test-ruoyi-vue/
[root@developer test-ruoyi-vue]# git add * #提交到暂存区
[root@developer test-ruoyi-vue]# git commit -m "初始版本" #提交到本地仓库
[root@developer test-ruoyi-vue]# git push origin #提交到远程仓库
至此,我们拥有了一个可以用于自动化构建的、包含基础配置的若依项目源码仓库。
[AFFILIATE_SLOT_1]五、构建前端Vue项目流水线
前后端分离项目的部署通常是分开进行的。我们先配置前端项目的自动化构建与部署。
第一步:配置Jenkins与GitLab的SSH密钥认证。为了让Jenkins能从GitLab拉取代码,需要在Jenkins服务器生成SSH密钥对,并将公钥添加到GitLab账户的SSH Keys中。
[root@jenkins ~]# ssh-keygen #一直回车,生成密钥对
[root@jenkins ~]# ls .ssh/
id_rsa id_rsa.pub
#GitLab 需要验证 “是不是合法的 Jenkins 来拉代码”,所以 GitLab 存着 Jenkins 的公钥
[root@jenkins ~]# cat .ssh/id_rsa.pub #复制公钥到gitlab上
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDG/l6ockNK+ZUIXdAVb6jZetMQWD24KniFe+bPqXgWWOkzrq1qafvPhWfwNMf4Gaxdu9WftKvQARQUyDoGOZYT2RB+aCkXo5ZRFuGDHlN+pclAahiAoKvqhj7LxEd029t4iqTxBy33ySqVCWjrGlki+s05RlRR7UofNix4q/+emsezfuMAEBfzQYtw6OESRtPryRvpRGVtx5QxNp46Skfm9NWw0Yjip1dL5h804fbz5xpecS/JrS2qPICvWmB0kFFVz0xiUpuNF+UF0jsfsnN6SSh4vHDpMkdHFiMKV/MN/nNPkQn6Uc8Zot7KqlU2y6juAwCVFvlyuhYQYVsi1TRJ root@jenkins
#可以顺便把公钥拷贝给前后端服务器
#后端服务器需要验证 “是不是合法的 Jenkins 来推送打包文件”,所以后端服务器存着 Jenkins 的公钥
[root@jenkins ~]# ssh-copy-id root@192.168.136.134 #拷贝给前端服务器
[root@jenkins ~]# ssh-copy-id root@192.168.136.135 #拷贝给后端服务器
将输出的公钥(id_rsa.pub内容)粘贴到GitLab设置中:

同时,将私钥(id_rsa)配置到Jenkins的“Publish over SSH”插件中,用于后续对前端/后端服务器的SSH认证。

第二步:创建并配置前端Jenkins任务。新建一个自由风格软件项目,命名为如 test-ruoyi-vue-frontend。
在源码管理部分,选择Git,填入GitLab仓库的SSH地址,并指定认证方式为之前配置的SSH私钥。


在构建环境中,选择我们之前配置好的Node.js工具版本。

第三步:编写构建与部署脚本。在“构建步骤”中,添加“执行Shell”步骤,命令在Jenkins服务器上运行,用于安装依赖和打包。

然后,添加“Send files or execute commands over SSH”步骤,选择之前配置好的前端服务器SSH连接。这里执行两个核心操作:
- 将Jenkins打包好的前端静态资源(dist目录)传输到前端服务器的Nginx HTML目录。
- 可选地,重启Nginx服务或刷新缓存。
配置完成后,点击“立即构建”进行测试。蓝色球标志代表构建成功。

六、构建后端Spring Boot项目流水线
后端项目的构建流程与前段类似,但使用的工具和部署目标不同。
第一步:配置Maven工具。在Jenkins全局工具配置中,添加Maven安装。

第二步:创建并配置后端Jenkins任务。新建一个Maven项目,命名为如 test-ruoyi-vue-backend。同样配置Git源码地址。
在“Pre Steps”或“Post Steps”中,添加SSH部署步骤。这里的关键是编写一个部署脚本,将其放在后端服务器上,由Jenkins通过SSH触发执行。脚本内容通常包括:
- 备份当前正在运行的服务。
- 将Jenkins传输过来的新Jar包移动到指定目录。
- 停止旧服务进程。
- 使用新的Jar包启动服务(可使用
nohup或systemd)。
root@backend:~# vim /opt/ruoyi-java/java.sh
#!/bin/bash
# 若依后端启动/重启脚本
# 配置项(根据实际情况修改)
APP_NAME="ruoyi-admin"
JAR_PATH="/opt/ruoyi-java/ruoyi-admin.jar"
LOG_PATH="/opt/ruoyi-java/logs/ruoyi-admin.log" # 日志路径,需确保目录存在
JAVA_PATH="/usr/local/java/bin/java"
PORT=8080 # 后端服务端口,用于检测是否被占用
# 创建日志目录(如果不存在)
mkdir -p $(dirname $LOG_PATH)
# 1. 查找并关闭旧进程
ruoyi_pid=$(ps -ef | grep "$APP_NAME" | grep -v "grep" | awk '{print $2}')
if [[ -n $ruoyi_pid ]]; then
echo "===== 发现若依后端服务PID: $ruoyi_pid,正在关闭 ====="
kill -15 $ruoyi_pid
# 等待5秒,让旧进程完全退出
sleep 5
# 检查是否还存在进程,若存在则强制杀死
ruoyi_pid=$(ps -ef | grep "$APP_NAME" | grep -v "grep" | awk '{print $2}')
if [[ -n $ruoyi_pid ]]; then
echo "===== 旧进程未正常退出,强制杀死 ====="
kill -9 $ruoyi_pid
sleep 2
fi
echo "===== 若依后端服务已关闭 ====="
fi
# 2. 检测端口是否被占用
port_pid=$(lsof -i:$PORT | grep -v "PID" | awk '{print $2}')
if [[ -n $port_pid ]]; then
echo "===== 端口$PORT被占用(PID: $port_pid),强制释放 ====="
kill -9 $port_pid
sleep 2
fi
# 3. 启动新服务(添加JVM内存参数,根据服务器配置调整),-Dspring.redis.host后面接redis ip
echo "===== 正在启动若依后端服务 ====="
nohup $JAVA_PATH -Xms512m -Xmx1024m -Djava.awt.headless=true -Dsun.font.path=/usr/share/fonts -Dspring.redis.host=192.168.136.139 -jar $JAR_PATH > $LOG_PATH 2>&1 &
# 等待3秒,让服务启动
sleep 3
# 4. 检查启动是否成功
ruoyi_pid=$(ps -ef | grep "$APP_NAME" | grep -v "grep" | awk '{print $2}')
if [[ -n $ruoyi_pid ]]; then
echo "===== 若依后端服务启动成功,PID: $ruoyi_pid ====="
echo "日志路径: $LOG_PATH"
else
echo "===== 若依后端服务启动失败,请查看日志: $LOG_PATH ====="
exit 1
fi
root@backend:~# chmod +x /opt/ruoyi-java/java.sh #给脚本执行权限
在Jenkins任务的配置中,调用这个远程脚本:

构建测试,成功后即可完成后端服务的更新。

七、验证与迭代:完成自动化闭环
当前后端构建任务都成功后,即可通过浏览器访问前端Nginx服务器的地址(如 前端ip),看到若依系统的登录界面,这标志着首次部署成功。

自动化迭代测试:为了验证CI/CD流程的完整性,我们可以模拟一次真实的开发迭代。
- 开发人员在本地修改前端页面某个标题文字。
- 将修改提交并推送到GitLab仓库。
#开发人员
[root@developer ~]# git clone http://192.168.136.10/root/test-ruoyi-vue.git #拉取代码
[root@developer ~]# ls
test-ruoyi-vue
[root@developer ~]# cd test-ruoyi-vue/
[root@developer test-ruoyi-vue]# vim ruoyi-ui/src/views/index.vue #修改前端页面
此时,我们可以手动在Jenkins上触发前端项目的构建,也可以配置GitLab Webhook实现代码推送后自动触发Jenkins构建。构建完成后,刷新浏览器页面,可以看到修改已立即生效。

至此,一个完整的、基于Jenkins的若依前后端分离项目自动化部署流水线已经搭建完毕。这套流程不仅适用于若依,其设计思想和方法可以平移到任何类似的Spring Boot + Vue/React项目中去。
[AFFILIATE_SLOT_2]通过本文的实践,你不仅学会了具体的配置步骤,更重要的是理解了自动化部署中各环节的协作关系:代码仓库、CI服务器、构建工具、应用服务器如何通过SSH和插件连接成一个有机整体。后续,你可以在此基础上探索更高级的特性,如流水线脚本(Pipeline as Code)、多环境部署(开发/测试/生产)、自动化测试集成等,从而构建更健壮、更高效的交付体系。
浙公网安备 33010602011771号