installerbuilder/tasks/task25-升级管理器.md

346 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 任务25升级管理器
## 任务描述
实现升级管理器,用于处理应用程序的升级,包括版本检测、升级包下载、安装和回滚等功能。升级管理器将确保应用程序能够平滑地升级到新版本,同时保留用户配置和数据。
## 实现步骤
1. 定义升级管理器接口:
- 在`internal/upgrade`包中创建`manager.go`文件
- 定义UpgradeManager接口
```go
type UpgradeManager interface {
// CheckForUpgrade 检查是否有可用升级
CheckForUpgrade(currentVersion string) (*UpgradeInfo, error)
// DownloadUpgrade 下载升级包
DownloadUpgrade(upgradeInfo *UpgradeInfo, targetPath string) error
// PerformUpgrade 执行升级
PerformUpgrade(upgradePath string, options UpgradeOptions) (*UpgradeResult, error)
// RollbackUpgrade 回滚升级
RollbackUpgrade(backupPath string) error
// GetUpgradeHistory 获取升级历史
GetUpgradeHistory() ([]UpgradeRecord, error)
}
```
- 定义UpgradeInfo结构体
```go
type UpgradeInfo struct {
Version string // 版本号
ReleaseDate time.Time // 发布日期
ReleaseNotes string // 发布说明
DownloadURL string // 下载URL
ChecksumURL string // 校验和URL
Checksum string // 校验和
Size int64 // 大小(字节)
RequiredVersion string // 最低要求版本
Metadata map[string]string // 元数据
}
```
- 定义UpgradeOptions结构体
```go
type UpgradeOptions struct {
BackupPath string // 备份路径
KeepBackup bool // 是否保留备份
SkipPreCheck bool // 是否跳过预检查
ForceUpgrade bool // 是否强制升级
MigrateConfig bool // 是否迁移配置
Timeout time.Duration // 超时时间
Variables map[string]string // 升级变量
}
```
- 定义UpgradeResult结构体
```go
type UpgradeResult struct {
Success bool // 是否成功
PreviousVersion string // 之前的版本
NewVersion string // 新版本
BackupPath string // 备份路径
Duration time.Duration // 升级持续时间
Logs []string // 升级日志
Errors []error // 升级错误
}
```
- 定义UpgradeRecord结构体
```go
type UpgradeRecord struct {
Timestamp time.Time // 时间戳
FromVersion string // 从版本
ToVersion string // 到版本
Success bool // 是否成功
BackupPath string // 备份路径
Duration time.Duration // 升级持续时间
Notes string // 备注
}
```
2. 创建默认升级管理器:
- 创建`default_manager.go`文件
- 定义DefaultUpgradeManager结构体实现UpgradeManager接口
```go
type DefaultUpgradeManager struct {
logger log.Logger
resourceMgr resource.ResourceManager
configDir string
upgradeURL string
httpClient *http.Client
historyFile string
}
```
- 实现构造函数:
```go
func NewDefaultUpgradeManager(logger log.Logger, resourceMgr resource.ResourceManager, configDir string, upgradeURL string) (*DefaultUpgradeManager, error) {
historyFile := filepath.Join(configDir, "upgrade_history.json")
return &DefaultUpgradeManager{
logger: logger,
resourceMgr: resourceMgr,
configDir: configDir,
upgradeURL: upgradeURL,
httpClient: &http.Client{Timeout: 30 * time.Second},
historyFile: historyFile,
}, nil
}
```
3. 实现版本检测:
- 实现CheckForUpgrade方法检查是否有可用升级
- 从升级服务器获取版本信息
- 比较版本号
- 验证版本兼容性
4. 实现升级包下载:
- 实现DownloadUpgrade方法下载升级包
- 支持断点续传
- 验证下载完整性
- 处理网络错误
5. 实现升级执行:
- 实现PerformUpgrade方法执行升级
- 创建备份
- 解压升级包
- 执行升级脚本
- 迁移配置和数据
- 记录升级历史
6. 实现升级回滚:
- 实现RollbackUpgrade方法回滚升级
- 恢复备份
- 清理临时文件
- 更新升级历史
- 验证回滚结果
7. 实现升级历史管理:
- 实现GetUpgradeHistory方法获取升级历史
- 记录升级操作
- 管理历史记录
- 提供查询功能
- 支持导出历史
8. 实现升级工具:
- 创建版本比较工具
- 实现校验和验证工具
- 创建配置迁移工具
- 实现升级通知工具
## 单元测试要求
1. 测试版本检测:
- 验证CheckForUpgrade方法
- 测试版本比较
- 测试服务器响应处理
- 测试错误处理
2. 测试升级包下载:
- 验证DownloadUpgrade方法
- 测试断点续传
- 测试完整性验证
- 测试网络错误处理
3. 测试升级执行:
- 验证PerformUpgrade方法
- 测试备份创建
- 测试升级脚本执行
- 测试配置迁移
4. 测试升级回滚:
- 验证RollbackUpgrade方法
- 测试备份恢复
- 测试临时文件清理
- 测试回滚验证
5. 测试升级历史管理:
- 验证GetUpgradeHistory方法
- 测试历史记录
- 测试查询功能
- 测试导出功能
6. 测试升级工具:
- 验证版本比较工具
- 测试校验和验证工具
- 测试配置迁移工具
- 测试升级通知工具
## 依赖关系
- 依赖任务01项目初始化
- 依赖任务02日志系统实现
- 依赖任务03错误处理框架
- 依赖任务04资源管理器实现
- 依赖任务05配置模型定义
- 依赖任务06配置加载器
- 被任务20命令行界面依赖
## 完成标准
1. UpgradeManager接口已定义并文档完善
2. DefaultUpgradeManager实现了所有接口方法
3. 版本检测功能正常工作
4. 升级包下载功能正常工作
5. 升级执行功能正常工作
6. 升级回滚功能正常工作
7. 升级历史管理功能正常工作
8. 升级工具功能正常工作
9. 所有单元测试通过
10. 代码符合项目的Go语言开发规范
11. 升级管理器能够处理各种升级场景
12. 支持所有需求文档中的升级相关功能
## 升级流程
### 检查升级流程
```mermaid
flowchart TD
A[开始检查升级] --> B[获取当前版本]
B --> C[请求升级服务器]
C -->|服务器响应| D[解析版本信息]
D --> E[比较版本号]
E -->|有新版本| F[返回升级信息]
E -->|无新版本| G[返回空]
C -->|请求失败| H[返回错误]
```
### 执行升级流程
```mermaid
flowchart TD
A[开始执行升级] --> B[验证升级包]
B -->|验证失败| C[返回错误]
B -->|验证成功| D[创建备份]
D --> E[解压升级包]
E --> F[执行预升级脚本]
F -->|脚本失败| G[回滚升级]
F -->|脚本成功| H[替换文件]
H --> I[迁移配置]
I --> J[执行后升级脚本]
J -->|脚本失败| G
J -->|脚本成功| K[更新版本信息]
K --> L[记录升级历史]
L --> M[清理临时文件]
M --> N[返回升级结果]
G --> O[恢复备份]
O --> P[返回错误]
```
### 回滚升级流程
```mermaid
flowchart TD
A[开始回滚升级] --> B[验证备份]
B -->|验证失败| C[返回错误]
B -->|验证成功| D[停止应用]
D --> E[恢复备份文件]
E --> F[恢复配置]
F --> G[更新版本信息]
G --> H[记录回滚历史]
H --> I[清理临时文件]
I --> J[返回回滚结果]
```
## 升级服务器API
升级管理器将与升级服务器通信获取版本信息和下载升级包。以下是升级服务器API的示例
### 获取最新版本信息
```
GET /api/v1/versions/latest
```
响应:
```json
{
"version": "1.2.0",
"releaseDate": "2023-05-15T10:00:00Z",
"releaseNotes": "Bug fixes and performance improvements",
"downloadURL": "https://example.com/downloads/installer-builder-1.2.0.zip",
"checksumURL": "https://example.com/downloads/installer-builder-1.2.0.zip.sha256",
"checksum": "a1b2c3d4e5f6...",
"size": 15728640,
"requiredVersion": "1.0.0",
"metadata": {
"critical": "false",
"releaseType": "stable"
}
}
```
### 获取特定版本信息
```
GET /api/v1/versions/{version}
```
响应:
```json
{
"version": "1.1.0",
"releaseDate": "2023-03-10T09:00:00Z",
"releaseNotes": "Added new features",
"downloadURL": "https://example.com/downloads/installer-builder-1.1.0.zip",
"checksumURL": "https://example.com/downloads/installer-builder-1.1.0.zip.sha256",
"checksum": "f6e5d4c3b2a1...",
"size": 14680064,
"requiredVersion": "1.0.0",
"metadata": {
"critical": "false",
"releaseType": "stable"
}
}
```
### 获取版本列表
```
GET /api/v1/versions
```
响应:
```json
{
"versions": [
{
"version": "1.2.0",
"releaseDate": "2023-05-15T10:00:00Z",
"releaseType": "stable"
},
{
"version": "1.1.0",
"releaseDate": "2023-03-10T09:00:00Z",
"releaseType": "stable"
},
{
"version": "1.0.0",
"releaseDate": "2023-01-20T08:00:00Z",
"releaseType": "stable"
}
]
}
```