一、环境准备
1. 服务器角色分配
| 服务器 IP | 角色 | 部署组件 |
|---|---|---|
| 192.168.10.101 | K8S-master | K8S、GitLab、Jenkins、Docker |
| 192.168.10.66 | Harbor 仓库 | Harbor、Docker |
| 192.168.10.65 | K8S-worker01 | K8S、Docker |
2. 安装基础依赖(所有节点执行)
-
关闭防火墙与 SELinux bash
运行
systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config -
安装 Docker(版本 20.10.18)
-
配置清华 yum 源 bash
运行
cat > /etc/yum.repos.d/docker-ce.repo << EOF [docker-ce-stable] name=Docker CE Stable - \$basearch baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/\$releasever/\$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg EOF -
安装指定版本 Docker bash
运行
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 systemctl start docker && systemctl enable docker
-
-
配置 Docker Daemon(所有节点)
-
编辑
/etc/docker/daemon.json,添加 Harbor 私有仓库地址json
{ "registry-mirrors": ["https://0f8a3388042b4b0ab6611ccc6e866ab3.mirror.swr.myhuaweicloud.com"], "insecure-registries": ["192.168.10.66"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "500m", "max-file": "3" } } -
重启 Docker 生效 bash
运行
systemctl daemon-reload && systemctl restart docker
-
3. 搭建 K8S 集群(192.168.10.101 和 192.168.10.65)
-
安装 kubeadm、kubelet、kubectl(版本 1.20~1.33) bash
运行
cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0 systemctl enable kubelet -
初始化 K8S Master 节点(192.168.10.101) bash
运行
kubeadm init --apiserver-advertise-address=192.168.10.101 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.25.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 -
配置 kubectl 权限 bash
运行
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config -
安装网络插件(flannel) bash
运行
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml -
Worker 节点加入集群(192.168.10.65)
-
复制 Master 初始化完成后输出的
kubeadm join命令执行,示例:bash
运行
kubeadm join 192.168.10.101:6443 --token xxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxx
-
二、部署 GitLab(192.168.10.101)
1. 拉取 GitLab 镜像
bash
运行
docker pull beginor/gitlab-ce
2. 创建数据卷挂载目录
bash
运行
mkdir -p /data/gitlab/etc /data/gitlab/log /data/gitlab/data
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 \
-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
4. 修改 GitLab 配置文件
-
停止容器 bash
运行
docker stop gitlab -
修改
/data/gitlab/etc/gitlab.rbbash
运行
# 设置外部访问地址 sed -i "/external_url 'GENERATED_EXTERNAL_URL'/a external_url\t'http://192.168.10.101' " /data/gitlab/etc/gitlab.rb # 设置SSH主机 sed -i "/gitlab_ssh_host/a gitlab_rails['gitlab_ssh_host'] = '192.168.10.101' " /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 -
启动容器并等待健康状态 bash
运行
docker start gitlab # 等待状态从starting变为healthy watch docker ps | grep gitlab
5. 初始化 GitLab 账户
-
访问
http://192.168.10.101,设置 root 密码 -
登录后创建 SSH 密钥 bash
运行
docker exec -it gitlab /bin/sh ssh-keygen -t rsa # 一路回车 cat ~/.ssh/id_rsa.pub # 复制公钥 -
在 GitLab UI 的用户设置→SSH 密钥中粘贴公钥保存
三、部署 Harbor(192.168.10.66)
1. 安装 Docker-Compose
bash
运行
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v # 验证安装
2. 下载并配置 Harbor
-
下载安装包 bash
运行
wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/ -
修改配置文件
/usr/local/harbor/harbor.cfgbash
运行
vim /usr/local/harbor/harbor.cfg # 修改以下参数 hostname = 192.168.10.66 harbor_admin_password = Harbor12345
3. 启动 Harbor
bash
运行
cd /usr/local/harbor
./prepare
./install.sh
4. 创建 RuoYi 项目仓库
-
访问
http://192.168.10.66,使用admin/Harbor12345登录 -
新建公开项目 ,名称为
ruoyi-vue -
测试登录 bash
运行
docker login -u admin -p Harbor12345 http://192.168.10.66
四、部署 Jenkins(192.168.10.101)
1. 准备 Jenkins 构建环境
-
创建工作目录 bash
运行
mkdir -p /data/jenkins && cd /data/jenkins -
下载依赖包(jdk8、maven3.9.9、node18.19.0) bash
运行
# 可通过官网下载后上传到该目录,文件清单: # jdk-8u431-linux-x64.tar.gz # apache-maven-3.9.9-bin.tar.gz # node-v18.19.0-linux-x64.tar.gz -
创建自定义
settings.xmlxml
<?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> -
编写
Dockerfiledockerfile
FROM jenkins/jenkins:2.507 EXPOSE 8080 ADD apache-maven-3.9.9-bin.tar.gz /usr/local ADD jdk-8u431-linux-x64.tar.gz /usr/local ADD node-v18.19.0-linux-x64.tar.gz /usr/local 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-v18.19.0-linux-x64 ENV PATH=$M2_HOME/bin:$NODE_HOME/bin:$PATH -
创建 jenkins_home 目录 bash
运行
mkdir jenkins_home && chmod 777 jenkins_home
2. 构建并启动 Jenkins 镜像
-
构建镜像 bash
运行
docker build -t jenkins . -
授权 docker.sock bash
运行
chmod 777 /var/run/docker.sock -
启动 Jenkins 容器 bash
运行
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
-
访问
http://192.168.10.101:8080,获取初始密码bash
运行
docker logs jenkins | grep initialAdminPassword -
安装推荐插件,创建管理员账户
-
配置 JDK 环境
- 进入Manage Jenkins→Tools→JDK
- 新增 JDK,名称填写
jdk8,路径填写/usr/local/jdk1.8.0_431 - 重启 Jenkins:
docker restart jenkins
-
测试流水线
-
新建流水线项目 ,脚本内容:
groovy
pipeline { agent any tools { jdk 'jdk8' } stages { stage('test') { steps { script { sh """ docker -v java -version mvn -v node -v """ } } } } } -
点击立即构建,查看日志验证环境
-
五、配置 Jenkins 与 GitLab/Harbor/K8S 联动
1. Jenkins 配置 SSH 免密登录(192.168.10.101)
-
进入 Jenkins 容器生成密钥 bash
运行
docker exec -it jenkins bash ssh-keygen -t rsa # 一路回车 ssh-copy-id root@192.168.10.101 # 输入master密码 -
K8S 创建 Harbor 镜像拉取密钥 bash
运行
kubectl -n default create secret docker-registry harbor-registry \ --docker-email=test@example.com \ --docker-username=admin \ --docker-password=Harbor12345 \ --docker-server=192.168.10.66
2. Jenkins 安装 GitLab 插件
- 进入Manage Jenkins→插件管理→可选插件
- 搜索
GitLab,安装GitLab Plugin 和GitLab Authentication Plugin - 重启 Jenkins 生效
六、部署 RuoYi-Vue 项目
1. 准备数据库和 Redis(192.168.10.101)
-
启动 MySQL 容器 bash
运行
docker run -d \ --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ --restart=always \ mysql:8.0.39 -
启动 Redis 容器 bash
运行
docker run -d \ --name redis \ -p 6379:6379 \ --restart=always \ redis:7.4.1 -
导入 RuoYi 数据库脚本
-
克隆 RuoYi 代码 bash
运行
cd /data/jenkins yum install -y git git clone https://gitee.com/y_project/RuoYi-Vue.git mv RuoYi-Vue/ruoyi-ui ./ # 分离前后端 -
复制 SQL 文件到 MySQL 容器 bash
运行
cd RuoYi-Vue docker cp sql/quartz.sql mysql:/opt docker cp sql/ry_20250522.sql mysql:/opt -
进入 MySQL 创建数据库并导入数据 bash
运行
docker exec -it mysql bash mysql -uroot -p123456 create database `ry-vue`; use ry-vue; source /opt/quartz.sql; source /opt/ry_20250522.sql;
-
-
修改 RuoYi 配置文件
-
编辑
ruoyi-admin/src/main/resources/application-druid.ymlyaml
spring: datasource: druid: master: url: jdbc:mysql://192.168.10.101:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 -
编辑
application.ymlyaml
spring: redis: host: 192.168.10.101 port: 6379 database: 0
-
2. 编写 RuoYi 后端构建文件(/data/jenkins/RuoYi-Vue)
-
创建
Dockerfiledockerfile
FROM openjdk:8u342 ENV TZ=Asia/Shanghai ADD ruoyi-admin/target/ruoyi-admin.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"] -
创建
Jenkinsfilegroovy
pipeline { agent any tools { jdk 'jdk8' } environment { APP_NAME = 'ruoyi-server' APP_PORT = 9800 DOCKER_USER = 'admin' DOCKER_PASS = 'Harbor12345' HARBOR_ADDR = '192.168.10.66' K8S_MASTER = '192.168.10.101' } stages { stage('build') { steps { script { sh 'mvn clean package -DskipTests=true' } } } stage('deploy') { steps { script { sh """ docker rmi \${APP_NAME} || true docker rmi \${HARBOR_ADDR}/ruoyi-vue/\${APP_NAME} || true docker build -t \${APP_NAME} . docker tag \${APP_NAME} \${HARBOR_ADDR}/ruoyi-vue/\${APP_NAME} docker login -u \${DOCKER_USER} -p \${DOCKER_PASS} \${HARBOR_ADDR} docker push \${HARBOR_ADDR}/ruoyi-vue/\${APP_NAME} scp ruoyi-vue.yaml root@\${K8S_MASTER}:/ ssh root@\${K8S_MASTER} 'kubectl delete -f /ruoyi-vue.yaml || true' ssh root@\${K8S_MASTER} 'kubectl apply -f /ruoyi-vue.yaml' """ } } } } } -
创建
ruoyi-vue.yamlyaml
apiVersion: apps/v1 kind: Deployment metadata: name: ruoyi-vue labels: app: ruoyi-vue spec: replicas: 1 selector: matchLabels: app: ruoyi-vue template: metadata: labels: app: ruoyi-vue spec: imagePullSecrets: - name: harbor-registry containers: - name: ruoyi-vue image: 192.168.10.66/ruoyi-vue/ruoyi-server:latest ports: - containerPort: 8080 imagePullPolicy: IfNotPresent --- apiVersion: v1 kind: Service metadata: name: ruoyi-vue labels: app: ruoyi-vue spec: ports: - name: http port: 8080 nodePort: 30001 type: NodePort selector: app: ruoyi-vue
3. 上传代码到 GitLab
-
GitLab 创建项目
- 登录 GitLab
http://192.168.10.101,创建群组 ruo-yi 和项目 ruoyi-vue - 添加用户
zhangsan,赋予主程序员权限
- 登录 GitLab
-
本地配置 Git 并推送代码 bash
运行
cd /data/jenkins/RuoYi-Vue git config --global user.name "zhangsan" git config --global user.email "zhangsan@gitlab.com" ssh-keygen -t rsa # 生成密钥并添加到GitLab git remote add origin ssh://git@192.168.10.101:222/ruo-yi/ruoyi-vue.git git add . git commit -m "init ruoyi-vue" git push -u origin master
4. Jenkins 配置流水线拉取 GitLab 代码
- 新建 Jenkins 流水线项目
ruoyi-server - 选择Pipeline script from SCM ,SCM 选择Git
- Repository URL 填写 GitLab 项目 SSH 地址:
ssh://git@192.168.10.101:222/ruo-yi/ruoyi-vue.git - 配置 Credentials:添加 SSH 私钥(Jenkins 容器内的
~/.ssh/id_rsa) - 脚本路径填写
Jenkinsfile - 配置 GitLab WebHook 触发构建
- 进入 GitLab 项目设置→集成
- URL 填写:
http://192.168.10.101:8080/project/ruoyi-server - 勾选推送事件,保存并测试
5. 执行构建并验证
-
点击 Jenkins 项目立即构建
-
查看构建日志,确认镜像推送和 K8S 部署成功
-
验证 K8S Pod 状态 bash
运行
kubectl get pods kubectl get svc # 查看NodePort端口30001 -
访问 RuoYi 后端接口:
http://192.168.10.65:30001
七、常见问题排查
- Docker 拉取镜像失败:检查
daemon.json的insecure-registries配置 - Jenkins 构建权限不足:检查
docker.sock权限和 SSH 免密配置 - K8S Pod 启动失败:查看日志
kubectl logs <pod-name>,检查镜像地址和 Secret - GitLab WebHook 触发失败:检查 Jenkins URL 可达性,GitLab 网络设置允许本地请求
要不要我帮你整理一份部署命令一键执行脚本,可以直接在服务器上批量运行?
CI CD 持续集成Ruo-Yi项目(上).pdf 和其他 1 文件
还需要包含ruoyi前端的部署
Ruo-Yi 项目 CI/CD 详细部署文档(含前后端)
适配环境:master(192.168.10.101)、harbor(192.168.10.66)、worker01(192.168.10.65)
一、前置说明
本文档基于已完成的后端部署流程 ,新增前端(ruoyi-ui) 自动化部署步骤,包含前端代码构建、镜像制作、K8S 发布及 Jenkins 流水线配置。
二、前端部署准备
1. 环境依赖确认
Jenkins 容器已集成node-v18.19.0(后端部署时已配置),无需额外安装。
2. 前端代码位置
后端克隆代码时已将ruoyi-ui目录移至/data/jenkins下,路径为:
bash
运行
/data/jenkins/ruoyi-ui
3. 修改前端配置文件
编辑ruoyi-ui/.env.production,修改后端接口地址为 K8S NodePort 暴露的地址:
javascript
运行
# 后端接口地址
VUE_APP_BASE_API = 'http://192.168.10.65:30001'
注:192.168.10.65 为 worker01 节点 IP,30001 为后端 Service 的 NodePort 端口
三、编写前端构建与部署文件
在/data/jenkins/ruoyi-ui目录下创建 3 个核心文件:Dockerfile、Jenkinsfile、ruoyi-ui.yaml
1. 创建前端 Dockerfile
dockerfile
# 构建阶段
FROM node:18.19.0-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npm.taobao.org
COPY . .
RUN npm run build:prod
# 运行阶段
FROM nginx:alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2. 创建 Nginx 配置文件
在/data/jenkins/ruoyi-ui下新建nginx.conf,解决跨域问题:
nginx
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
# 解决Vue路由刷新404问题
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理后端接口(可选,也可前端直接请求NodePort)
location /prod-api/ {
proxy_pass http://192.168.10.65:30001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
3. 创建前端 Jenkinsfile
groovy
pipeline {
agent any
tools {
jdk 'jdk8'
}
environment {
APP_NAME = 'ruoyi-ui'
DOCKER_USER = 'admin'
DOCKER_PASS = 'Harbor12345'
HARBOR_ADDR = '192.168.10.66'
K8S_MASTER = '192.168.10.101'
}
stages {
# 前端打包
stage('build') {
steps {
script {
sh """
cd /data/jenkins/ruoyi-ui
npm install --registry=https://registry.npm.taobao.org
npm run build:prod
"""
}
}
}
# 制作镜像并推送Harbor
stage('build-image') {
steps {
script {
sh """
cd /data/jenkins/ruoyi-ui
docker rmi \${APP_NAME} || true
docker rmi \${HARBOR_ADDR}/ruoyi-vue/\${APP_NAME} || true
docker build -t \${APP_NAME} .
docker tag \${APP_NAME} \${HARBOR_ADDR}/ruoyi-vue/\${APP_NAME}
docker login -u \${DOCKER_USER} -p \${DOCKER_PASS} \${HARBOR_ADDR}
docker push \${HARBOR_ADDR}/ruoyi-vue/\${APP_NAME}
"""
}
}
}
# 部署到K8S
stage('deploy-k8s') {
steps {
script {
sh """
cd /data/jenkins/ruoyi-ui
scp ruoyi-ui.yaml root@\${K8S_MASTER}:/
ssh root@\${K8S_MASTER} 'kubectl delete -f /ruoyi-ui.yaml || true'
ssh root@\${K8S_MASTER} 'kubectl apply -f /ruoyi-ui.yaml'
"""
}
}
}
}
}
4. 创建前端 K8S 部署文件(ruoyi-ui.yaml)
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-ui
labels:
app: ruoyi-ui
spec:
replicas: 1
selector:
matchLabels:
app: ruoyi-ui
template:
metadata:
labels:
app: ruoyi-ui
spec:
imagePullSecrets:
- name: harbor-registry
containers:
- name: ruoyi-ui
image: 192.168.10.66/ruoyi-vue/ruoyi-ui:latest
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: ruoyi-ui
labels:
app: ruoyi-ui
spec:
ports:
- name: http
port: 80
nodePort: 30002
type: NodePort
selector:
app: ruoyi-ui
注:NodePort 端口 30002 可根据实际情况调整,避免与后端端口冲突
四、GitLab 前端代码仓库配置
1. 在 GitLab 创建前端项目
- 登录 GitLab(
http://192.168.10.101),进入ruo-yi群组 - 点击新建项目 ,项目名称填写
ruoyi-ui,可见等级设为公开 - 添加
zhangsan用户为主程序员
2. 推送前端代码到 GitLab
bash
运行
cd /data/jenkins/ruoyi-ui
# 配置Git用户信息
git config --global user.name "zhangsan"
git config --global user.email "zhangsan@gitlab.com"
# 关联GitLab仓库
git init
git remote add origin ssh://git@192.168.10.101:222/ruo-yi/ruoyi-ui.git
# 提交代码
git add .
git commit -m "init ruoyi-ui"
git push -u origin master
五、Jenkins 前端流水线配置
1. 新建前端流水线任务
- 登录 Jenkins(
http://192.168.10.101:8080),点击新建任务 - 任务名称填写
ruoyi-ui,选择流水线 ,点击确定
2. 配置流水线来源
-
在Pipeline 部分选择 Pipeline script from SCM ,SCM 选择Git
-
Repository URL 填写前端 GitLab 仓库地址:
plaintext
ssh://git@192.168.10.101:222/ruo-yi/ruoyi-ui.git -
Credentials选择之前配置的 SSH 私钥(Jenkins 连接 GitLab 的密钥)
-
Script Path 填写
Jenkinsfile
3. 配置 GitLab WebHook 触发
- 在构建触发器 部分勾选 Build when a change is pushed to GitLab
- 复制生成的 WebHook URL:
http://192.168.10.101:8080/project/ruoyi-ui - 登录 GitLab,进入
ruoyi-ui项目→设置→集成 - 粘贴 WebHook URL,勾选推送事件 ,点击添加 WebHook
六、执行前端构建与部署
-
在 Jenkins 中进入
ruoyi-ui项目,点击立即构建 -
查看构建日志,确认步骤执行成功
-
验证 K8S 部署状态: bash
运行
# 在master节点执行 kubectl get pods | grep ruoyi-ui kubectl get svc | grep ruoyi-ui -
访问前端页面验证: plaintext
http://192.168.10.65:30002输入默认账号密码
admin/admin123,能正常登录则部署成功
七、前后端联动验证
- 前端页面登录后,检查菜单、用户管理等功能是否正常
- 验证接口调用:新增用户或角色,确认后端数据同步更新
八、常见问题排查
- 前端打包失败:检查 node 版本是否为 18.19.0,或切换 npm 镜像源
- 镜像推送失败 :检查 Harbor 仓库是否创建
ruoyi-vue项目,或 Docker 登录凭证是否正确 - 前端访问后端接口 404 :检查
VUE_APP_BASE_API配置是否正确,或 K8S Service 端口是否暴露