From b6a468a14cce4a30f9f6317af530d9a2938adcca Mon Sep 17 00:00:00 2001 From: smile <1372184840@qq.com> Date: Thu, 25 Sep 2025 11:15:52 +0800 Subject: [PATCH] feat(deploy): Refactor deployment script directory structure and optimize differential package generation process - Move collect-layers.sh script to docker/script/ directory - Update compare-sync.sh script path references and automatic unpacking logic``` Reorganize the directory structures of `collect` and `diff`, and place them uniformly under `docker/script/` Optimize the logic for generating differential packages, supporting automatic search and extraction of layers-collection.tar.gz. - Add copying and updating of the client directory. - Simplify naming of compressed packages by using fixed names: diff-package.tar.gz and layers-collection.tar.gz. - Update the README.md documentation to provide clearer usage instructions and directory structure explanations --- .gitignore | 3 +- {script => docker/script}/collect-layers.sh | 32 +- script/README.md | 408 +++++++------------- script/compare-sync.sh | 151 +++++++- 4 files changed, 291 insertions(+), 303 deletions(-) rename {script => docker/script}/collect-layers.sh (80%) diff --git a/.gitignore b/.gitignore index f811d66..15391a8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ docker/data docker/output script/collect/ -script/diff/ \ No newline at end of file +/docker/script/diff/ +/docker/script/collect/ diff --git a/script/collect-layers.sh b/docker/script/collect-layers.sh similarity index 80% rename from script/collect-layers.sh rename to docker/script/collect-layers.sh index c76947e..d6e5b90 100644 --- a/script/collect-layers.sh +++ b/docker/script/collect-layers.sh @@ -8,8 +8,8 @@ set -euo pipefail # 记录开始时间 START_TIME=$(date +%s) -# 计算项目根目录 -BASE_DIR="$(cd "$(dirname "$0")"/.. && pwd)" +# 计算项目根目录 (从 docker/script/ 回到项目根目录) +BASE_DIR="$(cd "$(dirname "$0")"/../.. && pwd)" # 颜色与日志函数 GREEN='\033[0;32m' @@ -27,22 +27,28 @@ print_divider() { echo -e "${YELLOW}----------------------------------------${RE # 生成时间戳 TIMESTAMP=$(date +"%Y%m%d-%H%M%S") COLLECTION_DIR="layers-collection-$TIMESTAMP" -# 脚本同级目录作为临时工作目录 +# docker/script 目录作为临时工作目录 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" OUTPUT_DIR="$SCRIPT_DIR/$COLLECTION_DIR" -# collect目录用于存放最终压缩包 -COLLECT_DIR="$SCRIPT_DIR/collect" +# script/collect目录用于存放最终压缩包(与compare-sync.sh脚本同级) +COLLECT_DIR="$(cd "$(dirname "$0")"/../script && pwd)/collect" print_step "开始收集现场 layers.idx 文件" print_info "项目根目录: $BASE_DIR" print_info "临时目录: $OUTPUT_DIR" print_info "压缩包目录: $COLLECT_DIR" +# 清空collect目录 +if [[ -d "$COLLECT_DIR" ]]; then + print_info "清空collect目录: $COLLECT_DIR" + rm -rf "$COLLECT_DIR"/* +fi + # 创建输出目录和collect目录 mkdir -p "$OUTPUT_DIR" mkdir -p "$COLLECT_DIR" -# 扫描路径列表 +# 扫描路径列表 (相对于项目根目录) SCAN_PATHS=( "docker/output/server" ) @@ -123,16 +129,22 @@ fi # 创建压缩包 print_step "创建压缩包" cd "$SCRIPT_DIR" -if tar -czf "$COLLECT_DIR/$COLLECTION_DIR.tar.gz" "$COLLECTION_DIR"; then - print_success "已创建压缩包: $COLLECTION_DIR.tar.gz" +ARCHIVE_NAME="layers-collection.tar.gz" +if tar -czf "$COLLECT_DIR/$ARCHIVE_NAME" "$COLLECTION_DIR"; then + print_success "已创建压缩包: $ARCHIVE_NAME" else print_error "创建压缩包失败" rm -rf "$OUTPUT_DIR" exit 1 fi +# 创建时间戳信息文件 +TIMESTAMP_FILE="生成于$(date +'%Y-%m-%d %H点%M分%S秒')" +touch "$COLLECT_DIR/$TIMESTAMP_FILE" +print_info "已创建时间戳文件: $TIMESTAMP_FILE" + # 显示文件大小 -file_size=$(du -h "$COLLECT_DIR/$COLLECTION_DIR.tar.gz" | cut -f1) +file_size=$(du -h "$COLLECT_DIR/$ARCHIVE_NAME" | cut -f1) print_info "文件大小: $file_size" # 清理临时目录 @@ -145,7 +157,7 @@ END_TIME=$(date +%s) EXEC_TIME=$((END_TIME - START_TIME)) print_step "收集完成" -print_info "压缩包位置: $COLLECT_DIR/$COLLECTION_DIR.tar.gz" +print_info "压缩包位置: $COLLECT_DIR/$ARCHIVE_NAME" print_info "收集模块数: $collected_count" print_info "执行耗时: ${EXEC_TIME}秒" print_info "请将此文件发送给开发人员进行差异分析" diff --git a/script/README.md b/script/README.md index 77ba221..824fbdd 100644 --- a/script/README.md +++ b/script/README.md @@ -1,303 +1,165 @@ -# 部署脚本 - -# 分层部署差异同步工具 - -这是一套用于 Spring Boot 分层部署的差异同步工具,包含现场数据收集和差异包生成两个核心脚本。 - -## 概述 - -该工具集主要用于解决以下场景: -- **现场环境**:运行生产服务,需要收集当前部署状态 -- **开发环境**:基于现场收集的数据,生成最小化的差异更新包 -- **差异部署**:仅更新变化的依赖和业务代码,减少部署风险和时间 - -## 工具组成 - -### 1. collect-layers.sh - 现场收集脚本 -用于在现场环境收集各模块的 `layers.idx` 文件,这些文件记录了 Spring Boot 分层打包的依赖信息。 - -### 2. compare-sync.sh - 差异生成脚本 -基于收集的现场数据,在开发环境生成差异应用包,包含需要更新的依赖和业务代码。 +# 项目部署工具使用指南 --- -## collect-layers.sh 详细说明 +## 🚀 快速开始(3步搞定) -### 功能描述 -自动发现并收集所有模块的 `layers.idx` 文件,用于后续的差异分析。 - -### 使用方法 +### 第一步:现场收集信息 +在现场服务器上运行收集脚本: ```bash -# 在项目根目录执行 -./script/collect-layers.sh + docker/script/collect-layers.sh ``` +这会生成一个压缩包:`docker/script/collect/layers-collection.tar.gz` -### 工作流程 -1. **自动发现模块**:扫描 `docker/output/server` 路径下的所有模块 -2. **收集 layers.idx**:查找每个模块的 `application/BOOT-INF/layers.idx` 文件 -3. **创建收集包**:将所有收集的文件打包成 `layers-collection-{timestamp}.tar.gz` -4. **输出结果**:压缩包保存在 `script/collect/` 目录下 - -### 输出结构 -``` -script/collect/ -└── layers-collection-20250918-093742.tar.gz - └── layers-collection-20250918-093742/ - ├── module1/ - │ └── layers.idx - ├── module2/ - │ └── layers.idx - └── ... -``` - -### 执行示例 +### 第二步:开发环境生成差异包 +把压缩包拿回开发环境,然后运行: ```bash -$ ./script/collect-layers.sh + cd script + ./compare-sync.sh +``` +这会生成差异包:`docker/script/diff/diff-package.tar.gz` -🚀 开始收集现场 layers.idx 文件 -📘 项目根目录: /path/to/sol-cloud -📘 临时目录: /path/to/script/layers-collection-20250918-093742 -📘 压缩包目录: /path/to/script/collect +### 第三步:现场应用更新 +把差异包带到现场,解压并运行: +```bash + tar -xzf diff-package.tar.gz + cd diff-package + ./apply-diff.sh +``` -🚀 自动发现模块 -📘 扫描: docker/output/server -✅ 发现模块: web-system-8081 -✅ 发现模块: web-file-8082 -✅ 发现模块: gateway-9527 +**就这么简单!🎉** -🚀 收集 layers.idx 文件 -✅ 收集: web-system-8081/layers.idx (2.1K) -✅ 收集: web-file-8082/layers.idx (1.8K) -✅ 收集: gateway-9527/layers.idx (1.5K) +--- -🚀 创建压缩包 -✅ 已创建压缩包: layers-collection-20250918-093742.tar.gz -📘 文件大小: 8.2K +## 📁 工具说明 -🚀 收集完成 -📘 压缩包位置: script/collect/layers-collection-20250918-093742.tar.gz -📘 收集模块数: 3 -📘 执行耗时: 2秒 -✅ 现场收集任务完成! +### 🔍 collect-layers.sh(收集脚本) +**作用**:告诉我现场环境都有什么文件 + +**什么时候用**:需要更新现场环境之前 + +**怎么用**: +```bash + # 在现场服务器上运行 + docker/script/collect-layers.sh +``` + +**会发生什么**: +1. 自动扫描所有服务模块 +2. 记录每个模块的文件信息 +3. 打包成一个压缩文件 +4. 你就得到了"现场环境清单" + +**输出结果**: +``` +docker/script/collect/ +├── layers-collection.tar.gz ← 这个文件带回每个模块的文件信息 +└── 生成于xxx时间戳文件 ← 记录生成时间 +``` + +### ⚖️ compare-sync.sh(对比脚本) +**作用**:对比现场和开发环境,找出差异 + +**什么时候用**:在开发环境,拿到现场收集包之后 + +**怎么用**: +```bash + cd script + ./compare-sync.sh +``` + +**会发生什么**: +1. 自动找到现场收集包并解压 +2. 对比现场和本地的文件差异 +3. 把需要更新的文件打包 +4. 生成自动安装脚本 +5. 你就得到了"差异更新包" + +**输出结果**: +``` +docker/script/diff/ +├── diff-package/ ← 临时文件夹 +│ ├── apply-diff.sh ← 自动安装脚本 +│ ├── modules/ ← 服务端更新文件 +│ └── client/ ← 前端更新文件 +└── diff-package.tar.gz ← 这个文件带到现场 +``` + +### 🛠️ apply-diff.sh(安装脚本) +**作用**:在现场自动安装更新 + +**什么时候用**:在现场环境,解压差异包之后 + +**怎么用**: +```bash + ./apply-diff.sh +``` + +**会发生什么**: +1. 自动找到项目位置 +2. 删除不需要的旧文件 +3. 复制新文件到正确位置 +4. 更新前端文件 +5. 完成!服务器就更新好了 + +--- + +## 💡 实际使用场景 + +### 场景1:普通更新 +```bash + # 现场:收集信息 + docker/script/collect-layers.sh + + # 开发:生成差异包 + cd script && ./compare-sync.sh + + # 现场:应用更新 + tar -xzf diff-package.tar.gz && cd diff-package && ./apply-diff.sh +``` + +### 场景2:只更新特定模块 +```bash + # 只更新web-system-8081模块 + ./compare-sync.sh --modules web-system-8081 +``` + +### 场景3:手动指定收集包位置 +```bash + # 如果收集包在其他地方 + ./compare-sync.sh --layers-collection /path/to/your/collection/ ``` --- -## compare-sync.sh 详细说明 - -### 功能描述 -基于现场收集的 `layers.idx` 文件,生成差异应用包,包含需要更新的依赖jar文件和业务代码。 - -### 使用方法 -```bash -# 基本用法 -./script/compare-sync.sh --layers-collection <收集目录路径> - -# 带可选参数 -./script/compare-sync.sh --layers-collection <收集目录路径> \ - [--spring-boot-upgraded] \ - [--has-snapshot] \ - [--modules module1,module2] -``` - -### 参数说明 -| 参数 | 必需 | 说明 | -|------|------|------| -| `--layers-collection` | ✅ | 现场收集的解压目录路径 | -| `--spring-boot-upgraded` | ❌ | Spring Boot 版本已升级标志 | -| `--has-snapshot` | ❌ | 包含 SNAPSHOT 版本依赖标志 | -| `--modules` | ❌ | 指定处理特定模块,用逗号分隔 | - -### 工作流程 -1. **解析参数**:验证收集目录和可选参数 -2. **发现模块**:扫描收集目录中的所有模块 -3. **比较差异**:对比现场和本地的 `layers.idx` 文件 -4. **生成差异包**: - - 复制变更的依赖jar文件 - - 包含完整的 application 层(业务代码) - - 生成删除列表(多余的依赖) -5. **创建应用脚本**:生成 `apply-diff.sh` 自动化应用脚本 - -### 输出结构 -``` -script/diff/ -└── diff-package-20250918-094857.tar.gz - └── diff-package-20250918-094857/ - ├── apply-diff.sh # 自动应用脚本 - └── modules/ - ├── web-system-8081/ - │ ├── application/ # 业务代码层 - │ ├── files/ # 新增的jar文件 - │ │ ├── spring-boot-starter-web-3.2.1.jar - │ │ └── ... - │ └── delete-list.txt # 需要删除的文件列表 - └── web-file-8082/ - └── ... -``` - -### 使用示例 - -#### 1. 基本使用流程 -```bash -# 步骤1: 解压现场收集的文件 -tar -xzf script/collect/layers-collection-20250918-093742.tar.gz -C /tmp/ - -# 步骤2: 生成差异包 -./script/compare-sync.sh --layers-collection /tmp/layers-collection-20250918-093742/ - -# 步骤3: 将生成的差异包发送到现场 -# script/diff/diff-package-20250918-094857.tar.gz -``` - -#### 2. 指定特定模块 -```bash -./script/compare-sync.sh \ - --layers-collection /tmp/layers-collection-20250918-093742/ \ - --modules web-system-8081,gateway-9527 -``` - -#### 3. 包含可选标志 -```bash -./script/compare-sync.sh \ - --layers-collection /tmp/layers-collection-20250918-093742/ \ - --spring-boot-upgraded \ - --has-snapshot -``` - -### 执行示例 -```bash -$ ./script/compare-sync.sh --layers-collection /tmp/layers-collection-20250918-093742/ - -🚀 开始生成差异包 -📘 收集目录: /tmp/layers-collection-20250918-093742/ -📘 临时目录: /path/to/script/diff-package-20250918-094857 -📘 差异包目录: /path/to/script/diff - -🚀 发现收集的模块 -✅ 发现模块: web-system-8081 -✅ 发现模块: web-file-8082 -✅ 发现模块: gateway-9527 - -🚀 开始处理模块差异 - -🚀 处理模块: web-system-8081 -📘 模块 web-system-8081: 发现 layers.idx 差异 -📘 差异: +5 -2 -[DEP] 完成,复制 5 个 jar - -🚀 处理模块: web-file-8082 -✅ 模块 web-file-8082: layers.idx 一致,但仍需更新 application 层 - -🚀 创建压缩包 -✅ 已创建差异包: diff-package-20250918-094857.tar.gz -📘 文件大小: 125M - -🚀 生成完成 -📘 差异包位置: script/diff/diff-package-20250918-094857.tar.gz -📘 处理模块数: 3 -📘 包含模块: web-system-8081 web-file-8082 gateway-9527 -✅ 请将差异包发送给现场执行 -``` - ---- - -## 现场应用差异包 - -### 应用步骤 -1. **接收差异包**:从开发环境获取 `diff-package-*.tar.gz` -2. **解压差异包**: - ```bash - tar -xzf diff-package-20250918-094857.tar.gz - cd diff-package-20250918-094857/ - ``` -3. **执行应用脚本**: - ```bash - ./apply-diff.sh - ``` - -### apply-diff.sh 功能 -- **自动定位项目**:向上查找包含 `docker/output` 的项目根目录 -- **处理每个模块**: - - 删除多余的依赖文件 - - 复制新增的jar文件到对应目录 - - 更新 application 层(业务代码) -- **智能分类**:根据jar文件名自动判断是否为SNAPSHOT版本 - ---- - -## 最佳实践 - -### 1. 版本控制 -- 保留收集包和差异包,便于问题追溯 -- 建议按时间戳命名,避免文件覆盖 - -### 2. 安全考虑 -- 现场收集前先备份重要数据 -- 差异应用前测试 `apply-diff.sh` 脚本权限 - -### 3. 性能优化 -- 对于大型项目,可使用 `--modules` 参数只处理变更的模块 -- 网络传输时压缩差异包以减少传输时间 - -### 4. 故障排除 -- 检查项目目录结构是否符合预期 -- 确认 `docker/output/server` 目录下有对应的模块 -- 验证 `layers.idx` 文件格式正确 - ---- - -## 目录结构要求 +## 📂 项目目录结构 +你的项目应该长这样: ``` sol-cloud/ ├── docker/ +│ ├── script/ +│ │ ├── collect-layers.sh ← 收集脚本 +│ │ ├── collect/ ← 收集包存放处 +│ │ └── diff/ ← 差异包存放处 │ └── output/ -│ ├── server/ # 服务端模块 -│ │ ├── web-system-8081/ -│ │ │ ├── application/ # 业务代码层 -│ │ │ │ └── BOOT-INF/ -│ │ │ │ └── layers.idx -│ │ │ ├── dependencies/ # 普通依赖层 -│ │ │ │ └── BOOT-INF/lib/ -│ │ │ └── snapshot-dependencies/ # SNAPSHOT依赖层 -│ │ │ └── BOOT-INF/lib/ -│ │ └── ... -│ └── client/ # 客户端模块(可选) +│ ├── server/ ← 后端服务文件 +│ └── client/ ← 前端文件 └── script/ - ├── collect-layers.sh - ├── compare-sync.sh - ├── collect/ # 收集包输出目录 - └── diff/ # 差异包输出目录 + └── compare-sync.sh ← 对比脚本 ``` --- -## 错误处理 +## 🎯 工作原理 -### 常见错误及解决方案 +1. **收集阶段**:记录现场每个模块的"文件指纹" +2. **对比阶段**:把现场指纹和开发环境指纹做对比 +3. **打包阶段**:把有差异的文件打包,生成安装脚本 +4. **应用阶段**:在现场自动替换文件 -1. **未发现任何模块** - ``` - ❌ 未发现任何模块的 layers.idx 文件 - ``` - - 检查 `docker/output/server` 目录是否存在 - - 确认模块目录结构正确 - - -2. **收集目录不存在** - ``` - ❌ 收集目录不存在: /path/to/collection - ``` - - 检查路径是否正确 - - 确认已正确解压收集包 - - -3. **无法找到项目根目录** - ``` - ❌ 无法找到项目根目录(包含docker/output的目录) - ``` - - 确认在正确的项目目录下执行脚本 - - 检查项目结构是否完整 - ---- +这样做的好处: +- 🚀 **快**:只传输变化的文件 +- 🎯 **准**:自动识别需要更新的内容 +- 🛡️ **稳**:最小化更新风险 diff --git a/script/compare-sync.sh b/script/compare-sync.sh index f6ad5c4..e431003 100644 --- a/script/compare-sync.sh +++ b/script/compare-sync.sh @@ -4,7 +4,8 @@ set -euo pipefail # 开发环境差异生成脚本 # 基于现场收集的 layers.idx 文件生成差异应用包 -# 用法: script/compare-sync.sh --layers-collection [--spring-boot-upgraded] [--has-snapshot] [--modules module1,module2] +# 用法: script/compare-sync.sh [--layers-collection ] [--spring-boot-upgraded] [--has-snapshot] [--modules module1,module2] +# 注意:如果不指定--layers-collection参数,会自动解压docker/script/collect/layers-collection.tar.gz # 计算项目根目录(脚本所在目录的上一级) BASE_DIR="$(cd "$(dirname "$0")"/.. && pwd)" @@ -46,11 +47,66 @@ print_error() { echo -e "${RED}❌ $1${RESET}"; } print_step() { echo -e "\n${YELLOW}🚀 $1${RESET}"; } print_divider() { echo -e "${YELLOW}----------------------------------------${RESET}"; } +# 如果未提供layers-collection参数,尝试自动解压docker/script/collect/layers-collection.tar.gz if [[ -z "$LAYERS_COLLECTION_DIR" ]]; then - print_error "Usage: $0 --layers-collection [--spring-boot-upgraded] [--has-snapshot] [--modules module1,module2]" - print_info "Example: tar -xzf script/collect/layers-collection-20241217-143022.tar.gz -C /tmp/" - print_info " $0 --layers-collection /tmp/layers-collection-20241217-143022/" - exit 2 + print_info "未指定--layers-collection参数,尝试自动解压docker/script/collect/layers-collection.tar.gz" + + AUTO_ARCHIVE="$BASE_DIR/docker/script/collect/layers-collection.tar.gz" + print_info "项目根目录: $BASE_DIR" + print_info "查找压缩包: $AUTO_ARCHIVE" + + if [[ ! -f "$AUTO_ARCHIVE" ]]; then + print_error "自动解压失败:未找到压缩包 $AUTO_ARCHIVE" + print_info "当前工作目录: $(pwd)" + print_info "脚本位置: $(dirname "$0")" + print_info "请检查以下可能的位置:" + print_info " - $BASE_DIR/docker/script/collect/layers-collection.tar.gz" + print_info " - $(dirname "$0")/../docker/script/collect/layers-collection.tar.gz" + + # 尝试其他可能的路径 + ALT_ARCHIVE="$(dirname "$0")/../docker/script/collect/layers-collection.tar.gz" + if [[ -f "$ALT_ARCHIVE" ]]; then + print_success "找到备用路径的压缩包: $ALT_ARCHIVE" + AUTO_ARCHIVE="$ALT_ARCHIVE" + else + print_info "请先运行 docker/script/collect-layers.sh 生成压缩包,或手动指定--layers-collection参数" + print_info "Usage: $0 --layers-collection [--spring-boot-upgraded] [--has-snapshot] [--modules module1,module2]" + print_info "Example: tar -xzf docker/script/collect/layers-collection.tar.gz -C /tmp/" + print_info " $0 --layers-collection /tmp/layers-collection-xxx/" + exit 2 + fi + fi + + # 直接在docker/script/collect目录下解压 + COLLECT_DIR="$(dirname "$AUTO_ARCHIVE")" + TARGET_EXTRACT_DIR="$COLLECT_DIR/layers-collection" + + # 如果目标目录已存在,先删除 + if [[ -d "$TARGET_EXTRACT_DIR" ]]; then + rm -rf "$TARGET_EXTRACT_DIR" + print_info "清理已存在的解压目录: $TARGET_EXTRACT_DIR" + fi + + print_info "解压压缩包到: $COLLECT_DIR" + if tar -xzf "$AUTO_ARCHIVE" -C "$COLLECT_DIR"; then + # 查找解压后的目录(通常是layers-collection-*格式) + extracted_dir=$(find "$COLLECT_DIR" -maxdepth 1 -type d -name "layers-collection-*" | head -1) + if [[ -n "$extracted_dir" && -d "$extracted_dir" ]]; then + # 重命名为固定名称,去掉时间戳 + mv "$extracted_dir" "$TARGET_EXTRACT_DIR" + LAYERS_COLLECTION_DIR="$TARGET_EXTRACT_DIR" + print_success "自动解压成功,使用目录: $LAYERS_COLLECTION_DIR" + # 不设置AUTO_CLEANUP_DIR,保留解压文件 + else + print_error "解压后未找到预期的layers-collection目录" + print_info "collect目录内容:" + ls -la "$COLLECT_DIR" + exit 2 + fi + else + print_error "解压失败: $AUTO_ARCHIVE" + exit 2 + fi fi if [[ ! -d "$LAYERS_COLLECTION_DIR" ]]; then @@ -58,14 +114,14 @@ if [[ ! -d "$LAYERS_COLLECTION_DIR" ]]; then exit 2 fi -# 生成时间戳和输出目录 -TIMESTAMP=$(date +"%Y%m%d-%H%M%S") -DIFF_PACKAGE_DIR="diff-package-$TIMESTAMP" -# 脚本同级目录作为临时工作目录 -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -OUTPUT_DIR="$SCRIPT_DIR/$DIFF_PACKAGE_DIR" -# diff目录用于存放最终压缩包 -DIFF_DIR="$SCRIPT_DIR/diff" +# 生成输出目录 +DIFF_PACKAGE_DIR="diff-package" +# diff目录用于存放最终压缩包(与collect同级) +DIFF_DIR="$BASE_DIR/docker/script/diff" +# 临时工作目录也放在docker/script/diff下 +OUTPUT_DIR="$DIFF_DIR/$DIFF_PACKAGE_DIR" +# 压缩包固定名称 +ARCHIVE_NAME="diff-package.tar.gz" # 参数与生效路径回显 print_step "开始生成差异包" @@ -76,16 +132,23 @@ if [[ "$SPRING_BOOT_UPGRADED" == true || "$HAS_SNAPSHOT" == true ]]; then print_info "flags: $( [[ "$SPRING_BOOT_UPGRADED" == true ]] && echo -n "spring-boot-upgraded " )$( [[ "$HAS_SNAPSHOT" == true ]] && echo -n "has-snapshot" )" fi -# 创建差异包目录结构 +# 清理并创建差异包目录结构 +if [[ -d "$OUTPUT_DIR" ]]; then + rm -rf "$OUTPUT_DIR" + print_info "清理已存在的临时目录: $OUTPUT_DIR" +fi mkdir -p "$OUTPUT_DIR/modules" +mkdir -p "$OUTPUT_DIR/client" mkdir -p "$DIFF_DIR" # 发现收集的模块 print_step "发现收集的模块" collected_modules=() + for module_dir in "$LAYERS_COLLECTION_DIR"/*/; do if [[ -d "$module_dir" ]]; then module_name=$(basename "$module_dir") + if [[ -f "$module_dir/layers.idx" ]]; then # 检查是否指定了特定模块 if [[ -n "$SPECIFIC_MODULES" ]]; then @@ -378,6 +441,17 @@ EOF rm -f "$only_in_new" "$only_in_collected" done +# 复制client目录 +print_step "复制client目录" +CLIENT_SOURCE_DIR="$BASE_DIR/docker/output/client" +if [[ -d "$CLIENT_SOURCE_DIR" ]]; then + print_info "复制client目录: $CLIENT_SOURCE_DIR -> $OUTPUT_DIR/client/" + rsync -a --delete "$CLIENT_SOURCE_DIR/" "$OUTPUT_DIR/client/" + print_success "client目录复制完成" +else + print_info "未找到client目录: $CLIENT_SOURCE_DIR" +fi + # 完成apply脚本 cat >> "$apply_script" <