以下是参考的文章教程
RuoYi-Vue: 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本
Docker 快速安装Jenkins完美教程 (亲测采坑后详细步骤) - 付宗乐 - 博客园
安装后的配置:
(2 封私信) Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1 - 知乎
掌握Jenkins自动化部署:从代码提交到自动上线的全流程揭秘_自动化部署工具jenkins-CSDN博客
一 部署jenkins
部署jenkins前先安装相应环境
Maven环境
docker环境
JDK环境
1.安装Maven
下载 Maven: Maven 可以从 Apache Maven 的官方网站下载。你可以使用 wget 命令下载 Maven 的 tar.gz 压缩包。
wget https://dlcdn.apache.org/maven/maven-3/3.9.10/binaries/apache-maven-3.9.10-bin.tar.gz解压 Maven: 使用 tar 命令解压下载的 Maven 压缩包。
tar -zxvf apache-maven-3.9.10-bin.tar.gz -C /opt/设置环境变量: 打开 /etc/profile 文件并在文件末尾添加 Maven 的环境变量。
echo "export M2_HOME=/opt/apache-maven-3.9.10" >> /etc/profile echo "export M2=$M2_HOME/bin" >> /etc/profile echo "export PATH=$PATH:$M2" >> /etc/profile执行 source /etc/profile 命令使环境变量生效。
source /etc/profile
验证 Maven 安装: 使用 mvn -v 命令来验证 Maven 是否安装成功。
mvn -v
2.检查 JDK 环境
docker环境里默认是有个jdk的 也可以使用默认的 也可以自己挂载 我这里用的默认的
检查是否已安装 JDK: CentOS 7 默认没有安装 JDK,但提供了 java 命令。你可以通过以下命令来检查是否安装了 JDK:
java -version如果系统提示 java 命令不存在,那么你需要安装 JDK。
安装 JDK: 你可以使用 yum 命令安装 JDK。Oracle JDK 需要从 Oracle 官网下载,但 OpenJDK 可以通过 yum 安装。
sudo yum install java-1.8.0-openjdk-devel这将安装 OpenJDK 1.8。
验证 JDK 安装: 安装完成后,再次使用 java -version 命令来验证 JDK 是否安装成功。
java -version
2.部署jenkins
这边用的是docker部署
1.1.拉取镜像文件
docker pull jenkins/jenkins
1.2.创建Jenkins挂载目录并授权权限(我们在服务器上先创建一个jenkins工作目录 /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。 如果我们不这样做,那么如果需要修改容器配置文件,将会有点麻烦,因为虽然我们可以使用docker exec -it --user root 容器id /bin/bash 命令进入容器目录,但是连简单的 vi命令都不能使用)
mkdir -p /var/jenkins_mount
chmod 777 /var/jenkins_mount
1.3创建并启动jenkins容器
此条命令只挂载了maven 然后jdk用的自带的环境
docker run -d -p 10240:8080 -p 10241:50000 -v /usr/local/webserver/jenkins_mount:/var/jenkins_home -v /opt/apache-maven-3.9.10:/usr/local/maven -v /etc/localtime:/etc/localtime --name myjenkins jenkins/jenkins
undefined
-d 后台运行镜像
-p 10240:8080 将镜像的8080端口映射到服务器的10240端口。
-p 10241:50000 将镜像的50000端口映射到服务器的10241端口
-v /opt/apache-maven-3.9.10:/usr/local/maven ##是用来挂载maven的
-v /var/jenkins_mount:/var/jenkins_mount /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录
-v /etc/localtime:/etc/localtime让容器使用和服务器同样的时间设置。
--name myjenkins 给容器起一个别名
-d 后台运行镜像 -p 10240:8080 意义: 将镜像的8080端口映射到服务器的10240端口。
-p 10241:50000 意义:将镜像的50000端口映射到服务器的10241端口
-v /var/jenkins_mount:/var/jenkins_mount 意义: /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录
-v /etc/localtime:/etc/localtime 意义:让容器使用和服务器同样的时间设置。
-v opt/apache-maven-3.9.9:/usr/maven 意义:挂载本地maven,前面是服务器上的,后面是挂载到容器上的目录
–name myjenkins 意义:给容器起一个别名
1.4配置镜像加速,进入 cd /var/jenkins_mount/ 目录。
修改 vi hudson.model.UpdateCenter.xml里的内容
将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

3.配置jenkins 并安装相关插件
Jenkins常用插件安装及全局配置_jenkins 插件-CSDN博客
jdk配置 别名无所谓 然后路径是docker默认的

maven 路径就是我们创建的时候挂载的路径

安装jenkins插件
Role-based Authorization Strategy #jenkins 权限控制插件
git插件: Git Parameter
安装gitlab插件:
Gitlab Merge Request Builder和gitlab
安装插件:maven integration、Deploy to container
安装插件: Publish Over SSH
如果这里选择自动下载node的话 那需要先跑一边自由项目才会触发下载

