mirror of
https://github.com/BgaSol/sol-cloud
synced 2026-04-21 09:07:17 +00:00
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
This commit is contained in:
parent
17c5188967
commit
b6a468a14c
4 changed files with 291 additions and 303 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -37,4 +37,5 @@ docker/data
|
|||
docker/output
|
||||
|
||||
script/collect/
|
||||
script/diff/
|
||||
/docker/script/diff/
|
||||
/docker/script/collect/
|
||||
|
|
|
|||
|
|
@ -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 "请将此文件发送给开发人员进行差异分析"
|
||||
408
script/README.md
408
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的目录)
|
||||
```
|
||||
- 确认在正确的项目目录下执行脚本
|
||||
- 检查项目结构是否完整
|
||||
|
||||
---
|
||||
这样做的好处:
|
||||
- 🚀 **快**:只传输变化的文件
|
||||
- 🎯 **准**:自动识别需要更新的内容
|
||||
- 🛡️ **稳**:最小化更新风险
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@ set -euo pipefail
|
|||
|
||||
# 开发环境差异生成脚本
|
||||
# 基于现场收集的 layers.idx 文件生成差异应用包
|
||||
# 用法: script/compare-sync.sh --layers-collection <path> [--spring-boot-upgraded] [--has-snapshot] [--modules module1,module2]
|
||||
# 用法: script/compare-sync.sh [--layers-collection <path>] [--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 <path> [--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 <path> [--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" <<EOF
|
||||
|
||||
|
|
@ -385,6 +459,42 @@ print_step "=== 所有模块处理完成 ==="
|
|||
print_success "共处理 $processed_modules 个模块"
|
||||
print_info "如需验证结果,请检查各模块的jar文件是否正确更新"
|
||||
|
||||
# === 处理client目录 ===
|
||||
print_step "处理client目录"
|
||||
|
||||
if [[ -d "\$SCRIPT_DIR/client" ]]; then
|
||||
print_info "发现client目录,开始更新..."
|
||||
|
||||
# 查找项目根目录中的client目录
|
||||
CLIENT_TARGET_DIR=""
|
||||
if [[ -d "\$PROJECT_ROOT/docker/output/client" ]]; then
|
||||
CLIENT_TARGET_DIR="\$PROJECT_ROOT/docker/output/client"
|
||||
elif [[ -d "\$PROJECT_ROOT/client" ]]; then
|
||||
CLIENT_TARGET_DIR="\$PROJECT_ROOT/client"
|
||||
fi
|
||||
|
||||
if [[ -n "\$CLIENT_TARGET_DIR" ]]; then
|
||||
print_info "目标client目录: \$CLIENT_TARGET_DIR"
|
||||
|
||||
# 删除现有client目录
|
||||
if [[ -d "\$CLIENT_TARGET_DIR" ]]; then
|
||||
print_info "删除现有client目录: \$CLIENT_TARGET_DIR"
|
||||
rm -rf "\$CLIENT_TARGET_DIR"
|
||||
fi
|
||||
|
||||
# 复制新的client目录
|
||||
print_info "复制新的client目录..."
|
||||
mkdir -p "\$(dirname "\$CLIENT_TARGET_DIR")"
|
||||
cp -r "\$SCRIPT_DIR/client" "\$CLIENT_TARGET_DIR"
|
||||
print_success "client目录更新完成"
|
||||
else
|
||||
print_error "未找到目标client目录位置"
|
||||
print_info "请手动将 \$SCRIPT_DIR/client 复制到正确位置"
|
||||
fi
|
||||
else
|
||||
print_info "差异包中未包含client目录,跳过处理"
|
||||
fi
|
||||
|
||||
EOF
|
||||
|
||||
print_success "差异包生成完成"
|
||||
|
|
@ -392,22 +502,25 @@ print_success "差异包生成完成"
|
|||
|
||||
# 创建压缩包
|
||||
print_step "创建压缩包"
|
||||
cd "$SCRIPT_DIR"
|
||||
tar -czf "$DIFF_DIR/$DIFF_PACKAGE_DIR.tar.gz" "$DIFF_PACKAGE_DIR"
|
||||
print_success "已创建差异包: $DIFF_PACKAGE_DIR.tar.gz"
|
||||
cd "$DIFF_DIR"
|
||||
tar -czf "$ARCHIVE_NAME" "$DIFF_PACKAGE_DIR"
|
||||
print_success "已创建差异包: $ARCHIVE_NAME"
|
||||
|
||||
# 显示文件大小
|
||||
file_size=$(du -h "$DIFF_DIR/$DIFF_PACKAGE_DIR.tar.gz" | cut -f1)
|
||||
file_size=$(du -h "$DIFF_DIR/$ARCHIVE_NAME" | cut -f1)
|
||||
print_info "文件大小: $file_size"
|
||||
|
||||
# 清理临时目录
|
||||
rm -rf "$OUTPUT_DIR"
|
||||
print_info "已清理临时目录"
|
||||
|
||||
# 保留解压目录供后续使用
|
||||
print_info "解压目录已保留: $LAYERS_COLLECTION_DIR"
|
||||
|
||||
# 显示结果
|
||||
print_divider
|
||||
print_step "生成完成"
|
||||
print_info "差异包位置: $DIFF_DIR/$DIFF_PACKAGE_DIR.tar.gz"
|
||||
print_info "差异包位置: $DIFF_DIR/$ARCHIVE_NAME"
|
||||
print_info "处理模块数: $processed_modules"
|
||||
print_info "包含模块: ${collected_modules[*]}"
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue