一、环境准备
1. 主机环境说明
| 主机 IP | 部署服务清单 | 最低配置 |
|---|---|---|
| 192.168.10.13 | Jenkins、Redis、MySQL、Spring Boot、Nginx | 2C 8G |
| 192.168.10.80 | GitLab、Docker | 1C 4G |
2. Docker 安装(所有主机执行)
bash
运行
# 安装Docker依赖包(yum-utils提供yum-config-manager,device-mapper-persistent-data和lvm2用于存储驱动)
yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置阿里云Docker镜像源(加速镜像下载)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装指定版本Docker(20.10.18版本稳定性较好)
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
# 启动Docker服务并设置开机自启
systemctl start docker.service
systemctl enable docker.service
# 配置华为镜像加速器(解决国内镜像拉取慢的问题)
mkdir -p /etc/docker # 创建Docker配置目录
tee /etc/docker/daemon.json <<-'EOF' # 写入配置文件
{
"registry-mirrors": [ "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com" ]
}
EOF
# 重新加载配置并重启Docker
systemctl daemon-reload
systemctl restart docker
二、GitLab 部署与配置(192.168.10.80 执行)
1. 拉取 GitLab 镜像
bash
运行
docker pull beginor/gitlab-ce # 拉取社区版GitLab镜像
2. 创建数据卷(持久化存储)
bash
运行
# 创建GitLab配置、日志、数据存储目录
mkdir -p /data/gitlab/etc/ /data/gitlab/log/ /data/gitlab/data
# 授予777权限(避免容器内权限不足导致无法写入)
chmod 777 /data/gitlab/etc/ /data/gitlab/log/ /data/gitlab/data/
3. 启动临时 GitLab 容器
bash
运行
docker run -itd --name=gitlab \
--restart=always \ # 容器退出后自动重启
--privileged=true \ # 授予容器特权模式(避免文件权限问题)
-p 8443:443 \ # 映射HTTPS端口
-p 80:80 \ # 映射HTTP端口
-p 222:22 \ # 映射SSH端口(避免与主机22端口冲突)
-v /data/gitlab/etc:/etc/gitlab \ # 挂载配置目录
-v /data/gitlab/log:/var/log/gitlab \ # 挂载日志目录
-v /data/gitlab/data:/var/opt/gitlab \ # 挂载数据目录
beginor/gitlab-ce
4. 修改 GitLab 配置文件
bash
运行
# 1. 修改外部访问地址(GitLab网页访问地址)
sed -i "/external_url 'GENERATED_EXTERNAL_URL'/a external_url\t'http://192.168.10.80' " /data/gitlab/etc/gitlab.rb
# 2. 修改SSH主机地址(代码拉取的SSH地址)
sed -i "/gitlab_ssh_host/a gitlab_rails['gitlab_ssh_host']= '192.168.10.80' " /data/gitlab/etc/gitlab.rb
# 3. 修改SSH端口(与容器映射的222端口对应)
sed -i "/gitlab_shell_ssh_port/a gitlab_rails['gitlab_shell_ssh_port'] = 222" /data/gitlab/etc/gitlab.rb
# 重启GitLab使配置生效
docker restart gitlab
5. 初始化 GitLab 管理员密码
# 进入GitLab容器
docker exec -it gitlab /bin/bash
# 重置root密码(执行后输入新密码,示例:1qaz@WSX)
gitlab-rails console -e production
user = User.where(id: 1).first
user.password = '新密码'
user.save!
exit
6. 配置 SSH 密钥(实现免密拉取代码)
# 进入GitLab容器生成SSH密钥
docker exec -it gitlab /bin/sh
ssh-keygen # 一路回车默认生成(无密码)
cat ~/.ssh/id_rsa.pub # 查看公钥并复制
# 在GitLab网页配置:登录root账号 → 右上角头像 → Settings → SSH Keys → 粘贴公钥 → Add Key



7. 上传 Ruo-Yi 代码到 GitLab
# 1. 本地下载Ruo-Yi项目
git clone https://gitee.com/y_project/RuoYi-Vue.git
# 2. 进入项目目录
cd RuoYi-Vue
# 3. 初始化本地仓库
git init
# 4. 关联GitLab远程仓库(在GitLab创建ruoyi-server项目后获取地址)
git remote add origin http://192.168.10.80/root/ruoyi-server.git
# 5. 提交代码并推送到远程
git add .
git commit -m "Initial commit"
git push -u origin master




