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

feat(script): 更新远程容器部署与打包上传功能

- 删除 PowerShell 版本的远程更新脚本 remote_update.ps1
- 修改 upload_to_nas.sh 中的 NAS 共享目录和上传路径
- 更新自动打包上传需求文档,调整脚本描述与功能说明
- 调整文档中的脚本名称与路径指向新的自动化部署打包脚本
- 简化功能列表,聚焦于系统打包与上传核心功能
- 移除原有远程容器更新脚本的功能详述与状态表格
- 优化文档结构以匹配当前实际使用的脚本工具集
上级 e44e9787
......@@ -2,132 +2,67 @@
## 📋 概述
系统由三个核心 Shell 脚本组成,用于实现容器化服务的远程部署与升级管理
脚本主要用于将主服务器上根据不同系统要求进行更新自动化部署包程序,压缩后上传至公司网盘
1. **`remote_update.sh`**:远程升级控制脚本,负责从主服务器向目标服务器传输镜像和部署脚本,并触发远端部署流程,路径:E:\GithubData\自动化\ubains-module-test\辅助工具\脚本工具\远程容器更新\remote_update.sh
2. **`container_update.sh`**:容器部署执行脚本,支持交互式和命令行两种模式,可单独执行进行本地容器部署,路径:E:\GithubData\自动化\ubains-module-test\辅助工具\脚本工具\远程容器更新\container_update.sh
3. **`upload_to_nas.sh`**:镜像打包上传脚本,负责将容器镜像打包并上传至公司 NAS 网盘,路径:E:\GithubData\自动化\ubains-module-test\辅助工具\脚本工具\远程容器更新\upload_to_nas.sh
1. **`server_pakage_upload.sh`**: 脚本路径:E:\GithubData\自动化\ubains-module-test\辅助工具\脚本工具\自动化部署打包上传\server_pakage_upload.sh
### 背景
目前系统支持多种容器服务(Java、Redis、EMQX、Python、Nacos、Nginx)的部署与升级,需要区分两种平台环境:
目前系统支持多个部署系统的打包,需要区分两种平台环境:
- **新统一平台**:使用 `/data/` 目录结构
- **传统平台**:使用 `/var/www/` 目录结构
**现有功能**
- ✅ 远程升级指定服务器的容器版本 `[已实现]`
1. java容器远程更新(传统平台和新统一平台已验证通过)
2. uemqx容器(传统平台和新统一平台已验证通过)
3. uredis容器(传统平台和新统一平台已验证通过)
4. upython容器()
5. nacos容器(新统一平台已验证通过)
6. nginx容器(新统一平台已验证通过)
7. mysql容器(未验证)
- ✅ 自动校验目标服务器架构(仅支持 x86)`[已实现]`
- ✅ 自动递增容器编号避免命名冲突 `[已实现]`
- ✅ 支持多种容器类型的差异化部署 `[已实现]`
- ✅ 支持预设服务器和手动输入服务器信息(IP/端口/用户名/密码)`[已实现]`
- ✅ EMQX 文件同步(配置、数据、日志目录)`[已实现]`
- ✅ Nginx 文件同步(配置、HTML、证书目录)`[已实现]`
- ✅ 自动校验目标服务器是新统一平台目录还是传统平台目录,通过宿主机上的目录来判断,存在/data/services目录的是新统一平台,不存在的则是传统平台 `[已实现]`
- ✅ 自动校验目标服务器上的容器是否已更新 `[已实现]`
- ✅ 远程更新完成后需要将目标服务器上的镜像包清理 `[已实现]`
- ⏸️ Python 文件同步 `[功能保留,暂不启用]`
- ✅ 将主服务器上的容器镜像及部署脚本打包上传至网盘 `[已实现]`
- ✅ container_update.sh 支持单独执行(交互式模式)`[已实现]`
**待实现功能**
- ❌ 最终将sh脚本改为电脑命令行工具上可执行的脚本格式 `[待最后开发]`
---
## 🎯 功能实现总览
> 最后更新时间:2025-12-07
### 远程升级功能 (`remote_update.sh`)
| 功能模块 | 描述 | 状态 |
|----------|------|------|
| 服务器选择 | 支持预设服务器列表和手动输入(IP/端口/用户名/密码) | ✅ 已实现 |
| 自定义端口 | 支持自定义 SSH 端口(默认 22) | ✅ 已实现 |
| 架构校验 | 校验目标服务器是否为 x86 架构 | ✅ 已实现 |
| 镜像传输 | 自动传输镜像文件和部署脚本 | ✅ 已实现 |
| 容器停止 | 自动停止远端旧容器 | ✅ 已实现 |
| 平台识别 | 自动检测目标服务器平台类型(检测 /data/services 目录) | ✅ 已实现 |
| 版本校验 | 自动校验远端容器镜像版本是否已更新 | ✅ 已实现 |
| EMQX 同步 | 同步 EMQX 配置、数据、日志目录 | ✅ 已实现 |
| Python 同步 | 同步 Python 代码和配置 | ⏸️ 暂停 |
| Nginx 同步 | 同步 Nginx 配置、HTML、证书 | ✅ 已实现 |
| 容器编号 | 自动递增容器编号 | ✅ 已实现 |
| 远端执行 | 调用远端部署脚本 | ✅ 已实现 |
| 镜像清理 | 部署完成后自动清理远端镜像包和部署脚本 | ✅ 已实现 |
### 容器部署功能 (`container_update.sh`)
| 容器类型 | 新平台 | 传统平台 | 备注 |
|----------|--------|----------|------|
| Java (ujava) | ✅ | ✅ | 完整端口映射和目录挂载 |
| Redis (uredis) | ✅ | ✅ | 支持配置迁移和端口释放 |
| EMQX (uemqx) | ✅ | ✅ | 多端口映射,完整目录挂载 |
| Python (upython) | ✅ | ✅ | 容器部署正常,暂不同步文件 |
| Nacos (unacos) | ✅ | ❌ | 仅支持新平台,单机模式 |
| Nginx (unginx) | ✅ | ❌ | 仅支持新平台,完整目录挂载 |
### 交互式部署功能 (`container_update.sh` 交互式模式)
| 步骤 | 功能描述 | 状态 |
|------|----------|------|
| 步骤1 | 询问更新哪个容器 | ✅ 已实现 |
| 步骤2 | 检查压缩包中是否存在所需镜像和配置文件 | ✅ 已实现 |
| 步骤3 | 判断当前服务器是传统平台还是新统一平台 | ✅ 已实现 |
| 步骤4 | 检查并停止正在运行的同类型容器(不删除) | ✅ 已实现 |
| 步骤5 | 备份原有配置文件 | ❌ 待开发 |
| 步骤6 | 更新配置文件并替换IP地址为当前服务器IP | ❌ 待开发 |
| 步骤7 | 执行容器部署操作 | ✅ 已实现 |
| 步骤8 | 验证容器部署是否成功 | ✅ 已实现 |
| 步骤9 | 记录操作日志到当前目录(日志审计) | ✅ 已实现 |
### 镜像上传功能 (`upload_to_nas.sh`)
| 功能模块 | 描述 | 状态 |
|----------|------|------|
| 目录打包 | 将指定目录压缩为 tar.gz 格式 | ✅ 已实现 |
| NAS 挂载 | 自动挂载公司 SMB 网盘 | ✅ 已实现 |
| 进度显示 | 打包和上传过程显示进度条 | ✅ 已实现 |
| 密码加密 | 网盘密码使用 base64 加密存储 | ✅ 已实现 |
### 新增脚本remote_update_win
> 参考脚本:E:\GithubData\自动化\ubains-module-test\辅助工具\脚本工具\远程容器更新\remote_update.sh
> 新增脚本:E:\GithubData\自动化\ubains-module-test\辅助工具\脚本工具\远程容器更新\remote_update_win
> 脚本要求:最好能够直接运行,不用安装依赖
| 功能模块 | 描述 | 状态 |
|----------|------|------|
| 服务器选择 | 支持预设服务器列表和手动输入(IP/端口/用户名/密码) | ❌ 待开发 |
| 自定义端口 | 支持自定义 SSH 端口(默认 22) | ❌ 待开发 |
| 架构校验 | 校验目标服务器是否为 x86 架构 | ❌ 待开发 |
| 镜像传输 | 自动传输镜像文件和部署脚本 | ❌ 待开发|
| 容器停止 | 自动停止远端旧容器 | ❌ 待开发 |
| 平台识别 | 自动检测目标服务器平台类型(检测 /data/services 目录) | ❌ 待开发 |
| 版本校验 | 自动校验远端容器镜像版本是否已更新 | ❌ 待开发 |
| EMQX 同步 | 同步 EMQX 配置、数据、日志目录 | ❌ 待开发 |
| Python 同步 | 同步 Python 代码和配置 | ⏸️ 暂停 |
| Nginx 同步 | 同步 Nginx 配置、HTML、证书 | ❌ 待开发 |
| 容器编号 | 自动递增容器编号 | ❌ 待开发 |
| 远端执行 | 调用远端部署脚本 | ❌ 待开发 |
| 日志审计 | 每一步骤的日志都需要记录到log文件中 | ❌ 待开发 |
### 待开发功能
| 功能 | 描述 | 状态 |
|------|------|------|
| 批量部署 | 一次升级多台服务器 | ❌ 待开发 |
| 版本管理 | 记录部署版本和时间 | ❌ 待开发 |
---
\ No newline at end of file
### 打包脚本 (`pakage_upload.sh`)
需求功能点:
1、询问用户选择需要打包的系统类型(会议预定系统、运维集控系统、语音转录系统、电子桌牌系统、无纸化信令服务)。✅ 已完成待验证
2、根据选择的系统类型,执行相应的打包操作。
- 会议预定系统:前后端服务包 ✅ 已完成待验证、容器镜像包 ✅ 已完成待验证
- 运维集控系统:前后端服务包、容器镜像包
- 语音转录系统:前后端服务包、容器镜像包
- 电子桌牌系统:前后端服务包、容器镜像包
- 无纸化信令服务:前后端服务包、容器镜像包
3、打包成tar.gz格式并增加md5格式校验后,将打包后的文件上传至公司网盘。✅ 已完成待验证
#### 详细功能描述:
1、询问用户选择需要打包的系统类型:
- 使用 `select` 命令,将系统类型列表作为选项,让用户进行选择。
2、根据选择的系统类型,执行相应的打包操作:
- 自动化部署包路径:'/data/offline_auto_unifiedPlatform'(暂时不区分系统名称)
- 会议预定系统:
前后端服务包:
1、将/data/services/api/auth/auth-sso-auth目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/auth/auth-sso-auth目录下
2、将/data/services/api/auth/auth-sso-gatway目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/auth/auth-sso-gatway目录下
3、将/data/services/api/auth/auth-sso-system目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/auth/auth-sso-system目录下
4、将/data/services/api/java-meeting/java-meeting2.0目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/java-meeting/java-meeting2.0目录下
5、将/data/services/api/java-meeting/java-meeting3.0目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/java-meeting/java-meeting3.0目录下
6、将/data/services/api/java-meeting/java-meeting-extapi目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/java-meeting/java-meeting-extapi目录下
7、将/data/services/api/java-meeting/java-message-scheduling目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/java-meeting/java-message-scheduling目录下
8、将/data/services/api/java-meeting/java-mqtt目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/java-meeting/java-mqtt目录下
9、将/data/services/api/java-meeting/java-quartz目录下的jar包更新中至/data/offline_auto_unifiedPlatform/data/services/api/java-meeting/java-quartz目录下
10、将/data/services/web/pc/pc-vue2-ai目录下的static文件夹、index.html文件更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-ai目录下
11、将/data/services/web/pc/pc-vue2-backstage目录下的static文件夹、index.html文件更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-backstage目录下
12、将/data/services/web/pc/pc-vue2-main目录下的static文件夹、index.html文件和js文件更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-main目录下
13、将/data/services/web/pc/pc-vue2-meetingControl目录下的static文件夹、index.html文件更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-meetingControl目录下
14、将/data/services/web/pc/pc-vue2-meetngV2目录下的static文件夹、index.html文件和js文件更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-meetngV2目录下
15、将/data/services/web/pc/pc-vue2-meetngV3目录下的static文件夹、index.html文件和js文件更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-meetngV3目录下
16、将/data/services/web/pc/pc-vue2-platform目录下的static文件夹、index.html文件和temp文件夹更新中至/data/offline_auto_unifiedPlatform/data/services/web/pc/pc-vue2-platform目录下
容器镜像包:
1、将/data/temp目录下的docker-20.10.7.tgz和docker.service和docker文件夹更新至/data/offline_auto_unifiedPlatform/data/temp目录下
2、将/data/temp目录下的umysql.tar.gz、devops_voice.sql、huazhao2.sql、nacos_mysql.sql、offline.sql更新至/data/offline_auto_unifiedPlatform/data/temp目录下
3、将/data/temp目录下的redis8.2.2.tar.gz更新至/data/offline_auto_unifiedPlatform/data/temp目录下
4、将/data/temp目录下的uemqx5.8.4.tar.gz更新至/data/offline_auto_unifiedPlatform/data/temp目录下
5、将/data/temp目录下的ufastdfs.tar.gz更新至/data/offline_auto_unifiedPlatform/data/temp目录下
6、将/data/temp目录下的nacos-server-v2.5.2.tar.gz更新至/data/offline_auto_unifiedPlatform/data/temp目录下
7、将/data/temp目录下的nginx-1.29.3.tar.gz更新至/data/offline_auto_unifiedPlatform/data/temp目录下
8、将/data/temp目录下的chrony.conf更新至/data/offline_auto_unifiedPlatform/data/temp目录下
9、将/data/temp目录下的jdk-8u472-linux-x64.tar.gz更新至/data/offline_auto_unifiedPlatform/data/temp目录下
- 运维集控系统:
3、打包成tar.gz格式并增加md5格式校验后,将打包后的文件上传至公司网盘。
将/data/offline_auto_unifiedPlatform目录打包成tar.gz格式并增加md5格式校验后,将打包后的文件上传至公司网盘。
\ No newline at end of file
#!/bin/bash
#======================================================================
# 自动化部署打包上传脚本
# 脚本名称: pakage_upload.sh
# 功能描述: 根据用户选择的系统类型,执行相应的打包操作
#
# 功能状态:
# ✅ 功能点1: 询问用户选择需要打包的系统类型 - 已完成待验证
# ✅ 功能点2: 会议预定系统 - 前后端服务包打包 - 已完成待验证
# ✅ 功能点2: 会议预定系统 - 容器镜像包打包 - 已完成待验证
# ⏳ 功能点2: 运维集控系统 - 待开发
# ⏳ 功能点2: 语音转录系统 - 待开发
# ⏳ 功能点2: 电子桌牌系统 - 待开发
# ⏳ 功能点2: 无纸化信令服务 - 待开发
# ✅ 功能点3: 打包成tar.gz并上传网盘 - 已完成待验证
#======================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 自动化部署包基础路径
OFFLINE_PACKAGE_PATH="/data/offline_auto_unifiedPlatform"
# NAS 网盘配置
NAS_SERVER="192.168.9.9"
NAS_SHARE="研发管理"
NAS_USER="陈泽键"
NAS_PASS_ENCRYPTED="Mm01ZUwuTUA="
NAS_MOUNT_POINT="/mnt/nas_upload"
NAS_UPLOAD_DIR="调试打包路径"
# 临时打包文件存放目录
TEMP_PACK_DIR="/tmp"
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 打印分隔线
print_separator() {
echo -e "${CYAN}========================================${NC}"
}
# 打印标题
print_title() {
echo ""
print_separator
echo -e "${BLUE} $1${NC}"
print_separator
echo ""
}
#======================================================================
# 功能点1: 询问用户选择需要打包的系统类型 [已完成待验证]
#======================================================================
select_system_type() {
print_title "自动化部署打包上传工具"
echo -e "${CYAN}请选择需要打包的系统类型:${NC}"
echo ""
# 系统类型列表
local options=(
"会议预定系统"
"运维集控系统"
"语音转录系统"
"电子桌牌系统"
"无纸化信令服务"
"退出"
)
# 使用 select 命令让用户选择
PS3=$'\n请输入选项编号 (1-6): '
select opt in "${options[@]}"; do
case $opt in
"会议预定系统")
log_info "您选择了: 会议预定系统"
SELECTED_SYSTEM="meeting"
SELECTED_SYSTEM_NAME="会议预定系统"
break
;;
"运维集控系统")
log_info "您选择了: 运维集控系统"
SELECTED_SYSTEM="devops"
SELECTED_SYSTEM_NAME="运维集控系统"
log_warn "该系统打包功能尚未开发"
break
;;
"语音转录系统")
log_info "您选择了: 语音转录系统"
SELECTED_SYSTEM="voice"
SELECTED_SYSTEM_NAME="语音转录系统"
log_warn "该系统打包功能尚未开发"
break
;;
"电子桌牌系统")
log_info "您选择了: 电子桌牌系统"
SELECTED_SYSTEM="nameplate"
SELECTED_SYSTEM_NAME="电子桌牌系统"
log_warn "该系统打包功能尚未开发"
break
;;
"无纸化信令服务")
log_info "您选择了: 无纸化信令服务"
SELECTED_SYSTEM="paperless"
SELECTED_SYSTEM_NAME="无纸化信令服务"
log_warn "该系统打包功能尚未开发"
break
;;
"退出")
log_info "用户选择退出"
exit 0
;;
*)
log_error "无效的选项,请输入 1-6 之间的数字"
;;
esac
done
}
#======================================================================
# 功能点2: 会议预定系统 - 前后端服务包打包 [已完成待验证]
#======================================================================
# 复制jar包的通用函数
copy_jar_files() {
local src_dir="$1"
local dest_dir="$2"
local description="$3"
log_info "正在处理: $description"
# 检查源目录是否存在
if [ ! -d "$src_dir" ]; then
log_error "源目录不存在: $src_dir"
return 1
fi
# 创建目标目录(如果不存在)
if [ ! -d "$dest_dir" ]; then
log_info "创建目标目录: $dest_dir"
mkdir -p "$dest_dir"
if [ $? -ne 0 ]; then
log_error "创建目标目录失败: $dest_dir"
return 1
fi
fi
# 查找并复制jar文件
local jar_count=$(find "$src_dir" -maxdepth 1 -name "*.jar" -type f | wc -l)
if [ "$jar_count" -eq 0 ]; then
log_warn "未找到jar文件: $src_dir"
return 0
fi
# 先删除目标目录中的旧jar文件
rm -f "$dest_dir"/*.jar 2>/dev/null
# 复制新的jar文件
cp "$src_dir"/*.jar "$dest_dir/"
if [ $? -eq 0 ]; then
log_success "已复制 $jar_count 个jar文件到: $dest_dir"
return 0
else
log_error "复制jar文件失败: $src_dir -> $dest_dir"
return 1
fi
}
# 复制前端文件的通用函数
copy_frontend_files() {
local src_dir="$1"
local dest_dir="$2"
local description="$3"
local include_js="$4" # 是否包含js文件
local include_temp="$5" # 是否包含temp文件夹
log_info "正在处理: $description"
# 检查源目录是否存在
if [ ! -d "$src_dir" ]; then
log_error "源目录不存在: $src_dir"
return 1
fi
# 创建目标目录(如果不存在)
if [ ! -d "$dest_dir" ]; then
log_info "创建目标目录: $dest_dir"
mkdir -p "$dest_dir"
if [ $? -ne 0 ]; then
log_error "创建目标目录失败: $dest_dir"
return 1
fi
fi
local copy_count=0
# 复制 static 文件夹
if [ -d "$src_dir/static" ]; then
rm -rf "$dest_dir/static" 2>/dev/null
cp -r "$src_dir/static" "$dest_dir/"
if [ $? -eq 0 ]; then
log_success "已复制 static 文件夹"
((copy_count++))
else
log_error "复制 static 文件夹失败"
fi
else
log_warn "static 文件夹不存在: $src_dir/static"
fi
# 复制 index.html 文件
if [ -f "$src_dir/index.html" ]; then
cp "$src_dir/index.html" "$dest_dir/"
if [ $? -eq 0 ]; then
log_success "已复制 index.html 文件"
((copy_count++))
else
log_error "复制 index.html 文件失败"
fi
else
log_warn "index.html 文件不存在: $src_dir/index.html"
fi
# 如果需要复制js文件
if [ "$include_js" = "true" ]; then
local js_count=$(find "$src_dir" -maxdepth 1 -name "*.js" -type f | wc -l)
if [ "$js_count" -gt 0 ]; then
cp "$src_dir"/*.js "$dest_dir/" 2>/dev/null
if [ $? -eq 0 ]; then
log_success "已复制 $js_count 个js文件"
((copy_count++))
else
log_error "复制js文件失败"
fi
else
log_warn "未找到js文件: $src_dir"
fi
fi
# 如果需要复制temp文件夹
if [ "$include_temp" = "true" ]; then
if [ -d "$src_dir/temp" ]; then
rm -rf "$dest_dir/temp" 2>/dev/null
cp -r "$src_dir/temp" "$dest_dir/"
if [ $? -eq 0 ]; then
log_success "已复制 temp 文件夹"
((copy_count++))
else
log_error "复制 temp 文件夹失败"
fi
else
log_warn "temp 文件夹不存在: $src_dir/temp"
fi
fi
if [ $copy_count -gt 0 ]; then
log_success "前端文件复制完成: $description"
return 0
else
log_warn "没有文件被复制: $description"
return 1
fi
}
# 会议预定系统 - 前后端服务包打包
package_meeting_system_services() {
print_title "会议预定系统 - 前后端服务包打包"
local success_count=0
local fail_count=0
local total_tasks=16
#----------------------------------------------------------------------
# 后端服务 - JAR包更新 (共9个)
#----------------------------------------------------------------------
print_separator
echo -e "${BLUE} 后端服务 JAR包更新${NC}"
print_separator
# 1. auth-sso-auth
if copy_jar_files \
"/data/services/api/auth/auth-sso-auth" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/auth/auth-sso-auth" \
"auth-sso-auth"; then
((success_count++))
else
((fail_count++))
fi
# 2. auth-sso-gatway
if copy_jar_files \
"/data/services/api/auth/auth-sso-gatway" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/auth/auth-sso-gatway" \
"auth-sso-gatway"; then
((success_count++))
else
((fail_count++))
fi
# 3. auth-sso-system
if copy_jar_files \
"/data/services/api/auth/auth-sso-system" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/auth/auth-sso-system" \
"auth-sso-system"; then
((success_count++))
else
((fail_count++))
fi
# 4. java-meeting2.0
if copy_jar_files \
"/data/services/api/java-meeting/java-meeting2.0" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/java-meeting/java-meeting2.0" \
"java-meeting2.0"; then
((success_count++))
else
((fail_count++))
fi
# 5. java-meeting3.0
if copy_jar_files \
"/data/services/api/java-meeting/java-meeting3.0" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/java-meeting/java-meeting3.0" \
"java-meeting3.0"; then
((success_count++))
else
((fail_count++))
fi
# 6. java-meeting-extapi
if copy_jar_files \
"/data/services/api/java-meeting/java-meeting-extapi" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/java-meeting/java-meeting-extapi" \
"java-meeting-extapi"; then
((success_count++))
else
((fail_count++))
fi
# 7. java-message-scheduling
if copy_jar_files \
"/data/services/api/java-meeting/java-message-scheduling" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/java-meeting/java-message-scheduling" \
"java-message-scheduling"; then
((success_count++))
else
((fail_count++))
fi
# 8. java-mqtt
if copy_jar_files \
"/data/services/api/java-meeting/java-mqtt" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/java-meeting/java-mqtt" \
"java-mqtt"; then
((success_count++))
else
((fail_count++))
fi
# 9. java-quartz
if copy_jar_files \
"/data/services/api/java-meeting/java-quartz" \
"${OFFLINE_PACKAGE_PATH}/data/services/api/java-meeting/java-quartz" \
"java-quartz"; then
((success_count++))
else
((fail_count++))
fi
#----------------------------------------------------------------------
# 前端服务 - Web文件更新 (共7个)
#----------------------------------------------------------------------
echo ""
print_separator
echo -e "${BLUE} 前端服务 Web文件更新${NC}"
print_separator
# 10. pc-vue2-ai (static + index.html)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-ai" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-ai" \
"pc-vue2-ai" \
"false" \
"false"; then
((success_count++))
else
((fail_count++))
fi
# 11. pc-vue2-backstage (static + index.html)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-backstage" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-backstage" \
"pc-vue2-backstage" \
"false" \
"false"; then
((success_count++))
else
((fail_count++))
fi
# 12. pc-vue2-main (static + index.html + js)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-main" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-main" \
"pc-vue2-main" \
"true" \
"false"; then
((success_count++))
else
((fail_count++))
fi
# 13. pc-vue2-meetingControl (static + index.html)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-meetingControl" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-meetingControl" \
"pc-vue2-meetingControl" \
"false" \
"false"; then
((success_count++))
else
((fail_count++))
fi
# 14. pc-vue2-meetngV2 (static + index.html + js)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-meetngV2" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-meetngV2" \
"pc-vue2-meetngV2" \
"true" \
"false"; then
((success_count++))
else
((fail_count++))
fi
# 15. pc-vue2-meetngV3 (static + index.html + js)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-meetngV3" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-meetngV3" \
"pc-vue2-meetngV3" \
"true" \
"false"; then
((success_count++))
else
((fail_count++))
fi
# 16. pc-vue2-platform (static + index.html + temp)
if copy_frontend_files \
"/data/services/web/pc/pc-vue2-platform" \
"${OFFLINE_PACKAGE_PATH}/data/services/web/pc/pc-vue2-platform" \
"pc-vue2-platform" \
"false" \
"true"; then
((success_count++))
else
((fail_count++))
fi
#----------------------------------------------------------------------
# 打包结果统计
#----------------------------------------------------------------------
echo ""
print_separator
echo -e "${BLUE} 前后端服务包打包结果统计${NC}"
print_separator
echo ""
echo -e " 总任务数: ${CYAN}$total_tasks${NC}"
echo -e " 成功: ${GREEN}$success_count${NC}"
echo -e " 失败: ${RED}$fail_count${NC}"
echo ""
if [ $fail_count -eq 0 ]; then
log_success "会议预定系统 - 前后端服务包打包完成!"
return 0
else
log_warn "会议预定系统 - 前后端服务包打包完成,但有 $fail_count 个任务失败"
return 1
fi
}
#======================================================================
# 功能点2: 会议预定系统 - 容器镜像包打包 [已完成待验证]
#======================================================================
# 复制指定文件的通用函数
copy_specific_files() {
local src_dir="$1"
local dest_dir="$2"
shift 2
local files=("$@")
local description="${files[0]}"
log_info "正在处理容器镜像文件..."
# 检查源目录是否存在
if [ ! -d "$src_dir" ]; then
log_error "源目录不存在: $src_dir"
return 1
fi
# 创建目标目录(如果不存在)
if [ ! -d "$dest_dir" ]; then
log_info "创建目标目录: $dest_dir"
mkdir -p "$dest_dir"
if [ $? -ne 0 ]; then
log_error "创建目标目录失败: $dest_dir"
return 1
fi
fi
local success_count=0
local fail_count=0
for file in "${files[@]}"; do
local src_path="$src_dir/$file"
local dest_path="$dest_dir/$file"
if [ -f "$src_path" ]; then
# 复制文件
cp "$src_path" "$dest_path"
if [ $? -eq 0 ]; then
log_success "已复制文件: $file"
((success_count++))
else
log_error "复制文件失败: $file"
((fail_count++))
fi
elif [ -d "$src_path" ]; then
# 复制目录
rm -rf "$dest_path" 2>/dev/null
cp -r "$src_path" "$dest_path"
if [ $? -eq 0 ]; then
log_success "已复制目录: $file"
((success_count++))
else
log_error "复制目录失败: $file"
((fail_count++))
fi
else
log_warn "文件/目录不存在: $src_path"
((fail_count++))
fi
done
if [ $fail_count -eq 0 ]; then
return 0
else
return 1
fi
}
# 会议预定系统 - 容器镜像包打包
package_meeting_system_containers() {
print_title "会议预定系统 - 容器镜像包打包"
local src_temp_dir="/data/temp"
local dest_temp_dir="${OFFLINE_PACKAGE_PATH}/data/temp"
local success_count=0
local fail_count=0
local total_tasks=9
# 检查源目录是否存在
if [ ! -d "$src_temp_dir" ]; then
log_error "源目录不存在: $src_temp_dir"
return 1
fi
# 创建目标目录
if [ ! -d "$dest_temp_dir" ]; then
log_info "创建目标目录: $dest_temp_dir"
mkdir -p "$dest_temp_dir"
fi
print_separator
echo -e "${BLUE} 容器镜像包文件更新${NC}"
print_separator
#----------------------------------------------------------------------
# 1. Docker 相关文件
#----------------------------------------------------------------------
log_info "[1/9] 处理 Docker 相关文件..."
local docker_files=("docker-20.10.7.tgz" "docker.service" "docker")
local docker_success=0
for item in "${docker_files[@]}"; do
local src_path="$src_temp_dir/$item"
local dest_path="$dest_temp_dir/$item"
if [ -f "$src_path" ]; then
cp "$src_path" "$dest_path"
if [ $? -eq 0 ]; then
log_success "已复制: $item"
((docker_success++))
else
log_error "复制失败: $item"
fi
elif [ -d "$src_path" ]; then
rm -rf "$dest_path" 2>/dev/null
cp -r "$src_path" "$dest_path"
if [ $? -eq 0 ]; then
log_success "已复制目录: $item"
((docker_success++))
else
log_error "复制目录失败: $item"
fi
else
log_warn "文件/目录不存在: $src_path"
fi
done
if [ $docker_success -eq ${#docker_files[@]} ]; then
((success_count++))
else
((fail_count++))
fi
#----------------------------------------------------------------------
# 2. MySQL 相关文件
#----------------------------------------------------------------------
log_info "[2/9] 处理 MySQL 相关文件..."
local mysql_files=("umysql.tar.gz" "devops_voice.sql" "huazhao2.sql" "nacos_mysql.sql" "offline.sql")
local mysql_success=0
for item in "${mysql_files[@]}"; do
local src_path="$src_temp_dir/$item"
local dest_path="$dest_temp_dir/$item"
if [ -f "$src_path" ]; then
cp "$src_path" "$dest_path"
if [ $? -eq 0 ]; then
log_success "已复制: $item"
((mysql_success++))
else
log_error "复制失败: $item"
fi
else
log_warn "文件不存在: $src_path"
fi
done
if [ $mysql_success -ge 1 ]; then
((success_count++))
else
((fail_count++))
fi
#----------------------------------------------------------------------
# 3. Redis
#----------------------------------------------------------------------
log_info "[3/9] 处理 Redis 镜像..."
if [ -f "$src_temp_dir/redis8.2.2.tar.gz" ]; then
cp "$src_temp_dir/redis8.2.2.tar.gz" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: redis8.2.2.tar.gz"
((success_count++))
else
log_error "复制失败: redis8.2.2.tar.gz"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/redis8.2.2.tar.gz"
((fail_count++))
fi
#----------------------------------------------------------------------
# 4. EMQX
#----------------------------------------------------------------------
log_info "[4/9] 处理 EMQX 镜像..."
if [ -f "$src_temp_dir/uemqx5.8.4.tar.gz" ]; then
cp "$src_temp_dir/uemqx5.8.4.tar.gz" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: uemqx5.8.4.tar.gz"
((success_count++))
else
log_error "复制失败: uemqx5.8.4.tar.gz"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/uemqx5.8.4.tar.gz"
((fail_count++))
fi
#----------------------------------------------------------------------
# 5. FastDFS
#----------------------------------------------------------------------
log_info "[5/9] 处理 FastDFS 镜像..."
if [ -f "$src_temp_dir/ufastdfs.tar.gz" ]; then
cp "$src_temp_dir/ufastdfs.tar.gz" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: ufastdfs.tar.gz"
((success_count++))
else
log_error "复制失败: ufastdfs.tar.gz"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/ufastdfs.tar.gz"
((fail_count++))
fi
#----------------------------------------------------------------------
# 6. Nacos
#----------------------------------------------------------------------
log_info "[6/9] 处理 Nacos 镜像..."
if [ -f "$src_temp_dir/nacos-server-v2.5.2.tar.gz" ]; then
cp "$src_temp_dir/nacos-server-v2.5.2.tar.gz" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: nacos-server-v2.5.2.tar.gz"
((success_count++))
else
log_error "复制失败: nacos-server-v2.5.2.tar.gz"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/nacos-server-v2.5.2.tar.gz"
((fail_count++))
fi
#----------------------------------------------------------------------
# 7. Nginx
#----------------------------------------------------------------------
log_info "[7/9] 处理 Nginx 镜像..."
if [ -f "$src_temp_dir/nginx-1.29.3.tar.gz" ]; then
cp "$src_temp_dir/nginx-1.29.3.tar.gz" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: nginx-1.29.3.tar.gz"
((success_count++))
else
log_error "复制失败: nginx-1.29.3.tar.gz"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/nginx-1.29.3.tar.gz"
((fail_count++))
fi
#----------------------------------------------------------------------
# 8. Chrony 配置
#----------------------------------------------------------------------
log_info "[8/9] 处理 Chrony 配置文件..."
if [ -f "$src_temp_dir/chrony.conf" ]; then
cp "$src_temp_dir/chrony.conf" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: chrony.conf"
((success_count++))
else
log_error "复制失败: chrony.conf"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/chrony.conf"
((fail_count++))
fi
#----------------------------------------------------------------------
# 9. JDK
#----------------------------------------------------------------------
log_info "[9/9] 处理 JDK 安装包..."
if [ -f "$src_temp_dir/jdk-8u472-linux-x64.tar.gz" ]; then
cp "$src_temp_dir/jdk-8u472-linux-x64.tar.gz" "$dest_temp_dir/"
if [ $? -eq 0 ]; then
log_success "已复制: jdk-8u472-linux-x64.tar.gz"
((success_count++))
else
log_error "复制失败: jdk-8u472-linux-x64.tar.gz"
((fail_count++))
fi
else
log_warn "文件不存在: $src_temp_dir/jdk-8u472-linux-x64.tar.gz"
((fail_count++))
fi
#----------------------------------------------------------------------
# 打包结果统计
#----------------------------------------------------------------------
echo ""
print_separator
echo -e "${BLUE} 容器镜像包打包结果统计${NC}"
print_separator
echo ""
echo -e " 总任务数: ${CYAN}$total_tasks${NC}"
echo -e " 成功: ${GREEN}$success_count${NC}"
echo -e " 失败: ${RED}$fail_count${NC}"
echo ""
if [ $fail_count -eq 0 ]; then
log_success "会议预定系统 - 容器镜像包打包完成!"
return 0
else
log_warn "会议预定系统 - 容器镜像包打包完成,但有 $fail_count 个任务失败"
return 1
fi
}
#======================================================================
# 功能点3: 打包成tar.gz格式并增加md5校验后上传网盘 [已完成待验证]
#======================================================================
# 解密 NAS 密码
decrypt_password() {
echo "${NAS_PASS_ENCRYPTED}" | base64 -d
}
# 检查依赖
check_dependencies() {
local missing_deps=()
# 检查 cifs 支持
if ! command -v mount.cifs >/dev/null 2>&1; then
if ! grep -q cifs /proc/filesystems 2>/dev/null; then
missing_deps+=("cifs-utils")
fi
fi
# 检查 pv 工具(可选,用于显示进度)
if ! command -v pv >/dev/null 2>&1; then
log_warn "未安装 pv 工具,将使用 cp 命令(无进度显示)"
fi
# 检查 md5sum 工具
if ! command -v md5sum >/dev/null 2>&1; then
missing_deps+=("coreutils")
fi
if [[ ${#missing_deps[@]} -gt 0 ]]; then
log_error "缺少依赖: ${missing_deps[*]}"
log_info "请执行: yum install -y ${missing_deps[*]} 或 apt install -y ${missing_deps[*]}"
return 1
fi
return 0
}
# 挂载 NAS
mount_nas() {
local nas_pass
nas_pass="$(decrypt_password)"
# 创建挂载点
if [[ ! -d "${NAS_MOUNT_POINT}" ]]; then
log_info "创建挂载点: ${NAS_MOUNT_POINT}"
sudo mkdir -p "${NAS_MOUNT_POINT}"
fi
# 检查是否已挂载
if mountpoint -q "${NAS_MOUNT_POINT}" 2>/dev/null; then
log_info "NAS 已挂载,跳过挂载步骤"
return 0
fi
log_info "正在挂载 NAS: //${NAS_SERVER}/${NAS_SHARE}"
# 挂载 SMB/CIFS 共享
if ! sudo mount -t cifs "//${NAS_SERVER}/${NAS_SHARE}" "${NAS_MOUNT_POINT}" \
-o "username=${NAS_USER},password=${nas_pass},iocharset=utf8,vers=2.0"; then
log_error "NAS 挂载失败"
log_info "请检查: 1) 网络连接 2) 账号密码 3) 共享路径"
return 1
fi
log_success "NAS 挂载成功"
return 0
}
# 卸载 NAS
unmount_nas() {
if mountpoint -q "${NAS_MOUNT_POINT}" 2>/dev/null; then
log_info "正在卸载 NAS..."
sudo umount "${NAS_MOUNT_POINT}" || true
fi
}
# 打包目录为 tar.gz 格式
pack_directory() {
local source_dir="$1"
local pack_file="$2"
log_info "开始打包目录: ${source_dir}"
log_info "目标文件: ${pack_file}"
# 获取目录大小用于进度估算
local dir_size
dir_size=$(du -sb "${source_dir}" 2>/dev/null | awk '{print $1}')
if command -v pv >/dev/null 2>&1; then
# 使用 pv 显示打包进度
tar -cf - -C "$(dirname "${source_dir}")" "$(basename "${source_dir}")" | \
pv -s "${dir_size}" -p -t -e -r | \
gzip > "${pack_file}"
else
# 无 pv 时直接打包
log_info "正在打包(无进度显示)..."
tar -czvf "${pack_file}" -C "$(dirname "${source_dir}")" "$(basename "${source_dir}")"
fi
if [[ -f "${pack_file}" ]]; then
local file_size
file_size=$(du -h "${pack_file}" | awk '{print $1}')
log_success "打包完成,文件大小: ${file_size}"
return 0
else
log_error "打包失败"
return 1
fi
}
# 生成 MD5 校验文件
generate_md5() {
local source_file="$1"
local md5_file="${source_file}.md5"
log_info "正在生成 MD5 校验文件..."
# 生成 MD5 校验值
local md5_value
md5_value=$(md5sum "${source_file}" | awk '{print $1}')
if [[ -z "${md5_value}" ]]; then
log_error "MD5 校验值生成失败"
return 1
fi
# 写入 MD5 文件
local file_name
file_name=$(basename "${source_file}")
echo "${md5_value} ${file_name}" > "${md5_file}"
if [[ -f "${md5_file}" ]]; then
log_success "MD5 校验文件已生成: ${md5_file}"
log_info "MD5 值: ${md5_value}"
return 0
else
log_error "MD5 校验文件写入失败"
return 1
fi
}
# 上传文件到 NAS
upload_to_nas() {
local source_file="$1"
local target_dir="${NAS_MOUNT_POINT}/${NAS_UPLOAD_DIR}"
# 确保目标目录存在
if [[ ! -d "${target_dir}" ]]; then
log_info "创建目标目录: ${target_dir}"
sudo mkdir -p "${target_dir}"
fi
local file_name
file_name=$(basename "${source_file}")
local target_file="${target_dir}/${file_name}"
log_info "开始上传文件到 NAS..."
log_info "源文件: ${source_file}"
log_info "目标: //${NAS_SERVER}/${NAS_SHARE}/${NAS_UPLOAD_DIR}/${file_name}"
if command -v pv >/dev/null 2>&1; then
# 使用 pv 显示上传进度
pv -p -t -e -r "${source_file}" | sudo tee "${target_file}" > /dev/null
else
# 无 pv 时使用 cp
log_info "正在上传(无进度显示)..."
sudo cp "${source_file}" "${target_file}"
fi
# 验证上传结果
if [[ -f "${target_file}" ]]; then
local uploaded_size
uploaded_size=$(sudo du -h "${target_file}" | awk '{print $1}')
log_success "上传完成!"
log_info " 文件路径: \\\\${NAS_SERVER}\\${NAS_SHARE}\\${NAS_UPLOAD_DIR}\\${file_name}"
log_info " 文件大小: ${uploaded_size}"
return 0
else
log_error "上传失败,目标文件不存在"
return 1
fi
}
# 清理函数
cleanup_nas() {
unmount_nas
}
# 打包并上传到网盘
package_and_upload() {
print_title "打包并上传到公司网盘"
# 检查依赖
log_info "[步骤 1/5] 检查依赖..."
if ! check_dependencies; then
return 1
fi
log_success "依赖检查通过"
# 生成打包文件名
local timestamp
timestamp=$(date +%Y%m%d_%H%M%S)
local pack_name="offline_auto_unifiedPlatform"
local pack_file="${TEMP_PACK_DIR}/${pack_name}.tar.gz"
local md5_file="${pack_file}.md5"
log_info "=================================================================="
log_info "打包上传信息"
log_info "=================================================================="
log_info "源目录: ${OFFLINE_PACKAGE_PATH}"
log_info "打包文件: ${pack_file}"
log_info "目标网盘: \\\\${NAS_SERVER}\\${NAS_SHARE}\\${NAS_UPLOAD_DIR}"
log_info "=================================================================="
# 设置清理钩子
trap cleanup_nas EXIT
# 步骤2: 打包目录
log_info "[步骤 2/5] 打包目录..."
if ! pack_directory "${OFFLINE_PACKAGE_PATH}" "${pack_file}"; then
log_error "打包失败,终止上传"
return 1
fi
# 步骤3: 生成 MD5 校验文件
log_info "[步骤 3/5] 生成 MD5 校验文件..."
if ! generate_md5 "${pack_file}"; then
log_error "MD5 校验文件生成失败,终止上传"
return 1
fi
# 步骤4: 挂载 NAS
log_info "[步骤 4/5] 挂载 NAS..."
if ! mount_nas; then
log_error "NAS 挂载失败,终止上传"
return 1
fi
# 步骤5: 上传文件
log_info "[步骤 5/5] 上传文件..."
# 上传 tar.gz 文件
if ! upload_to_nas "${pack_file}"; then
log_error "tar.gz 文件上传失败"
return 1
fi
# 上传 MD5 校验文件
if ! upload_to_nas "${md5_file}"; then
log_error "MD5 校验文件上传失败"
return 1
fi
# 清理临时文件
log_info "清理临时文件..."
rm -f "${pack_file}" "${md5_file}"
echo ""
print_separator
echo -e "${GREEN} 🎉 打包上传全部完成!${NC}"
print_separator
echo ""
echo -e " 打包文件: ${CYAN}${pack_name}.tar.gz${NC}"
echo -e " MD5校验: ${CYAN}${pack_name}.tar.gz.md5${NC}"
echo -e " 网盘路径: ${CYAN}\\\\${NAS_SERVER}\\${NAS_SHARE}\\${NAS_UPLOAD_DIR}\\${NC}"
echo ""
return 0
}
#======================================================================
# 根据选择执行打包操作
#======================================================================
execute_package() {
case $SELECTED_SYSTEM in
"meeting")
# 会议预定系统
echo ""
echo -e "${CYAN}请选择打包类型:${NC}"
echo " 1) 前后端服务包"
echo " 2) 容器镜像包"
echo " 3) 全部打包"
echo " 4) 全部打包并上传网盘"
echo ""
read -p "请输入选项编号 (1-4): " package_type
case $package_type in
1)
package_meeting_system_services
;;
2)
package_meeting_system_containers
;;
3)
package_meeting_system_services
package_meeting_system_containers
;;
4)
package_meeting_system_services
package_meeting_system_containers
# 询问是否上传
echo ""
read -p "打包完成,是否上传到公司网盘? (y/n): " do_upload
if [ "$do_upload" = "y" ] || [ "$do_upload" = "Y" ]; then
package_and_upload
else
log_info "用户取消上传"
fi
;;
*)
log_error "无效的选项"
exit 1
;;
esac
;;
"devops")
log_warn "运维集控系统打包功能尚未开发"
;;
"voice")
log_warn "语音转录系统打包功能尚未开发"
;;
"nameplate")
log_warn "电子桌牌系统打包功能尚未开发"
;;
"paperless")
log_warn "无纸化信令服务打包功能尚未开发"
;;
*)
log_error "未知的系统类型"
exit 1
;;
esac
}
#======================================================================
# 主函数
#======================================================================
main() {
# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then
log_warn "建议使用root权限运行此脚本"
fi
# 检查自动化部署包目录是否存在
if [ ! -d "$OFFLINE_PACKAGE_PATH" ]; then
log_error "自动化部署包目录不存在: $OFFLINE_PACKAGE_PATH"
read -p "是否创建该目录? (y/n): " create_dir
if [ "$create_dir" = "y" ] || [ "$create_dir" = "Y" ]; then
mkdir -p "$OFFLINE_PACKAGE_PATH"
if [ $? -eq 0 ]; then
log_success "目录创建成功: $OFFLINE_PACKAGE_PATH"
else
log_error "目录创建失败"
exit 1
fi
else
log_info "用户取消操作"
exit 0
fi
fi
# 功能点1: 询问用户选择系统类型
select_system_type
# 功能点2: 执行打包操作
execute_package
echo ""
print_separator
log_success "脚本执行完成!"
print_separator
}
# 执行主函数
main "$@"
......@@ -11,13 +11,13 @@ set -euo pipefail
# 配置区(密码已加密存储)
# ================================
NAS_SERVER="192.168.9.9"
NAS_SHARE="home"
NAS_SHARE="研发管理"
NAS_USER="陈泽键"
NAS_PASS_ENCRYPTED="Mm01ZUwuTUA="
NAS_MOUNT_POINT="/mnt/nas_upload"
# 上传目录(网盘上的目标目录)
NAS_UPLOAD_DIR="容器镜像包"
NAS_UPLOAD_DIR="调试打包路径"
log() {
local level="$1"; shift
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论