# 任务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" } ] } ```