三、Jenkins 部署与配置(192.168.10.13 执行)
1. 准备环境依赖包
bash
运行
# 创建工作目录
mkdir -p /data/jenkins && cd /data/jenkins
# 下载JDK、Maven、Node(通过FTP上传到该目录,或使用wget)
# JDK:jdk-8u421-linux-x64.tar.gz
# Maven:apache-maven-3.9.9-bin.tar.gz
# Node:node-v11.0.0-linux-x64.tar.gz
# 创建Maven配置文件(解决HTTPS仓库访问问题)
cat > settings.xml <<-'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd">
</settings>
EOF
2. 构建自定义 Jenkins 镜像(集成 JDK、Maven、Node)
bash
运行
# 创建Dockerfile
cat > Dockerfile <<-'EOF'
FROM jenkins/jenkins:2.480-jdk21 # 基础镜像
EXPOSE 8080 # 暴露Jenkins端口
# 添加依赖包到容器(自动解压)
ADD apache-maven-3.9.9-bin.tar.gz /usr/local
ADD jdk-8u421-linux-x64.tar.gz /usr/local
ADD node-v11.0.0-linux-x64.tar.gz /usr/local
# 覆盖Maven配置文件
ADD settings.xml /usr/local/apache-maven-3.9.9/conf/
# 配置环境变量
ENV TZ=Asia/Shanghai # 时区
ENV M2_HOME=/usr/local/apache-maven-3.9.9
ENV NODE_HOME=/usr/local/node-v11.0.0-linux-x64
ENV PATH=$M2_HOME/bin:$NODE_HOME/bin:$PATH # 加入环境变量
EOF
# 构建镜像
docker build -t jenkins .
# 授权Docker套接字(允许Jenkins容器内调用主机Docker)
chmod +777 /var/run/docker.sock
3. 启动 Jenkins 容器
bash
运行
docker run -d --name jenkins \
-p 0.0.0.0:8080:8080 \ # 映射Jenkins端口
-v /data/jenkins/jenkins_home:/var/jenkins_home \ # 持久化Jenkins数据
-v /etc/localtime:/etc/localtime \ # 同步时区
-v /run/docker.sock:/run/docker.sock \ # 挂载Docker套接字
-v /usr/bin/docker:/usr/bin/docker \ # 挂载Docker命令
jenkins # 使用自定义镜像
4. 初始化 Jenkins
bash
运行
# 获取初始管理员密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
# 访问Jenkins:http://192.168.10.13:8080 → 输入密码 → 安装推荐插件 → 创建管理员账号(admin/123456)
# 配置JDK环境(Jenkins网页操作):
# 系统管理 → 全局工具配置 → JDK → 取消"自动安装" → 名称填jdk8 → 目录填/usr/local/jdk1.8.0_421(根据实际解压目录)
5. 测试 Jenkins 环境
bash
运行
# 新建测试流水线项目(test),配置如下流水线脚本:
pipeline {
agent any
tools { jdk 'jdk8' } # 关联配置的JDK
stages {
stage('test') {
steps {
script {
sh """
docker -v # 验证Docker
java -version # 验证JDK
mvn -v # 验证Maven
node -v # 验证Node
npm -v # 验证NPM
"""
}
}
}
}
}
# 点击"立即构建",查看控制台输出是否正常(无报错则环境配置成功)
四、MySQL 部署(192.168.10.13 执行)
bash
运行
# 启动MySQL容器
docker run -d \
--name mysql \
-p 0.0.0.0:3306:3306 \ # 映射MySQL端口
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置root密码
--restart=always \ # 开机自启
mysql:8.0.39 # 镜像版本
# 进入容器并创建数据库
docker exec -it mysql mysql -uroot -p123456
create database `ry-vue` character set utf8mb4; # 创建若依数据库
use ry-vue;
source /opt/ry_20250522.sql; # 导入基础数据(需先将SQL文件复制到容器内/opt目录)
source /opt/quartz.sql; # 导入定时任务数据
exit
五、Redis 部署(192.168.10.13 执行)
bash
运行
# 启动Redis容器
docker run -d \
--name redis \
-p 0.0.0.0:6379:6379 \ # 映射Redis端口
--restart=always \ # 开机自启
redis:7.4.1 # 镜像版本
# 验证Redis连接
docker exec -it redis redis-cli
ping # 返回PONG则正常
exit
六、Jenkins 实现 CICD(前后端)
1. 安装 GitLab 插件
bash
运行
# Jenkins网页操作:
# 系统管理 → 插件管理 → 可选插件 → 搜索"GitLab" → 安装 → 无需重启
2. 后端(ruoyi-server)CI/CD 配置
(1)修改项目配置文件
bash
运行
# 1. 修改数据库连接(ruoyi-admin/src/main/resources/application-druid.yml)
spring:
datasource:
druid:
master:
url: jdbc:mysql://192.168.10.13:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
# 2. 修改Redis连接(ruoyi-admin/src/main/resources/application.yml)
spring:
redis:
host: 192.168.10.13
port: 6379
password: # 无密码留空
# 3. 提交修改到GitLab
git add .
git commit -m "修改数据库和Redis配置"
git push origin master
(2)添加 Docker 相关文件
在项目根目录创建以下文件:
-
Dockerfile(构建后端镜像)
dockerfile
FROM openjdk:8u342 # 基础JDK镜像 ENV TZ=Asia/Shanghai # 时区 ADD ruoyi-admin/target/ruoyi-admin.jar app.jar # 复制打包后的jar包 ENTRYPOINT ["java", "-jar", "app.jar"] # 启动命令 -
.dockerignore(加速构建)
plaintext
.git ruoyi-admin/src ruoyi-admin/target/classes ruoyi-common ruoyi-ui # 排除前端目录 -
Jenkinsfile(流水线脚本)
groovy
pipeline { agent any tools { jdk 'jdk8' } environment { APP_NAME = 'ruoyi-server' # 项目名称 APP_PORT = 9800 # 后端端口 } stages { stage('build') { # 构建阶段 steps { sh 'mvn clean package -DskipTests=true' # Maven打包(跳过测试) } } stage('deploy') { # 部署阶段 steps { sh """ docker stop $APP_NAME || true # 停止现有容器(不存在则忽略错误) docker rm $APP_NAME || true # 删除现有容器 docker rmi $APP_NAME || true # 删除现有镜像 docker build -t $APP_NAME . # 构建新镜像 docker run -d --name $APP_NAME \ -p 0.0.0.0:$APP_PORT:$APP_PORT \ --restart=always \ $APP_NAME \ --server.port=$APP_PORT """ } } } }
(3)配置 Jenkins 任务
- 新建流水线项目(ruoyi-server)
- 流水线 → 定义 → 选择 "来自 SCM" → SCM 选择 "Git"
- 仓库 URL:
ssh://git@192.168.10.80:222/root/ruoyi-server.git - 凭证配置:在 Jenkins 容器生成 SSH 密钥并添加到 GitLab(参考 GitLab SSH 配置步骤)
- 构建触发器:勾选 "GitLab CI Service URL" → 生成 Secret token
- 在 GitLab 项目 → Settings → Webhooks → 添加 URL(
http://192.168.10.13:8080/project/ruoyi-server)和 Secret token
3. 前端(ruoyi-ui)CI/CD 配置
(1)添加 Docker 相关文件
在 ruoyi-ui 目录创建以下文件:
-
nginx.conf(Nginx 配置)
nginx
server { listen 9801; # 前端端口 charset utf-8; location / { root /usr/share/nginx/html; # 前端静态文件目录 try_files $uri $uri/ /index.html; # 支持SPA路由 } location /prod-api { # 后端接口代理 rewrite ^/prod-api/(.*)$ /$1 break; proxy_pass http://192.168.10.13:9800; # 后端服务地址 } } -
Dockerfile(构建前端镜像)
dockerfile
FROM nginx:1.26.2 # 基础Nginx镜像 ENV LC_ALL=C.UTF-8 # 解决中文乱码 RUN rm -rf /etc/nginx/conf.d/default.conf # 删除默认配置 ADD nginx.conf /etc/nginx/conf.d # 添加自定义配置 COPY dist/ /usr/share/nginx/html/ # 复制打包后的静态文件 -
.dockerignore
plaintext
node_modules src -
Jenkinsfile(流水线脚本)
groovy
pipeline { agent any environment { APP_NAME = 'ruoyi-ui' APP_PORT = 9801 } stages { stage('build') { steps { sh """ npm install # 安装依赖 npm run build:prod # 生产环境打包 """ } } stage('deploy') { steps { sh """ docker stop $APP_NAME || true docker rm $APP_NAME || true docker rmi $APP_NAME || true docker build -t $APP_NAME . docker run -d --name $APP_NAME \ -p 0.0.0.0:$APP_PORT:$APP_PORT \ --restart=always \ $APP_NAME """ } } } }
(2)配置 Jenkins 任务
- 新建流水线项目(ruoyi-ui)
- 仓库 URL:
ssh://git@192.168.10.80:222/root/ruoyi-ui.git(需先在 GitLab 创建 ruoyi-ui 项目) - 其他配置同后端(凭证、Webhook 触发器)
七、验证部署结果
- 后端访问:
http://192.168.10.13:9800(返回 JSON 表示正常) - 前端访问:
http://192.168.10.13:9801(显示登录页面) - 测试自动部署:修改代码并推送到 GitLab,观察 Jenkins 是否自动构建部署
注意事项
- 防火墙需开放端口:80(GitLab)、8080(Jenkins)、3306(MySQL)、6379(Redis)、9800(后端)、9801(前端)
- 首次构建可能因依赖下载慢导致超时,可手动在 Jenkins 容器内提前下载依赖
- 若数据库连接失败,检查 MySQL 容器是否启动、密码是否正确、网络是否互通

