修复 Agent 部署 Pages 问题

This commit is contained in:
ryan
2026-06-21 11:53:54 +08:00
parent 36f11c6ecb
commit 13a375e042
19 changed files with 755 additions and 59 deletions
+27
View File
@@ -11,6 +11,7 @@ import (
"github.com/Rain-kl/Wavelet/internal/apps/openflare/pages"
"github.com/Rain-kl/Wavelet/internal/apps/openflare/websocket"
"github.com/Rain-kl/Wavelet/internal/common/response"
"github.com/Rain-kl/Wavelet/pkg/protocol"
"github.com/gin-gonic/gin"
)
@@ -153,6 +154,32 @@ func ReportApplyLogHandler(c *gin.Context) {
c.JSON(http.StatusOK, response.OK(log))
}
// GetPagesDeploymentHashHandler returns the upload SHA-256 hash for a Pages deployment package.
// @Summary 查询 Pages 部署包哈希
// @Description 返回 upload 框架记录的 SHA-256 哈希,供 Agent 对比本地缓存并按需拉取部署包
// @Tags openflare-agent
// @Produce json
// @Security AgentTokenAuth
// @Param deployment_id path int true "部署 ID"
// @Success 200 {object} response.Any{data=protocol.PagesDeploymentHashResponse}
// @Failure 400 {object} response.Any "参数错误"
// @Failure 401 {object} response.Any "Token 无效"
// @Router /api/v1/agent/pages/deployments/{deployment_id}/hash [get]
func GetPagesDeploymentHashHandler(c *gin.Context) {
deploymentID, ok := pagesDeploymentIDParam(c)
if !ok {
return
}
hash, err := pages.GetDeploymentPackageHash(c.Request.Context(), deploymentID)
if apiutil.AbortBadRequestOnError(c, err) {
return
}
c.JSON(http.StatusOK, response.OK(protocol.PagesDeploymentHashResponse{
DeploymentID: deploymentID,
Hash: hash,
}))
}
// DownloadPagesPackageHandler streams the Pages deployment artifact to an authenticated agent.
// @Summary 下载 Pages 部署包
// @Description 流式下载指定部署的静态资源压缩包,供 Agent 边缘分发
+1
View File
@@ -24,5 +24,6 @@ const (
errPagesPackagePathEmpty = "pages 部署包路径为空"
errPagesPackageUploadMissing = "pages 部署包上传记录不存在"
errPagesPackageNotInActiveConfig = "pages 部署尚未进入激活配置"
errPagesDeploymentHashMissing = "pages 部署包哈希缺失"
errPagesInvalidSnapshotFormat = "配置快照格式无效"
)
+41 -12
View File
@@ -16,10 +16,8 @@ import (
"time"
"github.com/Rain-kl/Wavelet/internal/apps/upload"
uploadstorage "github.com/Rain-kl/Wavelet/internal/apps/upload/storage"
"github.com/Rain-kl/Wavelet/internal/db"
"github.com/Rain-kl/Wavelet/internal/model"
"github.com/Rain-kl/Wavelet/internal/repository"
"github.com/Rain-kl/Wavelet/internal/storage"
"gorm.io/gorm"
)
@@ -354,6 +352,45 @@ func ActivateDeployment(ctx context.Context, projectID uint, deploymentID uint)
return GetProject(ctx, project.ID)
}
// GetDeploymentPackageHash returns the SHA-256 hash of the deployment package from upload storage.
func GetDeploymentPackageHash(ctx context.Context, deploymentID uint) (string, error) {
deployment, err := model.GetPagesDeploymentByID(ctx, deploymentID)
if err != nil {
return "", err
}
if err = ensureDeploymentInActiveSnapshot(ctx, deployment.ID); err != nil {
return "", err
}
if deployment.UploadID == 0 {
if err := ensureDeploymentUploadRecord(ctx, deployment); err != nil {
return "", err
}
deployment, err = model.GetPagesDeploymentByID(ctx, deploymentID)
if err != nil {
return "", err
}
}
if deployment.UploadID == 0 {
hash := strings.TrimSpace(deployment.Checksum)
if hash == "" {
return "", errors.New(errPagesDeploymentHashMissing)
}
return hash, nil
}
uploadRecord, err := upload.GetActiveUpload(ctx, deployment.UploadID)
if err != nil {
return "", fmt.Errorf("pages 部署包不存在: %w", err)
}
hash := strings.TrimSpace(uploadRecord.Hash)
if hash == "" {
hash = strings.TrimSpace(deployment.Checksum)
}
if hash == "" {
return "", errors.New(errPagesDeploymentHashMissing)
}
return hash, nil
}
// OpenDeploymentPackage opens the deployment artifact from the upload storage framework.
func OpenDeploymentPackage(ctx context.Context, deploymentID uint) (*storage.Object, string, error) {
deployment, err := model.GetPagesDeploymentByID(ctx, deploymentID)
@@ -373,15 +410,7 @@ func OpenDeploymentPackage(ctx context.Context, deploymentID uint) (*storage.Obj
}
func openDeploymentPackageFromUpload(ctx context.Context, deployment *model.PagesDeployment, fileName string) (*storage.Object, string, error) {
uploadRecord, err := repository.GetActiveUploadByID(ctx, deployment.UploadID)
if err != nil {
return nil, "", fmt.Errorf("pages 部署包不存在: %w", err)
}
return openDeploymentPackageFromUploadRecord(ctx, &uploadRecord, fileName)
}
func openDeploymentPackageFromUploadRecord(ctx context.Context, uploadRecord *model.Upload, fileName string) (*storage.Object, string, error) {
obj, err := uploadstorage.OpenStoredObject(ctx, uploadRecord)
obj, _, err := upload.OpenStoredUpload(ctx, deployment.UploadID)
if err != nil {
return nil, "", fmt.Errorf("pages 部署包不存在: %w", err)
}
@@ -423,7 +452,7 @@ func hydrateLegacyDeploymentUpload(
return nil, errors.New(errPagesPackagePathEmpty)
}
if deployment.UploadID > 0 {
uploadRecord, err := repository.GetActiveUploadByID(ctx, deployment.UploadID)
uploadRecord, err := upload.GetActiveUpload(ctx, deployment.UploadID)
if err == nil {
return &uploadRecord, nil
}