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

9.8 KiB
Raw Blame History

任务25升级管理器

任务描述

实现升级管理器,用于处理应用程序的升级,包括版本检测、升级包下载、安装和回滚等功能。升级管理器将确保应用程序能够平滑地升级到新版本,同时保留用户配置和数据。

实现步骤

  1. 定义升级管理器接口:

    • internal/upgrade包中创建manager.go文件
    • 定义UpgradeManager接口
      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结构体
      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结构体
      type UpgradeOptions struct {
          BackupPath      string            // 备份路径
          KeepBackup      bool              // 是否保留备份
          SkipPreCheck    bool              // 是否跳过预检查
          ForceUpgrade    bool              // 是否强制升级
          MigrateConfig   bool              // 是否迁移配置
          Timeout         time.Duration     // 超时时间
          Variables       map[string]string // 升级变量
      }
      
    • 定义UpgradeResult结构体
      type UpgradeResult struct {
          Success         bool              // 是否成功
          PreviousVersion string            // 之前的版本
          NewVersion      string            // 新版本
          BackupPath      string            // 备份路径
          Duration        time.Duration     // 升级持续时间
          Logs            []string          // 升级日志
          Errors          []error           // 升级错误
      }
      
    • 定义UpgradeRecord结构体
      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接口
      type DefaultUpgradeManager struct {
          logger          log.Logger
          resourceMgr     resource.ResourceManager
          configDir       string
          upgradeURL      string
          httpClient      *http.Client
          historyFile     string
      }
      
    • 实现构造函数:
      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. 支持所有需求文档中的升级相关功能

升级流程

检查升级流程

flowchart TD
    A[开始检查升级] --> B[获取当前版本]
    B --> C[请求升级服务器]
    C -->|服务器响应| D[解析版本信息]
    D --> E[比较版本号]
    E -->|有新版本| F[返回升级信息]
    E -->|无新版本| G[返回空]
    C -->|请求失败| H[返回错误]

执行升级流程

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[返回错误]

回滚升级流程

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

响应:

{
  "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}

响应:

{
  "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

响应:

{
  "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"
    }
  ]
}