基于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项目从代码提交到自动部署的全流程自动化,极大地提高了开发效率和部署一致性,为团队协作和持续交付奠定了坚实基础。

相关推荐
骥龙3 小时前
第四篇:融合篇——架构的涌现效应:1+1>2
运维·架构·云计算
翼龙云_cloud3 小时前
阿里云云渠道商:GPU 服务器安全组配置指南 3 步解决端口开放问题
运维·服务器·安全·阿里云·云计算
helloliyh4 小时前
腾讯云获取secretId和secretKey并开通人脸识别服务
云计算·腾讯云
2401_865854884 小时前
腾讯云音视频和其他平台对比有哪些优势
云计算·音视频·腾讯云
@HNUSTer19 小时前
基于 GEE 实现 ERA5-Land 年度数据单个年份单波段下载——以土壤水分数据为例
云计算·数据集·遥感大数据·gee·云平台·era5-land·土壤水分
可爱又迷人的反派角色“yang”1 天前
GitLab配置与git集成实践
linux·网络·git·docker·云计算·gitlab
风吹落叶花飘荡1 天前
2026 在阿里云(Aliyun)上实现 Certbot 自动化申请
阿里云·自动化·云计算
222you1 天前
智慧社区:调用腾讯云的人脸识别接口完成人脸采集的功能
云计算·github·腾讯云
冬天的风滚草1 天前
揭秘云原生混布资源调度器Koordinator (六)MetricCache 指标缓存机制
云计算