基于Docker与Jenkins实现RuoYi-Vue项目的CICD持续集成部署

前言

在现代软件开发流程中,持续集成/持续部署(CICD)已经成为提升开发效率、保障代码质量的关键实践。本文将详细介绍如何利用Docker容器化技术结合Jenkins,搭建一套完整的CICD流程,实现RuoYi-Vue前后端分离项目的自动化构建、测试和部署。

一、环境准备与架构设计

1. 主机环境规划

本次部署采用两台服务器(虚拟机)搭建CICD环境,具体配置如下:

主机IP 部署服务清单 配置要求
192.168.10.13 Jenkins、Redis、MySQL、Spring Boot服务、Nginx 至少2核8G内存
192.168.10.80 Docker、GitLab 1核4G内存

2. 核心技术栈

  • 版本控制:GitLab - 用于代码仓库管理
  • 持续集成:Jenkins - 实现自动化构建与部署
  • 容器化:Docker - 统一应用运行环境
  • 数据库:MySQL 8.0 - 存储应用数据
  • 缓存:Redis 7.4 - 提升应用性能
  • Web服务器:Nginx - 部署前端应用并反向代理

3. Docker环境安装

所有服务器需先安装Docker环境,步骤如下:

bash 复制代码
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装指定版本Docker并设置开机自启
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io   
systemctl start docker.service
systemctl enable docker.service

# 配置华为镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com" ]
}
EOF
systemctl daemon-reload
systemctl restart docker

二、GitLab部署与代码管理

1. GitLab容器部署

bash 复制代码
# 拉取GitLab镜像
docker pull beginor/gitlab-ce

# 创建数据卷目录并授权
mkdir -p /data/gitlab/etc/ /data/gitlab/log/ /data/gitlab/data
chmod 777 /data/gitlab/etc/ /data/gitlab/log/ /data/gitlab/data/

# 启动GitLab容器
docker run -itd --name=gitlab \
--restart=always \
--privileged=true \
-p 8443:443 \
-p 80:80 \
-p 222:22 \
-v /data/gitlab/etc:/etc/gitlab \
-v /data/gitlab/log:/var/log/gitlab \
-v /data/gitlab/data:/var/opt/gitlab \
beginor/gitlab-ce

2. GitLab配置修改

bash 复制代码
# 修改修改外部访问地址
sed -i "/external_url 'GENERATED_EXTERNAL_URL'/a external_url\t'http://192.168.10.80' " /data/gitlab/etc/gitlab.rb

# 修改SSH主机地址
sed -i "/gitlab_ssh_host/a gitlab_rails['gitlab_ssh_host']= '192.168.10.80' " /data/gitlab/etc/gitlab.rb

# 修改SSH端口
sed -i "/gitlab_shell_ssh_port/a gitlab_rails['gitlab_shell_ssh_port'] = 222" /data/gitlab/etc/gitlab.rb

# 重启GitLab
docker restart gitlab

3. 代码上传至GitLab

  1. 从Gitee克隆RuoYi-Vue项目:git clone https://gitee.com/y_project/RuoYi-Vue.git
  2. 在GitLab创建创建两个项目:ruoyi-server(后端)和ruoyi-ui(前端)
  3. 将代码分别推送至对应仓库:
bash 复制代码
# 初始化本地仓库
git init

# 关联远程仓库
git remote add origin http://192.168.10.80/root/ruoyi-server.git

# 提交并推送代码
git add .
git commit -m "Initial commit"
git push -u origin master

三、Jenkins部署与配置

1. 定制Jenkins镜像

为满足RuoYi项目构建需求,我们需要定制包含JDK、Maven和Node.js的Jenkins镜像:

dockerfile 复制代码
FROM jenkins/jenkins:2.480-jdk21
EXPOSE 8080
 
# 添加依赖工具
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

构建镜像:docker build -t jenkins .

2. 启动Jenkins容器

bash 复制代码
# 创建数据目录
mkdir -p /data/jenkins/jenkins_home
chmod +777 /data/jenkins/jenkins_home

# 启动容器
docker run -d --name jenkins \
-p 0.0.0.0:8080:8080 \
-v /data/jenkins/jenkins_home:/var/jenkins_home \
-v /etc/localtime:/etc/localtime \
-v /run/docker.sock:/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
jenkins

3. 初始化Jenkins

  1. 获取初始密码:docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
  2. 访问http://192.168.10.13:8080,输入密码并安装推荐插件
  3. 配置JDK环境:进入"全局工具配置",设置JDK安装目录