使用Jenkins + git 创建流水线 (仅供参考,还是按照实际情况来)
新建maven项目 任务名称自定义

2.添加仓库地址

配置文件是在这里新建的 可以把项目中yml文件内容复制进来


ssh 服务器配置

pom.xml配置文件的注释
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模型版本,通常为4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目的组织或团体标识 -->
<groupId>com.ruoyi</groupId>
<!-- 项目名称 -->
<artifactId>ruoyi</artifactId>
<!-- 项目版本号 -->
<version>3.8.8</version>
<!-- 项目的显示名称 -->
<name>ruoyi</name>
<!-- 项目的官方网址 -->
<url>http://www.ruoyi.vip</url>
<!-- 项目的简要描述 -->
<description>若依管理系统</description>
<properties>
<!-- 若依项目版本号属性 -->
<ruoyi.version>3.8.8</ruoyi.version>
<!-- 项目源代码编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 项目报告输出编码 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 使用的Java版本 -->
<java.version>1.8</java.version>
<!-- maven-jar-plugin的版本 -->
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<!-- Spring框架版本号 -->
<spring-framework.version>5.3.33</spring-framework.version>
<!-- Spring Security版本号 -->
<spring-security.version>5.7.12</spring-security.version>
<!-- 阿里数据库连接池版本号 -->
<druid.version>1.2.23</druid.version>
<!-- 解析客户端信息工具版本号 -->
<bitwalker.version>1.21</bitwalker.version>
<!-- Swagger版本号 -->
<swagger.version>3.0.0</swagger.version>
<!-- 验证码版本号 -->
<kaptcha.version>2.3.3</kaptcha.version>
<!-- pagehelper分页插件版本号 -->
<pagehelper.boot.version>1.4.7</pagehelper.boot.version>
<!-- 阿里JSON解析器版本号 -->
<fastjson.version>2.0.43</fastjson.version>
<!-- 获取系统信息工具版本号 -->
<oshi.version>6.6.3</oshi.version>
<!-- io常用工具类版本号 -->
<commons.io.version>2.13.0</commons.io.version>
<!-- poi版本号 -->
<poi.version>4.1.2</poi.version>
<!-- velocity版本号 -->
<velocity.version>2.3</velocity.version>
<!-- jwt版本号 -->
<jwt.version>0.9.1</jwt.version>
</properties>
<!-- 依赖声明管理,用于集中管理项目依赖版本 -->
<dependencyManagement>
<dependencies>
<!-- Spring Framework的依赖配置,通过导入pom类型的依赖来管理Spring Framework相关依赖的版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring-framework.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Security的依赖配置,同理管理Spring Security相关依赖的版本 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-bom</artifactId>
<version>${spring-security.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Boot的依赖配置,导入Spring Boot的依赖管理pom,以便统一管理Spring Boot相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.15</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 阿里数据库连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 解析客户端操作系统、浏览器等的依赖 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>${bitwalker.version}</version>
</dependency>
<!-- pagehelper分页插件依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- 获取系统信息的依赖 -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<____>${oshi.version}</____>
</dependency>
<!-- Swagger3依赖,排除了io.swagger.swagger-models模块 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- io常用工具类依赖 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>.commons-io</artifactId>
<version>${commons.io.version}</version>
</dependency>
<!-- excel工具依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version=${poi.version}${poi.version}></version>
</dependency>
<!-- velocity代码生成使用模板依赖 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version=${velocity.version}${velocity.version}></version>
</dependency>
<!-- 阿里JSON解析器依赖 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version=${fastjson.version}${fastjson.version}></version>
</dependency>
<!-- Token生成与解析依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version=${jwt.version}${jwt.version}></version>
</dependency>
<!-- 验证码依赖 -->
<dependency>
<groupId>pro.fessional</groupId>
<artifactId>kaptcha</artifactId>
<version=${kaptcha.version}${kaptcha.version}></version>
</dependency>
<!-- 定时任务依赖 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId>
<version=${ruoyi.version}${ruoyi.version}></version>
</dependency>
<!-- 代码生成依赖 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
<version=${ruoyi.version}${ruoyi.version}></version>
</dependency>
<!-- 核心模块依赖 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
<version=${ruoyi.version}${ruoyi.init()}</version>
</dependency>
<!-- 系统模块依赖 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>
<version=${ruoyi.version}${ruoyi.version}></version>
</dependency>
<!-- 通用工具依赖 -->
<dependency>
<groupId>com.ruoyi</兴路=>路7. {.jpeg
<artifactId>ruoyi-common</artifactId>
<version=${ruoyi.version}${ruoyi.version}></version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<!-- 项目模块列表,包含多个模块 -->
<module>ruoyi-admin</module>
<module>ruoyi-framework</module>
<module>ruoi-system-flow
</modules>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</reposals></releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
前后端在一个流水线上的配置截图

前端工作流

# 查看版本信息
npm -v
# 将镜像源替换为淘宝的加速访问
npm config set registry https://registry.npmmirror.com
#进入 前端 所在目录
cd ruoyi-ui/
#项目打包
npm install
npm run build:stage
nginx配置:
[root@VM-0-11-centos target]# cat /etc/nginx/vhost/ruoyi.conf
server
{
listen 80;
server_name vue.happly.asia;
index index.html index.htm default.htm default.html;
root /usr/local/webserver/ruoyi/ruoyi-ui/dist;
#CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除并保持这段设置在优先级高的位置
#include /www/server/panel/vhost/nginx/well-known/vue.xiaole.icu.conf;
#CERT-APPLY-CHECK--END
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#这一段是为了刷新不报错
location / {
root /usr/local/webserver/ruoyi/ruoyi-ui/dist;
try_files $uri $uri/ /index.html;
}
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
# include /www/server/panel/vhost/rewrite/html_vue.xiaole.icu.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location /stage-api/ {
proxy_pass http://localhost:8080/; #后端地址
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /usr/local/webserver/ruoyi/ruoyi-ui/logs/vue.happly.asia.log;
error_log /usr/local/webserver/ruoyi/ruoyi-ui/logs/vue.happly.asia.error.log;
}
后端运行命令:
java -jar ruoyi-admin.jar
git变更推送命令
git clone 项目地址 是获取项目
git status 是查看变更文件
git add <变更文件名> 是添加到暂缓区应该是
git commit -m '这个是变更描述'
git push origin main 就是推送到仓库 main是主分支
最后流水线截图
前端ui流水线 node打包的




后端admin打包的 用的是java





记得勾选这个 不然不会替换

deploy.sh 脚本文件是启动
jps -v 可以直接看java进程 号
#!/bin/bash
# 定义应用名称和路径
APP_NAME="ruoyi-admin.jar"
APP_PATH="/usr/local/webserver/ruoyi/ruoyi-admin/target/${APP_NAME}"
# 定义脚本日志文件路径(脚本执行日志)
SCRIPT_LOG_FILE="/usr/local/webserver/ruoyi/ruoyi-deploy-script.log"
# 定义应用日志文件路径(Java 应用日志)
APP_LOG_FILE="/usr/local/webserver/ruoyi/ruoyi-admin-app.log"
# 检查 JAR 文件是否存在
if [ ! -f "${APP_PATH}" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:JAR 文件不存在 - ${APP_PATH}" | tee -a "${SCRIPT_LOG_FILE}"
exit 1
fi
# 查找应用进程 ID(避免匹配自身脚本)
get_pid() {
# 过滤掉 grep 命令本身和脚本进程,确保只匹配 JAR 进程
ps -ef | grep "${APP_PATH}" | grep -v grep | grep -v "$0" | awk '{print $2}'
}
# 终止进程函数
stop_process() {
PID=$(get_pid)
if [ -n "${PID}" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 发现正在运行的进程,PID: ${PID},正在终止..." | tee -a "${SCRIPT_LOG_FILE}"
kill -15 "${PID}" # 优雅终止(SIGTERM)
# 等待 3 秒,若仍未终止则强制杀死
sleep 3
if ps -p "${PID}" > /dev/null; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程未正常终止,强制杀死..." | tee -a "${SCRIPT_LOG_FILE}"
kill -9 "${PID}"
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进程已终止" | tee -a "${SCRIPT_LOG_FILE}"
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 未发现运行中的进程" | tee -a "${SCRIPT_LOG_FILE}"
fi
}
# 启动进程函数
start_process() {
# 检查是否已启动(双重保险)
PID=$(get_pid)
if [ -z "${PID}" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动应用:${APP_PATH}" | tee -a "${SCRIPT_LOG_FILE}"
# 后台启动并将应用日志输出到指定文件
nohup java -jar "${APP_PATH}" > "${APP_LOG_FILE}" 2>&1 &
# 等待 2 秒检查启动状态
sleep 2
# 验证启动结果
PID=$(get_pid)
if [ -n "${PID}" ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 应用启动成功,PID: ${PID}" | tee -a "${SCRIPT_LOG_FILE}"
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 启动失败,请查看日志:${APP_LOG_FILE}" | tee -a "${SCRIPT_LOG_FILE}"
exit 1
fi
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 应用已在运行,PID: ${PID},无需重复启动" | tee -a "${SCRIPT_LOG_FILE}"
fi
}
# 主流程:先停止再启动
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ===== 开始部署 ${APP_NAME} =====" | tee -a "${SCRIPT_LOG_FILE}"
stop_process
start_process
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ===== 部署完成 =====" | tee -a "${SCRIPT_LOG_FILE}"