Ruo-Yi 项目 CICD 完整部署文档(含命令详解)

一、环境准备

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 任务
  1. 新建流水线项目(ruoyi-server)
  2. 流水线 → 定义 → 选择 "来自 SCM" → SCM 选择 "Git"
  3. 仓库 URL:ssh://git@192.168.10.80:222/root/ruoyi-server.git
  4. 凭证配置:在 Jenkins 容器生成 SSH 密钥并添加到 GitLab(参考 GitLab SSH 配置步骤)
  5. 构建触发器:勾选 "GitLab CI Service URL" → 生成 Secret token
  6. 在 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 任务
  1. 新建流水线项目(ruoyi-ui)
  2. 仓库 URL:ssh://git@192.168.10.80:222/root/ruoyi-ui.git(需先在 GitLab 创建 ruoyi-ui 项目)
  3. 其他配置同后端(凭证、Webhook 触发器)

七、验证部署结果

  1. 后端访问:http://192.168.10.13:9800(返回 JSON 表示正常)
  2. 前端访问:http://192.168.10.13:9801(显示登录页面)
  3. 测试自动部署:修改代码并推送到 GitLab,观察 Jenkins 是否自动构建部署

注意事项

  1. 防火墙需开放端口:80(GitLab)、8080(Jenkins)、3306(MySQL)、6379(Redis)、9800(后端)、9801(前端)
  2. 首次构建可能因依赖下载慢导致超时,可手动在 Jenkins 容器内提前下载依赖
  3. 若数据库连接失败,检查 MySQL 容器是否启动、密码是否正确、网络是否互通
相关推荐
lpruoyu11 小时前
【Docker进阶-03】存储原理
docker·容器
池央12 小时前
CANN oam-tools 诊断体系深度解析:自动化信息采集、AI Core 异常解析与 CI/CD 流水线集成策略
人工智能·ci/cd·自动化
文静小土豆12 小时前
Docker 与 containerd 代理配置详解:镜像拉取速度慢的终极解决方案
运维·docker·容器
JY.yuyu13 小时前
Docker常用命令——数据卷管理 / 端口映射 / 容器互联
运维·docker·容器
lpruoyu14 小时前
【Docker进阶-06】docker-compose & docker swarm
运维·docker·容器
虾说羊15 小时前
docker容器化部署项目流程
运维·docker·容器
骇客野人16 小时前
通过脚本推送Docker镜像
java·docker·容器
liux352816 小时前
基于kubeadm部署Kubernetes 1.26.4 集群指南
云原生·容器·kubernetes
Zfox_17 小时前
CANN GE 深度解析:图编译器与执行引擎的后端优化策略、OM 文件结构与 Stream 调度机制
容器·节点小宝
池央19 小时前
CANN GE 深度解析:图编译器的核心优化策略、执行流调度与模型下沉技术原理
人工智能·ci/cd·自动化