四、基础服务部署

1. MySQL部署

bash 复制代码
docker run -d \
--name mysql \
-p 0.0.0.0:3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart=always \
mysql:8.0.39

# 导入初始化数据
docker exec -it mysql bash
mysql -uroot -p123456
create database ry-vue;
use ry-vue;
source /opt/ry_20250522.sql;
source /opt/quartz.sql;

2. Redis部署

bash 复制代码
docker run -d \
--name redis \
-p 0.0.0.0:6379:6379 \
--restart=always \
redis:7.4.1

五、CICD流水线配置

1. 后端服务流水线

① 项目配置修改

修改ruoyi-admin/src/main/resources/application-druid.yml中的数据库连接信息和Redis配置,确保指向正确的服务地址。

② 创建Dockerfile
dockerfile 复制代码
FROM openjdk:8u342
ENV TZ=Asia/Shanghai
ADD ruoyi-admin/target/ruoyi-admin.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
③ 创建Jenkinsfile
groovy 复制代码
pipeline {
    agent any
    tools {
        jdk 'jdk8'
    }
    environment {
        APP_NAME = 'ruoyi-server'
        APP_PORT = 9800
    }
    stages {
        stage('build') {
            steps {
                script {
                    sh 'mvn clean package -DskipTests=true'
                }
            }
        }
        stage('deploy') {
            steps {
                script {
                    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
                    """
                }
            }
        }
    }
}

2. 前端服务流水线

① 创建Nginx配置文件
nginx 复制代码
server {
    listen 9801;
    charset utf-8;
    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }
    location /prod-api {
        rewrite ^/prod-api/(.*)$ /$1 break;
        proxy_pass http://192.168.10.13:9800;
    }
}
② 创建Dockerfile
dockerfile 复制代码
FROM nginx:1.26.2
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/
③ 创建Jenkinsfile
groovy 复制代码
pipeline {
    agent any
    environment {
        APP_NAME = 'ruiyi-ui'
        APP_PORT = 9801
    }
    stages {
        stage('build') {
            steps {
                script {
                    sh """
                        npm install
                        npm run build:prod
                    """
                }
            }
        }
        stage('deploy') {
            steps {
                script {
                    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
                    """
                }
            }
        }
    }
}

3. 配置自动触发

  1. 在Jenkins项目中启用"Build when a change is pushed to GitLab"
  2. 生成Secret token并在GitLab项目的Webhooks中配置
  3. 配置触发URL:http://192.168.10.13:8080/project/项目名称

六、验证部署结果

完成上述配置后,每次向GitLab推送代码时,Jenkins将自动触发构建流程:

  1. 后端服务构建完成后,可访问http://192.168.10.13:9800验证API是否可用
  2. 前端服务构建完成后,通过http://192.168.10.13:9801访问前端页面
  3. 使用默认账号密码(admin/123456)登录系统,验证整体功能

总结

通过这套CICD流程,我们实现了RuoYi-Vue项目从代码提交到自动部署的全流程自动化,极大地提高了开发效率和部署一致性,为团队协作和持续交付奠定了坚实基础。

相关推荐
亿信华辰软件7 小时前
构建智慧数据中台,赋能饮料集团全链路数字化转型新引擎
大数据·人工智能·云计算
曹天骄11 小时前
Cloudflare Worker 关联域名访问后出现301 / 308
运维·云计算
一碗甜汤ᐝ13 小时前
腾讯云部署bisheng毕昇
语言模型·云计算·腾讯云
久绊A14 小时前
GPU 集群资源利用率过高?从异常 ECS 实例排查到清理全实操
云计算·云平台
翼龙云_cloud15 小时前
阿里云渠道商:弹性伸缩爬虫实战 智能应对流量高峰的 3 步方案
爬虫·阿里云·云计算
China_Yanhy16 小时前
AWS KMS 深度配置指南:原理、场景与选型策略
云计算·aws
翼龙云_cloud16 小时前
亚马逊云渠道商:如何在AWS控制台中创建每月成本预算?
服务器·云计算·aws
2401_8658548816 小时前
腾讯云云手机的质量如何
智能手机·云计算·腾讯云
Solar202517 小时前
机械制造企业数据采集系统选型指南:从技术挑战到架构实践
java·大数据·服务器·架构·云计算
进击切图仔2 天前
基于腾讯云服务构建 ros1 noetic 开发环境
云计算·腾讯云