提交 b263716f authored 作者: 陈泽健's avatar 陈泽健

feat(deploy): 拆分主脚本实现模块化文件操作功能

- 创建auto_file_upload_check.sh脚本,包含File_detection_java和check_files函数
- 添加check_files_upload主入口函数,负责初始化变量和调用文件检测部署流程
- 在new_auto.sh中导入auto_file_upload_check.sh并调用check_files_upload函数
- 实现环境变量传递server_ip参数和返回值处理机制
- 添加详细的日志记录和错误处理功能
- 创建需求文档和计划执行文档规范模块化拆分流程
上级 470c849b
# 主脚本模块化拆分文件部署
## 代码路径
- 需调用代码路径:[自动化部署脚本/x86架构/新统一平台/auto_file_upload_check.sh]
- 主脚本:[自动化部署脚本/x86架构/新统一平台/new_auto.sh]
## 功能需求
### 功能目标
**目标:** 当前主脚本代码量过于庞大,不利于维护,现需将主脚本中的check_files和File_detection_java函数独立出来,通过在主脚本中调用auto_file_upload_check.sh。
### 需求描述
#### 调用逻辑
- 调用方式:
- 在主脚本中source导入auto_file_upload_check.sh,然后调用check_files_upload函数
- 使用环境变量传递server_ip参数
```bash
# 在主脚本中导入文件检查脚本(已有source导入,无需重复)
# source "$SCRIPT_DIR/auto_file_upload_check.sh"
# 调用文件检查函数,server_ip由主脚本传入
check_files_upload
```
- 接收脚本执行的返回参数,并使用log函数打印日志
- 0:文件上传成功,使用`log "INFO"`打印日志
- 1:文件上传失败,使用`log "ERROR"`打印错误日志,使用`return 1`退出当前函数部署操作
- 执行时机:
- 在主脚本中add_user之后执行
#### 脚本设计要求
- 主入口函数:
-`auto_file_upload_check.sh`中增加主入口函数`check_files_upload()`
- 主入口函数负责:
- 解析`server_ip`环境变量
- 根据参数调用函数
- 返回部署结果
- log函数依赖:
- 脚本中的log函数与主脚本保持一致
- 在主脚本中先source导入`auto_file_upload_check.sh`,再调用`check_files_upload`函数
- 变量初始化:
- 在主入口函数中初始化以下变量:
- `sudoset`:sudo命令前缀(根据用户权限判断)
- `SUDO`:sudo命令(兼容不同函数中的变量名)
- `server_ip`:服务器IP地址(由主脚本传入)
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
\ No newline at end of file
# 主脚本模块化拆分文件操作计划执行文档
## 需求来源
- 需求文档:`Docs/PRD/自动化部署脚本/新统一平台/需求文档/_PRD_主脚本模块化拆分文件操作_需求文档.md`
---
## 实现计划
### 1. 代码结构设计
```bash
auto_file_upload_check.sh
├── File_detection_java() # 已有函数(检测部署文件是否完整)
├── check_files() # 已有函数(检查并部署data目录)
└── check_files_upload() # 新增主入口函数
├── 初始化变量(sudoset/SUDO/server_ip)
├── 调用File_detection_java()进行文件检测
├── 调用check_files()进行文件部署
└── 返回部署结果
```
### 2. 实现步骤
- [ ] 在auto_file_upload_check.sh末尾增加check_files_upload()主入口函数
- [ ] 实现变量初始化逻辑(sudoset/SUDO/server_ip)
- [ ] 实现函数调用逻辑(File_detection_java → check_files)
- [ ] 实现返回值处理和日志打印
- [ ] 在主脚本new_auto.sh中source导入auto_file_upload_check.sh
- [ ] 在主脚本add_user后调用check_files_upload函数
### 3. 技术要点
#### 3.1 变量初始化
```bash
# 初始化sudo相关变量
if [[ $(id -u) -ne 0 ]]; then
sudoset="sudo"
SUDO="sudo"
else
sudoset=""
SUDO=""
fi
# server_ip由主脚本传入
if [[ -z "$server_ip" ]]; then
log "WARN" "未传入服务器IP地址"
fi
```
#### 3.2 主入口函数逻辑
```bash
check_files_upload() {
log "INFO" "开始文件检查与部署流程"
# 1. 先检测部署文件是否完整
if ! File_detection_java; then
log "ERROR" "部署文件检测失败"
return 1
fi
# 2. 执行文件检查和部署
if ! check_files; then
log "ERROR" "文件部署失败"
return 1
fi
log "INFO" "文件检查与部署完成"
return 0
}
```
#### 3.3 主脚本调用方式
```bash
# 导入文件检查脚本
source "$SCRIPT_DIR/auto_file_upload_check.sh"
# 调用检查函数(server_ip由主脚本传入)
check_files_upload
```
### 4. 函数位置
- auto_file_upload_check.sh:在所有函数之后添加check_files_upload主入口
- new_auto.sh:在add_user之后添加调用
### 5. 返回值定义
| 返回值 | 含义 | 处理方式 |
|--------|------|----------|
| 0 | 文件检查和部署成功 | 继续执行 |
| 1 | 文件检查或部署失败 | log ERROR + return 1 |
### 6. 执行流程
```
add_user → check_files_upload → File_detection_java → check_files → 继续后续流程
```
---
## 代码修改
### 修改文件
1. `自动化部署脚本/x86架构/新统一平台/auto_file_upload_check.sh` - 添加主入口函数
2. `自动化部署脚本/x86架构/新统一平台/new_auto.sh` - 添加source导入和调用
---
## 测试计划
- [ ] 测试部署文件完整场景(跳过文件复制)
- [ ] 测试部署文件缺失场景(提示并退出)
- [ ] 测试data目录不存在场景(创建并复制文件)
- [ ] 测试data目录部分缺失场景(增量同步)
- [ ] 测试IP替换脚本执行
---
## 优化功能回填
> 本章节用于记录实现过程中发现的优化点和改进措施
| 日期 | 优化项 | 状态 | 备注 |
|------|--------|------|------|
| - | - | - | - |
#------------------------------服务器检测-end------------------------------------------------------------------------------------------------------------------------
#todo: 对文件的检测每次部署的时候根据功能,这里检测的文件是要不一样的,这个先记录,不着急实现
#------------------------------部署文件检测-start--------------------------------------------------------------------------------------------------------------------
#==============================================================#
# 函数名: File_detection_java
# 功能: 检测新统一平台系统所需部署目录是否完整存在
# 说明: 本函数用于在部署前校验关键服务目录是否存在
# 若任一目录缺失,将记录错误并终止脚本
# 支持未来根据不同部署模式动态调整检测列表
# 作者: [ubains]
# 日期: $(date +%Y-%m-%d)
#--------------------------------------------------------------#
# 参数: 无
# 返回: 0: 所有文件检测通过
# 1: 存在缺失文件,终止执行
#--------------------------------------------------------------#
# 日志级别:
# INFO: 正常流程
# ERROR: 错误信息
#==============================================================#
function File_detection_java() {
log "INFO" "=================================================================="
log "INFO" "开始检测新统一平台系统部署文件是否完整"
log "INFO" "=================================================================="
# 定义待检测的服务模块及其相对路径(可根据部署模式动态调整)
# 格式: "模块名称:路径"
local services=(
"预定系统-api/java-meeting2.0:/data/services/api/java-meeting/java-meeting2.0"
"预定系统-extapi:/data/services/api/java-meeting/java-meeting-extapi"
"消息调度:/data/services/api/java-meeting/java-message-scheduling"
"MQTT消息:/data/services/api/java-meeting/java-mqtt"
"Quartz定时任务:/data/services/api/java-meeting/java-quartz"
"运维集控服务:/data/services/api/python-cmdb"
"语音转录服务:/data/services/api/python-voice"
"SSO认证服务:/data/services/api/auth/auth-sso-auth"
"SSO网关服务:/data/services/api/auth/auth-sso-gatway"
"SSO系统管理:/data/services/api/auth/auth-sso-system"
"Dubbo-华为云:/data/services/api/dubbo/dubbo-cloudLink"
"Dubbo-钉钉:/data/services/api/dubbo/dubbo-dingding"
"Dubbo-会议控制:/data/services/api/dubbo/dubbo-meeting-control"
"Dubbo-宝利通:/data/services/api/dubbo/dubbo-polycom"
"Dubbo-服务调用:/data/services/api/dubbo/dubbo-serviceCall"
"Dubbo-SMC3.0:/data/services/api/dubbo/dubbo-smc-three"
"Dubbo-SMC2.0:/data/services/api/dubbo/dubbo-smc-two"
"Dubbo-Teams:/data/services/api/dubbo/dubbo-teams"
"Dubbo-腾讯会议:/data/services/api/dubbo/dubbo-tencent-meeting"
"Dubbo-小鱼易连:/data/services/api/dubbo/dubbo-xylink"
"前端-微应用:/data/services/web/pc/pc-vue2-main"
"前端-AI助手:/data/services/web/pc/pc-vue2-ai"
"前端-统一后台:/data/services/web/pc/pc-vue2-backstage"
"前端-编辑器:/data/services/web/pc/pc-vue2-editor"
"前端-预定:/data/services/web/pc/pc-vue2-meetingV2"
"前端-统一平台:/data/services/web/pc/pc-vue2-meetingV3"
"前端-门户:/data/services/web/pc/pc-vue2-platform"
"前端-运维集控:/data/services/web/pc/pc-vue2-moniter"
"前端-语音转录:/data/services/web/pc/pc-vue2-voice"
"前端-预定移动端:/data/services/web/h5/h5-uniapp-meeting"
"前端-运维集控移动端:/data/services/web/h5/h5-uniapp-moniter"
"前端-统一平台移动端:/data/services/web/h5/h5-uniapp-platform"
"全局脚本:/data/services/scripts"
"备份目录:/data/bakup"
"容器目录:/data/dockers"
"日志目录:/data/logs"
"中间件目录:/data/middleware"
"安全认证目录:/data/security"
"文件存储目录:/data/storage"
"第三方配套件目录:/data/third_party"
)
# 统计总数和失败数
local total=${#services[@]}
local failed=0
local missing_dirs=()
log "INFO" "共检测 $total 个服务模块的部署目录..."
# 遍历每个服务进行目录检测
for service in "${services[@]}"; do
# 分割模块名和路径
local module_name="${service%%:*}"
local relative_path="${service#*:}"
local full_path="$auto_java/$relative_path"
log "INFO" "正在检测 [$module_name] => $full_path"
if [[ -d "$full_path" ]]; then
log "INFO" "✅ [$module_name] 目录校验通过"
else
log "ERROR" "❌ [$module_name] 目录不存在: $full_path"
missing_dirs+=("[$module_name] $full_path")
((failed++))
fi
sleep 0.3 # 可选:避免日志刷屏过快
done
# 输出最终检测结果
if [[ $failed -eq 0 ]]; then
log "INFO" "🎉 部署文件检测完成:所有 $total 个目录均存在,检测成功!"
return 0
else
log "ERROR" "⛔ 部署文件检测失败:共 $failed 个目录缺失"
for dir in "${missing_dirs[@]}"; do
log "ERROR" " 缺失: $dir"
done
log "ERROR" "请重新上传缺失文件后,再执行部署脚本。"
exit 1 # 终止脚本
fi
}
#------------------------------部署文件检测-end--------------------------------------------------------------------------------------------------------------------
#------------------------------文件上传&更改ip-start------------------------------------------------------------------------------------------------------------------------
#-----------------------------------新统一平台系统--------------------------------------------
function check_files() {
log "INFO" "=================================================================="
log "INFO" "开始检查并部署 data 目录文件"
log "INFO" "=================================================================="
# ------------------- 定义变量 -------------------
local source_dir="./data" # 脚本同级目录下的 data
local target_dir="/data"
# ------------------- 检查目标目录是否已完整存在 -------------------
local -a required_dirs=("bakup" "dockers" "logs" "middleware" "security" "services" "storage" "temp" "third_party")
local all_dirs_exist=true
if [[ -d "$target_dir" ]]; then
log "INFO" "📁 检测到目标目录已存在: $target_dir"
log "INFO" "🔍 检查必需子目录是否完整..."
for dir in "${required_dirs[@]}"; do
if [[ ! -d "$target_dir/$dir" ]]; then
log "WARN" "⚠️ 缺少目录: $target_dir/$dir"
all_dirs_exist=false
else
log "INFO" "✅ 目录就位: $target_dir/$dir"
fi
done
if $all_dirs_exist; then
log "INFO" "🎉 所有必需目录已存在,跳过文件部署"
# 直接执行 IP 替换脚本,传入新的IP值
local replace_script="./replace_ip_interactive.sh"
if [[ -f "$replace_script" && -x "$replace_script" ]]; then
log "INFO" "🔄 正在执行 IP 替换脚本: $replace_script $server_ip"
if "$replace_script" "$server_ip"; then
log "INFO" "✅ IP 替换脚本执行成功"
else
log "ERROR" "⛔ IP 替换脚本执行失败"
return 1
fi
elif [[ -f "$replace_script" ]]; then
log "ERROR" "⛔ 脚本 $replace_script 存在但不可执行,请运行: chmod +x $replace_script"
return 1
else
log "ERROR" "⛔ 脚本 $replace_script 不存在"
return 1
fi
log "INFO" "✅ 文件检查完成,准备进入服务安装阶段..."
sleep 2
return 0
else
log "INFO" "📦 检测到有目录缺失,需要进行文件同步"
fi
else
log "INFO" "📁 目标目录 $target_dir 不存在,需要创建和部署"
all_dirs_exist=false
fi
# ------------------- 如果有任何一个目录不存在,继续执行文件部署逻辑 -------------------
# ------------------- 检查源目录 -------------------
if [[ ! -d "$source_dir" ]]; then
log "ERROR" "⛔ 源目录不存在: $source_dir"
log "INFO" "请确保当前目录下有 'data' 文件夹,且包含所需内容"
return 1
fi
log "INFO" "📁 检测到源目录: $source_dir"
# ------------------- 检查目标目录是否已存在 -------------------
if [[ -d "$target_dir" ]]; then
log "WARN" "⚠️ 目录 $target_dir 已存在,将进行增量同步(保留原数据)"
log "INFO" "📦 正在同步文件: $source_dir/ → $target_dir/"
# 使用 rsync 增量同步(推荐)或 cp -r
if command -v rsync &>/dev/null; then
log "INFO" "🔄 使用 rsync 进行同步..."
# 捕获标准输出和错误输出
if rsync -av "$source_dir/" "$target_dir/" 2>&1 | while read -r line; do
log "INFO" "📄 $line"
done; then
log "INFO" "✅ rsync 同步完成"
else
log "ERROR" "❌ rsync 同步失败"
return 1
fi
else
log "WARN" "⚠️ 系统未安装 rsync,使用 cp 命令进行同步"
log "INFO" "📋 开始复制文件列表..."
local copy_success=true
find "$source_dir" -type f | while read -r file; do
relative_path="${file#$source_dir/}"
target_file="$target_dir/$relative_path"
mkdir -p "$(dirname "$target_file")" 2>/dev/null
if cp -f "$file" "$target_file" 2>/dev/null; then
log "INFO" "✅ 已复制: $relative_path"
else
log "ERROR" "❌ 复制失败: $relative_path"
copy_success=false
fi
done
# 复制空目录
find "$source_dir" -type d | while read -r dir; do
relative_path="${dir#$source_dir/}"
[ -n "$relative_path" ] && mkdir -p "$target_dir/$relative_path" 2>/dev/null
done
if ! $copy_success; then
log "ERROR" "⛔ 文件复制过程中出现错误"
return 1
fi
fi
else
log "INFO" "📁 目标目录 $target_dir 不存在,正在创建并复制..."
mkdir -p "$(dirname "$target_dir")" || {
log "ERROR" "⛔ 无法创建父目录"
return 1
}
log "INFO" "📋 开始复制整个 data 目录..."
# 修复:直接复制到目标位置
if cp -rfv "$source_dir" "$target_dir" 2>&1 | while read -r line; do
log "INFO" "📄 $line"
done; then
log "INFO" "✅ 成功复制 $source_dir$target_dir"
else
log "ERROR" "⛔ 复制失败,请检查权限"
return 1
fi
fi
# ------------------- 再次验证关键目录是否存在 -------------------
log "INFO" "🔍 同步完成后再次验证目录完整性..."
all_dirs_exist=true
for dir in "${required_dirs[@]}"; do
if [[ ! -d "$target_dir/$dir" ]]; then
log "WARN" "🔍 缺少目录: $target_dir/$dir,部署可能不完整"
all_dirs_exist=false
else
log "INFO" "✅ 目录就位: $target_dir/$dir"
fi
done
if ! $all_dirs_exist; then
log "ERROR" "⛔ 文件部署后仍然缺少必需目录,请检查源数据完整性"
return 1
fi
# ------------------- 执行 IP 替换脚本 -------------------
local replace_script="./replace_ip_interactive.sh"
if [[ -f "$replace_script" && -x "$replace_script" ]]; then
log "INFO" "🔄 正在执行 IP 替换脚本: $replace_script"
if "$replace_script"; then
log "INFO" "✅ IP 替换脚本执行成功"
else
log "ERROR" "⛔ IP 替换脚本执行失败"
return 1
fi
elif [[ -f "$replace_script" ]]; then
log "ERROR" "⛔ 脚本 $replace_script 存在但不可执行,请运行: chmod +x $replace_script"
return 1
else
log "ERROR" "⛔ 脚本 $replace_script 不存在"
return 1
fi
log "INFO" "✅ 文件部署完成:$source_dir$target_dir"
log "INFO" "准备进入服务安装阶段..."
sleep 2
return 0
}
#------------------------------文件上传&更改ip-end--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#===================================================================================
# 函数名称:check_files_upload
# 功能说明:文件检查与部署主入口函数,调用文件检测和部署函数
# 参数说明:server_ip由主脚本通过环境变量传入
# 返回值:0-文件检查和部署成功, 1-文件检查或部署失败
#===================================================================================
check_files_upload() {
log "INFO" "=================================================================="
log "INFO" "开始文件检查与部署流程"
log "INFO" "=================================================================="
# ------------------- 初始化变量 -------------------
# 初始化sudo相关变量
if [[ $(id -u) -ne 0 ]]; then
sudoset="sudo"
SUDO="sudo"
else
sudoset=""
SUDO=""
fi
# server_ip由主脚本传入
if [[ -z "$server_ip" ]]; then
log "WARN" "未传入服务器IP地址"
else
log "INFO" "服务器IP地址: $server_ip"
fi
# ------------------- 执行部署文件检测 -------------------
log "INFO" "----------------------------------------"
log "INFO" "步骤1: 检测部署文件是否完整"
if ! File_detection_java; then
log "ERROR" "部署文件检测失败,终止部署"
return 1
fi
# ------------------- 执行文件检查和部署 -------------------
log "INFO" "----------------------------------------"
log "INFO" "步骤2: 检查并部署data目录文件"
if ! check_files; then
log "ERROR" "文件部署失败,终止部署"
return 1
fi
# ------------------- 返回结果 -------------------
log "INFO" "=================================================================="
log "INFO" "文件检查与部署完成"
return 0
}
......@@ -56,6 +56,14 @@ else
exit 1
fi
# 导入文件检查脚本
if [[ -f "$SCRIPT_DIR/auto_file_upload_check.sh" ]]; then
source "$SCRIPT_DIR/auto_file_upload_check.sh"
else
log "ERROR" "文件检查脚本不存在: $SCRIPT_DIR/auto_file_upload_check.sh"
exit 1
fi
#------------------------------检测模块-----------------------------------------------------
......@@ -2728,8 +2736,8 @@ function deploy_services() {
#自动化脚本路径
auto_java=$PWD
add_user
#检测文件
File_detection_java
# 文件检查与部署
check_files_upload
#开放防火墙
firewalldjava
check_files
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论