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 容器是否启动、密码是否正确、网络是否互通
相关推荐
小p1 天前
docker学习7:docker 容器的通信方式
docker
小p1 天前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p1 天前
docker学习3:docker是怎么实现的?
docker
小p3 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p3 天前
docker学习: 1. docker基本使用
docker
崔小汤呀4 天前
Docker部署Nacos
docker·容器
缓解AI焦虑4 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter4 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
BugShare4 天前
继《小爱音响》详细说下怎么部署,尤其是关于Docker部分
docker·nas·xiaomusic