feat(apk): 增加公开APK管理接口和CI/CD工作流
- 新增获取最新APK版本信息和下载APK的公开接口 - 更新README文档,添加APK管理接口的使用说明 - 实现CI/CD工作流,支持自动构建和部署 - 优化APK存储逻辑,确保只保留最新APK文件
This commit is contained in:
@@ -172,6 +172,22 @@ func (s *LocalStore) SaveAPK(runtimeVersion string, reader io.Reader) (string, e
|
||||
if err := os.MkdirAll(apkDir, 0o755); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// 删除所有旧的 APK 文件,只保留最新的一个
|
||||
entries, err := os.ReadDir(apkDir)
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return "", err
|
||||
}
|
||||
for _, e := range entries {
|
||||
if !e.IsDir() && strings.HasSuffix(e.Name(), ".apk") {
|
||||
oldPath := filepath.Join(apkDir, e.Name())
|
||||
if err := os.Remove(oldPath); err != nil {
|
||||
// 记录错误但不中断,继续保存新文件
|
||||
fmt.Printf("Warning: failed to remove old APK %s: %v\n", oldPath, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
filename := fmt.Sprintf("%s.apk", runtimeVersion)
|
||||
apkPath := filepath.Join(apkDir, filename)
|
||||
tmpPath := apkPath + ".tmp"
|
||||
@@ -243,6 +259,20 @@ func (s *LocalStore) ListAPKs() ([]model.APKInfo, error) {
|
||||
CreatedAt: fi.ModTime(),
|
||||
})
|
||||
}
|
||||
// 按版本号降序排列,确保最新的在前
|
||||
sort.Slice(out, func(i, j int) bool { return out[i].RuntimeVersion > out[j].RuntimeVersion })
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (s *LocalStore) GetLatestAPK() (*model.APKInfo, error) {
|
||||
apks, err := s.ListAPKs()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(apks) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
// 由于 SaveAPK 会删除旧文件,理论上只会有一个 APK
|
||||
// 但为了安全起见,返回版本号最大的那个
|
||||
return &apks[0], nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user