前言
在现代软件开发流程中,持续集成/持续部署(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
- 从Gitee克隆RuoYi-Vue项目:
git clone https://gitee.com/y_project/RuoYi-Vue.git - 在GitLab创建创建两个项目:
ruoyi-server(后端)和ruoyi-ui(前端) - 将代码分别推送至对应仓库:
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
- 获取初始密码:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword - 访问
http://192.168.10.13:8080,输入密码并安装推荐插件 - 配置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. 配置自动触发
- 在Jenkins项目中启用"Build when a change is pushed to GitLab"
- 生成Secret token并在GitLab项目的Webhooks中配置
- 配置触发URL:
http://192.168.10.13:8080/project/项目名称
六、验证部署结果
完成上述配置后,每次向GitLab推送代码时,Jenkins将自动触发构建流程:
- 后端服务构建完成后,可访问
http://192.168.10.13:9800验证API是否可用 - 前端服务构建完成后,通过
http://192.168.10.13:9801访问前端页面 - 使用默认账号密码(admin/123456)登录系统,验证整体功能
总结
通过这套CICD流程,我们实现了RuoYi-Vue项目从代码提交到自动部署的全流程自动化,极大地提高了开发效率和部署一致性,为团队协作和持续交付奠定了坚实基础。