节点在线、应用在线、配置在线使用令牌查询
|
# Tasks
## Task 1: 撤销 Stardust.Server ç«¯æµæ°´çº¿å®žçް
- [ ] SubTask 1.1: åˆ é™¤ `Stardust.Server/Services/PipelineService.cs`
- [ ] SubTask 1.2: åˆ é™¤ `Stardust.Server/Controllers/PipelineWebhookController.cs`
- [ ] SubTask 1.3: åˆ é™¤ `Stardust.Server/Controllers/PipelineController.cs`
- [ ] SubTask 1.4: 从 `Stardust.Server/Startup.cs` 移除 `services.AddSingleton<PipelineService>()` 一行åŠå…¶ä¸Šæ–¹ç©ºè¡Œï¼ˆå¦‚å˜åœ¨ï¼‰
- [ ] SubTask 1.5: 编译 `Stardust.Server` é¡¹ç›®ï¼Œç¡®è®¤æ— æ®‹ç•™å¼•ç”¨é”™è¯¯
- [ ] SubTask 1.6: 全局æœç´¢ `Stardust.Server.Services.PipelineService` / `Stardust.Server.Controllers.PipelineWebhook` / `Stardust.Server.Controllers.Pipeline` 命åç©ºé—´å¼•ç”¨ï¼Œç¡®è®¤æ— æ®‹ç•™ï¼ˆæ³¨é‡Š/åŽ†å²æ–‡æ¡£é™¤å¤–)
## Task 2: 扩展 Web 端 PipelineServiceï¼Œæ”¯æŒ webhook å…¥å£
- [ ] SubTask 2.1: 在 `Stardust.Web/Services/PipelineService.cs` 新增 public 方法 `HandleWebhookAsync(String token, String body, String signature)`,返回 `Task<Object>`
- å†…éƒ¨ä¾æ¬¡ï¼štoken 空检查 → `AppPipeline.FindByToken` → `Enable` 检查 → Secret ç¾åæ ¡éªŒ → `ParsePayload` → `MatchBranch` → `IsDuplicate` → 创建 `AppPipelineRun` → å¼‚æ¥ `Task.Run(() => RunAsync(...))`
- ç«‹å³è¿”回 `{result:"accepted", runId, status}` ç‰å¯¹è±¡
- [ ] SubTask 2.2: 从 Server 端è¿ç§» `ParsePayload(String body)` ç§æœ‰æ–¹æ³•åŠå…¶ä¾èµ–的内部类 `WebhookPayload` / `WebhookCommit` / `WebhookAuthor` / `WebhookObject`,放在 `PipelineService.cs` åŒæ–‡ä»¶æˆ– `Internal` 命å空间下
- [ ] SubTask 2.3: 从 Server 端è¿ç§» `VerifySignature(String secret, String body, String signature)` ç§æœ‰æ–¹æ³•(HMAC-SHA256,GitHub `sha256=` å‰ç¼€å‰¥ç¦»ï¼‰
- [ ] SubTask 2.4: 从 Server 端è¿ç§» `MatchBranch(String pattern, String actual)` ç§æœ‰æ–¹æ³•(精确 + 末尾通é…符)
- [ ] SubTask 2.5: 从 Server 端è¿ç§» `IsDuplicate(Int32 pipelineId, String commitId, TimeSpan window)` ç§æœ‰æ–¹æ³•(5 分钟窗å£ï¼ŒæŽ’除 Failed/Cancelled)
- [ ] SubTask 2.6: webhook 创建 run æ—¶æ£ç¡®å¡«å……å—æ®µï¼š`TriggerSource="webhook"`ã€`Status=Pending`ã€`CommitId` / `CommitMessage` / `CommitAuthor` / `CommitTime` / `Branch` / `BuildNodeId` æ¥è‡ª payload + pipeline
- [ ] SubTask 2.7: `HandleWebhookAsync` ä¸é˜»å¡žï¼Œrun 创建åŽç«‹å³ return,编排通过 `Task.Run` 异æ¥è¿›è¡Œ
- [ ] SubTask 2.8: 确认ä¾èµ– `DeployService` 与 `ITracer` å·²é€šè¿‡çŽ°æœ‰æž„é€ å‡½æ•°æ³¨å…¥ï¼Œæ— éœ€æ”¹ DI 注册
## Task 3: 修改 RunAsyncï¼Œè¡¥ã€Œä½¿ç”¨ç‰ˆæœ¬ã€æ¥éª¤
- [ ] SubTask 3.1: 在 `RunAsync` ä¸ç¼–译完æˆã€æŸ¥åˆ° `version` åŽï¼Œæ–°å¢ž `if (version != null) { app.Version = version.Version; app.Update(); }` 一段
- [ ] SubTask 3.2: `run.AppVersionId = version?.Id ?? 0` ä¿ç•™
- [ ] SubTask 3.3: 验è¯å½“ `buildNode.UploadPackage=false` æ—¶ä¸æŸ¥ versionã€ä¸æ›´æ–° `app.Version`,但 `AutoDeploy=true` æ—¶ä»è°ƒ `Control(install)`
- [ ] SubTask 3.4: 确认 `RunAsync` 整体仅通过 `_deployService.Compile` / `_deployService.Control` 调用底层,ä¸ç›´æŽ¥æž„é€ `CompileCommand`ã€ä¸ç›´æŽ¥è°ƒ `SendNodeCommand*`ã€ä¸ç›´æŽ¥å†™ `AppDeployHistory`
## Task 4: 新增 Web 端 PipelineWebhookController
- [ ] SubTask 4.1: 新建 `Stardust.Web/Areas/Deployment/Controllers/PipelineWebhookController.cs`
- 命å空间 `Stardust.Web.Areas.Deployment.Controllers`
- ç±» `PipelineWebhookController`ï¼Œæž„é€ å‡½æ•°æ³¨å…¥ `PipelineService` 与 `ITracer`
- ä¸åŠ `[ApiFilter]`(webhook æ— ç™»å½•é‰´æƒï¼‰
- [ ] SubTask 4.2: ç±»ä¸ŠåŠ `[Route("Pipeline/[action]")]` 显å¼è·¯ç”±ï¼Œä¿è¯ URL 为 `/Pipeline/Webhook`
- [ ] SubTask 4.3: 实现 `[HttpPost] Webhook(String token)` action:
- `Request.EnableBuffering()` + reset Position 读å–原始 body
- 读 `X-Hub-Signature-256` header
- 调 `_pipelineService.HandleWebhookAsync(token, body, signature)` 返回对象
- 用 `ITracer` 包一层 span(name=`Pipeline-Webhook`),tag token + body 长度 + 返回结果
- [ ] SubTask 4.4: body 读å–使用 `StreamReader` + `leaveOpen: true`ï¼Œè¯»åŽ reset `Request.Body.Position = 0` 以便åŽç»ç¾åé‡ç®—(如有需è¦ï¼‰
## Task 5: æ ¡éªŒ CopyWebhook URL
- [ ] SubTask 5.1: 确认 `AppPipelineController.CopyWebhook(id)` 返回的 URL 形如 `{serviceAddress}/Pipeline/Webhook?token={pipeline.Token}`
- [ ] SubTask 5.2: 确认 `serviceAddress` å–自 `StarSetting.Current.ServiceAddress` ä¸é¦–个 http å‰ç¼€åœ°å€
- [ ] SubTask 5.3: æµæ°´çº¿ä¸å˜åœ¨æ—¶è¿”回 `Json(500, "æµæ°´çº¿ä¸å˜åœ¨")`
## Task 6: 编译与回归验è¯
- [ ] SubTask 6.1: 编译 `Stardust.Web`,通过
- [ ] SubTask 6.2: 编译 `Stardust.Server`,通过
- [ ] SubTask 6.3: è¿è¡Œ `Stardust.ServerTests/Deployment/PipelineTests.cs`,`MatchBranch` / `FindByToken` / `Token 自动生æˆ` 测试通过(ä¸ä¾èµ– Server 端 PipelineService)
- [ ] SubTask 6.4: æ‰‹åŠ¨éªŒè¯ UI「触å‘ã€æŒ‰é’®ï¼ˆè°ƒç”¨ `AppPipelineController.Trigger` → `PipelineService.Trigger` → `RunAsync`)功能æ£å¸¸
- [ ] SubTask 6.5: æ‰‹åŠ¨éªŒè¯ UI「é‡è·‘ã€æŒ‰é’®ï¼ˆè°ƒç”¨ `AppPipelineRunController.Reprocess` → `PipelineService.Reprocess` → `RunAsync`)功能æ£å¸¸
- [ ] SubTask 6.6: 手动验è¯ã€Œç¼–è¯‘ä¸Šä¼ ã€ã€Œä½¿ç”¨ç‰ˆæœ¬ã€ã€Œå‘布ã€ä¸‰ä¸ªæ‰‹åЍæ“作按钮功能ä¸å—å½±å“
- [ ] SubTask 6.7: 使用 curl/Postman 模拟 GitHub push 调用 `/Pipeline/Webhook?token=...`,确认返回 `{result:"accepted"}` 且åŽå° run 创建æˆåŠŸ
# Task Dependencies
- Task 1 与 Task 2/3/4 å¯å¹¶è¡Œï¼ˆTask 1 æ˜¯åˆ é™¤ï¼ŒTask 2/3/4 是新建/扩展)
- Task 3 ä¾èµ– Task 2(`HandleWebhookAsync` 调用 `RunAsync`,RunAsync æ”¹é€ è¦åœ¨ webhook 接入å‰å®Œæˆæˆ–åŒæ—¶è¿›è¡Œï¼‰
- Task 4 ä¾èµ– Task 2(controller 调用 `HandleWebhookAsync`)
- Task 5 独立,å¯ä¸Žä»»æ„任务并行
- Task 6 ä¾èµ– Task 1-4 全部完æˆ
|