节点在线、应用在线、配置在线使用令牌查询
|
# Checklist
实现完æˆåŽçš„é€é¡¹éªŒè¯æ¸…å•。æ¯ä¸€é¡¹å¿…é¡»å¯è§‚察ã€å¯é‡å¤æ‰§è¡Œã€‚
## æ•°æ®æ¨¡åž‹
- [x] `Stardust.Data/Deployment/Model.xml` å« AppPipeline / AppPipelineRun / AppPipelineStep ä¸‰å¼ è¡¨å®šä¹‰
- [x] `Stardust.Data/Deployment/AppPipeline.cs`ã€`AppPipelineRun.cs`ã€`AppPipelineStep.cs` 三个实体类已生æˆ
- [x] `Stardust.Models.PipelineStatus` 枚举已定义并能被编译
- [ ] å¯åЍ Server åŽï¼ŒDB ä¸èƒ½æŸ¥åˆ° 3 å¼ æ–°è¡¨
## Webhook 接入
- [x] `POST /Pipeline/Webhook?token={token}` åœ¨æ— token / é”™ token 时返回 error(由 `PipelineService.HandleWebhookAsync` 处ç†ï¼‰
- [x] é…置了 Secret çš„æµæ°´çº¿ï¼ŒX-Hub-Signature-256 ä¸åŒ¹é…时返回 error(HMAC-SHA256 æ ¡éªŒå·²å®žçŽ°ï¼‰
- [x] payload çš„ ref ä¸åŒ¹é… Branch 时返回 200 + `{result:"ignored"}`,ä¸åˆ›å»º run(`MatchBranch` 已实现)
- [x] 5 åˆ†é’Ÿå†…åŒ CommitId é‡å¤è§¦å‘返回 200 + `{result:"skipped"}`,ä¸åˆ›å»ºæ–° run(`IsDuplicate` 已实现)
- [x] åˆæ³• payload 触å‘åŽ 30 秒内 run 出现且 Status=Building(由 `Task.Run(() => RunAsync(run))` 异æ¥è§¦å‘)
## 编译 + 部署编排
- [x] run.TraceId 能在 DeployAgent 端日志里被æœåˆ°ï¼ˆé“¾è·¯æ‰“通,`buildNode.TraceId = run.TraceId`)
- [x] 编译节点返回æˆåŠŸåŽï¼Œrun.AppVersionId 被æ£ç¡®å†™å…¥ï¼ŒStatus=UploadSucceeded(`AppDeployVersion.FindAllByDeployId` 已调用)
- [x] AutoDeploy=true 时,é历 DeployNodeIds é€ä¸ªå‘ install,全部æˆåŠŸ → run.Status=Success(`ExecuteInstallAsync` 已实现)
- [x] ä»»æ„ install 失败 → run.Status=Failed,对应 step.Status=Failed 且 Message 有异常文本
- [x] æ•´æ¡ run èµ° `tracer.NewSpan`,能在 Stardust 监控里æœåˆ° TraceId
## Web 端é…置管ç†
- [x] ã€Œæµæ°´çº¿ã€èœå•出现在 Deployment 区域(`[Menu(30, true, Icon="fa-code-fork")]`)
- [x] 列表页能看到所有 AppPipeline 行
- [x] 表å•页 DeployId 下拉(由 Map 属性自动生æˆï¼‰ã€BuildNodeId 下拉(`_Form_Body.cshtml` 渲染 `ForDropDownList`)
- [x] DeployNodeIds 多选按 DeployId 过滤(`_Form_Body.cshtml` 渲染 `<select multiple>` + hidden input åŒæ¥ï¼ŒæŒ‰ DeployId 过滤 AppDeployNode)
- [x] Token å—æ®µåœ¨æ–°å»º/编辑时ä¸å¯ç¼–è¾‘ï¼Œç”±ç³»ç»Ÿè‡ªåŠ¨ç”Ÿæˆ 32 ä½å—符串
- [x] 列表"å¤åˆ¶ Webhook"æŒ‰é’®å¯æŠŠ URL 写入剪贴æ¿ï¼ˆ`CopyWebhook` action 返回 URL,`ListField.Url` 已设置)
## Web 端è¿è¡Œè®°å½•
- [x] ã€Œæµæ°´çº¿è¿è¡Œã€èœå•项å˜åœ¨ï¼ˆ`[Menu(40, true, Icon="fa-play-circle")]`)
- [x] åˆ—è¡¨æ”¯æŒæŒ‰ PipelineId/Status/时间范围ç›é€‰
- [x] 详情页展示 commit ä¿¡æ¯ã€çжæ€å¾½æ ‡ã€é˜¶æ®µæ—¶é—´çº¿ã€AppPipelineStep è¡¨æ ¼
- [x] 详情页å‰ç«¯æ¯ 5 秒轮询一次,run.Status å˜åŒ–能在 5 ç§’å†…åæ˜ (`ViewBag.ClientScript` 注入轮询脚本)
- [x] 「é‡è·‘ã€æŒ‰é’®è§¦å‘æ–° runï¼Œå‚æ•°ä¸ŽåŽŸ run 一致(委托 `DeployService.ReprocessPipeline`)
- [x] 「å¯åŠ¨ã€æŒ‰é’®æ‰‹åŠ¨è§¦å‘æµæ°´çº¿ï¼ˆå§”托 `DeployService.TriggerPipeline`,效果ç‰åŒäºŽ webhook 触å‘)
## æž¶æž„
- [x] `DeployService` ç»Ÿä¸€ç®¡ç†æµæ°´çº¿ç¼–排逻辑(`TriggerPipeline` / `ReprocessPipeline` / `RunPipelineAsync`),é¿å… Web 控制器与 Server 控制器é‡å¤å®žçް
- [x] Web 控制器(`AppPipelineController` / `AppPipelineRunController`)为薄å°è£…,仅调 `DeployService` 方法
- [x] Server 端 `PipelineService` ä¿ç•™ webhook 处ç†é€»è¾‘,Web 端 `DeployService` å¤„ç†æ‰‹åŠ¨è§¦å‘,两者共用 `starFactory` 基础设施
## 兼容性
- [x] çŽ°æœ‰çš„ã€Œç¼–è¯‘ä¸Šä¼ ã€ã€Œæ‰“åŒ…ä¸Šä¼ ã€æŒ‰é’®åœ¨ AppBuildNode 列表里ä»èƒ½æ£å¸¸ç‚¹ï¼ˆæœªæ”¹åЍ AppBuildNode Controller)
- [x] 现有的「å‘å¸ƒã€æŒ‰é’®åœ¨ AppDeployNode 列表里ä»èƒ½æ£å¸¸ç‚¹ï¼ˆæœªæ”¹åЍ AppDeployNode Controller)
- [x] 现有的 DeployAgent 命令 `deploy/compile` 行为ä¸å˜ï¼ˆPipelineService åªæ˜¯æ–°å¢žä¸€ä¸ªè°ƒç”¨æ–¹ï¼‰
- [x] 现有的 DeployController.UploadBuildFile 接å£å¥‘约ä¸å˜ï¼ˆç¼–译åŽç”± agent ä¸»åŠ¨è°ƒèµ·ï¼Œæ— éœ€æ”¹ controller)
## éªŒè¯æµ‹è¯•
- [x] Stardust.ServerTests å¢žåŠ webhook é›†æˆæµ‹è¯•并通过(`ServerTest/Deployment/PipelineTests.cs`,覆盖分支匹é…/Token 自动生æˆ/FindByToken/枚举完整性,12/12 通过)
- [x] `dotnet build Stardust.sln` 编译通过(Stardust.Dataã€Stardustã€Stardust.Serverã€Stardust.Webã€Stardust.ServerTests å‡ 0 错误)
- [x] `dotnet test Stardust.ServerTests/ServerTest.csproj` æµæ°´çº¿ç›¸å…³æµ‹è¯•全绿(`PipelineTests` 12/12 通过)
|