fix(openflare): Pages 部署包经 upload 存储下载

Agent 下载 Pages 包时统一通过 upload_id 走文件存储 API;legacy
artifact_path 仅用于一次性回填 upload 并清空路径。部署视图暴露
upload_id,并补充回归测试与 changelog。
This commit is contained in:
ryan
2026-06-20 19:21:12 +08:00
parent e077b12328
commit 6c46f5d24f
4 changed files with 251 additions and 25 deletions
@@ -12,6 +12,7 @@ import (
"mime/multipart"
"net/http/httptest"
"os"
"path/filepath"
"testing"
"github.com/Rain-kl/Wavelet/internal/db"
@@ -159,6 +160,7 @@ func TestUploadDeploymentStoresPackageInUploadFramework(t *testing.T) {
"index.html": "ok",
})), "root")
require.NoError(t, err)
assert.NotZero(t, deployment.UploadID)
storedDeployment, err := model.GetPagesDeploymentByID(ctx, deployment.ID)
require.NoError(t, err)
@@ -170,6 +172,86 @@ func TestUploadDeploymentStoresPackageInUploadFramework(t *testing.T) {
assert.Equal(t, int64(1), uploadCount)
}
func TestOpenDeploymentPackageHydratesLegacyArtifactPath(t *testing.T) {
cleanup := setupPagesTestDB(t)
defer cleanup()
_, disableStorage := setupPagesStorageMock(t)
defer disableStorage()
ctx := context.Background()
project, err := CreateProject(ctx, Input{
Name: "Legacy Site",
Slug: "openspeedtest",
Enabled: true,
})
require.NoError(t, err)
artifactDir := filepath.Join(t.TempDir(), "pages", "artifacts", project.Slug)
require.NoError(t, os.MkdirAll(artifactDir, 0o755))
artifactPath := filepath.Join(artifactDir, "legacy-checksum.zip")
require.NoError(t, os.WriteFile(artifactPath, testPagesZip(t, map[string]string{"index.html": "legacy"}), 0o644))
deployment := &model.PagesDeployment{
ProjectID: project.ID,
DeploymentNumber: 1,
Checksum: "legacy-checksum",
Status: model.PagesDeploymentStatusUploaded,
ArtifactPath: artifactPath,
FileCount: 1,
TotalSize: 10,
CreatedBy: "test",
}
require.NoError(t, db.DB(ctx).Create(deployment).Error)
require.NoError(t, db.DB(ctx).Create(&model.PagesDeploymentFile{
DeploymentID: deployment.ID,
Path: "index.html",
Size: 6,
Checksum: "legacy-checksum",
}).Error)
_, err = ActivateDeployment(ctx, project.ID, deployment.ID)
require.NoError(t, err)
require.NoError(t, db.DB(ctx).Create(&model.ConfigVersion{
Version: "v2026-legacy",
SnapshotJSON: fmt.Sprintf(`{"routes":[{"upstream_type":"pages","pages_deployment":{"deployment_id":%d}}]}`, deployment.ID),
MainConfig: "",
RenderedConfig: "",
SupportFilesJSON: "[]",
Checksum: "legacy-config-checksum",
IsActive: true,
CreatedBy: "test",
}).Error)
packageObj, fileName, err := OpenDeploymentPackage(ctx, deployment.ID)
require.NoError(t, err)
defer packageObj.Body.Close()
assert.Equal(t, fmt.Sprintf("pages-deployment-%d.zip", deployment.ID), fileName)
body, err := io.ReadAll(packageObj.Body)
require.NoError(t, err)
reader, err := zip.NewReader(bytes.NewReader(body), int64(len(body)))
require.NoError(t, err)
require.Len(t, reader.File, 1)
assert.Equal(t, "index.html", reader.File[0].Name)
storedDeployment, err := model.GetPagesDeploymentByID(ctx, deployment.ID)
require.NoError(t, err)
assert.NotZero(t, storedDeployment.UploadID)
assert.Empty(t, storedDeployment.ArtifactPath)
var uploadCount int64
require.NoError(t, db.DB(ctx).Model(&model.Upload{}).Count(&uploadCount).Error)
assert.Equal(t, int64(1), uploadCount)
packageObj2, _, err := OpenDeploymentPackage(ctx, deployment.ID)
require.NoError(t, err)
defer packageObj2.Body.Close()
body2, err := io.ReadAll(packageObj2.Body)
require.NoError(t, err)
assert.Equal(t, body, body2)
}
func TestOpenDeploymentPackageRequiresActiveConfigSnapshot(t *testing.T) {
cleanup := setupPagesTestDB(t)
defer cleanup()