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 容器是否启动、密码是否正确、网络是否互通
相关推荐
芥子沫21 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理
ba_pi21 小时前
每天写点什么2026-01-19-docker如何使用GPU
运维·docker·容器
Gold Steps.21 小时前
K8S基于 Argo Rollouts 的高级版本发布实践
云原生·容器·kubernetes
七七powerful21 小时前
docker 部署dirsearch并进行目录遍历扫描
运维·docker·容器
王九思1 天前
Docker访问权限问题
docker·云原生·容器
孤岛悬城1 天前
61 K8s之Pod控制器与配置资源管理
云原生·容器·kubernetes
噎住佩奇1 天前
kubeadm方式部署单节点k8s
云原生·容器·kubernetes
十月南城1 天前
Kubernetes入门地图——核心对象、网络与存储的抽象关系与心智模型
网络·容器·kubernetes
Java程序员威哥1 天前
Java应用容器化最佳实践:Docker镜像构建+K8s滚动更新(生产级完整模板+避坑指南)
java·开发语言·后端·python·docker·kubernetes·c#
不做码农好多年,该何去何从。1 天前
云原生k8s(一)
云原生·容器·kubernetes