版本:v1.1 | 日期:2026-08-09(v1.0 于 2026-08-06) 对应需求:流水线编译上传后自动部署 v1.1 修订:移除"未配置节点时自动回退全部启用节点",改为仅部署勾选节点、不回退、未勾选则标记 Failed(克制原则:一条流水线对应一个分支)
流水线(AppPipeline)把「代码提交 → 编译 → 上传 → 部署」串成自动流程:
- 监听 Git 仓库 webhook 或用户手动触发。
- 向编译节点下发
deploy/compile/Build-Upload命令。 - 编译节点拉代码、编译、打包、上传 zip 到 StarServer。
- StarServer 收到编译命令回包后,根据流水线设置决定是否自动部署。
- 若开启自动部署,向目标节点下发
deploy/install。
| 实体 | 说明 |
|---|---|
| AppPipeline | 流水线配置:关联应用部署集、编译节点、部署节点、分支、自动部署开关 |
| AppPipelineRun | 一次流水线运行记录,含状态、版本、起止时间 |
| AppPipelineStep | 单次运行中的步骤(Build / Deploy),记录命令Id与状态 |
| AppBuildNode | 编译节点配置 |
| AppDeployNode | 部署节点配置 |
| AppDeployVersion | 上传生成的应用版本 |
| NodeCommand | StarServer 下发给节点的命令 |
| AppDeployHistory | 部署历史日志 |
Pending -> Building -> UploadSucceeded -> Deploying -> Success
| | | | |
| | | | +-- 全部 Deploy 步骤成功
| | | +-- 已下发 deploy/install
| | +-- Build 命令成功(CommandReply)
| +-- 已下发 deploy/compile
+-- 刚创建 run
失败分支:
Building/Deploying -> Failed(命令回包为错误或下发失败)
Building/Deploying -> Cancelled(用户取消)
用户/Webhook
|
v
PipelineService.Trigger / HandleWebhookAsync
|
v
PipelineService.RunAsync
|
v
DeployService.Compile 下发 deploy/compile/Build-Upload
| ^
| |
v |
DeployAgent.OnCompile |
| |
+-- Git 拉取 |
+-- 编译项目 |
+-- 打包 zip |
+-- UploadBuildPackageSync |
| |
v |
StarServer DeployController.UploadBuildFile
| |
+-- 保存附件 |
+-- 创建/更新 AppDeployVersion
+-- 写历史 "UploadBuildFile"
| |
v |
StarClient 框架自动回复 CommandReply
| |
v |
NodeService.CommandReply |
| |
+-- ProcessPipelineReplyAsync |
| |
+-- 找到 Build 步骤 |
+-- 写历史 "编译完成" |
+-- 取最新 AppDeployVersion |
+-- 使用版本(app.Version) |
+-- 判断是否 AutoDeploy |
| |
+-- 否 -> Success |
| |
+-- 是 -> Deploying |
| |
v |
DispatchDeployAsync |
| |
+-- 仅按勾选的 DeployNodeIds 创建 Deploy 步骤
+-- 未勾选任何节点则不下发、不回退(避免误部署)
+-- 下发 deploy/install
| |
v |
StarAgent 执行安装 |
| |
v |
CommandReply(Deploy) |
| |
v |
ProcessPipelineReplyAsync Deploy 分支
+-- 写历史 "部署成功"
+-- 全部完成 -> Success
在 NodeService.ProcessPipelineReplyAsync 中:
| 条件 | 行为 | 历史记录 |
|---|---|---|
| 编译失败 | run -> Failed,Remark=错误信息 | - |
| 编译成功但取不到版本 | run -> Failed,Remark=未产出可部署版本 | pipeline/autoDeploy 失败 |
| 编译成功且 AutoDeploy=false | run -> Success,Remark=自动部署未开启 | pipeline/autoDeploy 成功 |
| 编译成功且 AutoDeploy=true | run -> Deploying,调用 DispatchDeployAsync | pipeline/autoDeploy 成功 |
| 无可用部署节点 | run -> Failed,Remark=未找到可部署节点 | deploy/install 失败 |
| 部分节点下发失败 | run -> Failed,Remark=部署命令下发失败 | - |
| 全部 Deploy 步骤成功 | run -> Success | deploy/install/Deploy 成功 |
设计约束:一条流水线对应一个分支,部署范围必须显式、可控。 仅部署流水线「勾选」的部署节点,不自动回退到全部启用节点,避免误部署到非预期环境。
NodeService.DispatchDeployAsync 按以下规则选择节点:
- 仅使用
AppPipeline.DeployNodeIds(逗号分隔的 AppDeployNode.Id,即页面上勾选的节点)。 - 若
DeployNodeIds为空:不下发任何部署命令、不回退,仅记录pipeline/autoDeploy失败日志;上层据此将 run 标记为Failed(Remark=未找到可部署节点),不出现假成功。 - 以下节点会被跳过(Skipped):
AppDeployNode不存在AppDeployNode未启用AppDeployNode.DeployId与流水线不匹配- 对应
Node不存在
- 命令下发异常会标记为 Failed。
| 文件 | 职责 |
|---|---|
Stardust.Web/Services/PipelineService.cs |
流水线入口:创建 run、下发编译命令 |
Stardust.Web/Services/DeployService.cs |
编译/发布控制封装 |
Stardust.Server/Services/NodeService.cs |
命令回包处理、流水线续跑、自动部署下发 |
Stardust.Server/Controllers/DeployController.cs |
UploadBuildFile 接口:接收 zip 并创建版本 |
DeployAgent/DeployService.cs |
编译节点执行:拉代码、编译、打包、上传 |
关键历史 Action:
| Action | 含义 |
|---|---|
deploy/compile/Build-Upload |
编译阶段完成 |
pipeline/version |
取到/未取到可部署版本 |
pipeline/autoDeploy |
自动部署判定与下发记录 |
deploy/install |
部署命令下发/完成 |
deploy/install/Deploy |
单个 Deploy 步骤成功 |
现象:AppDeployHistory 中看到 UploadBuildFile 和 上传成功,但后续没有 deploy/install 或看到 部署完成 却没有实际安装。
常见原因:
- 流水线未开启「自动部署」。检查
AppPipeline.AutoDeploy。 - 流水线未勾选「部署节点」。当前版本遵循克制原则:未勾选任何节点则不下发、不回退,run 直接标记
Failed(Remark=未找到可部署节点),不会再出现"上传完成即假成功"的假象。 - 配置的部署节点不存在、未启用、或 DeployId 不匹配,导致全部 Skipped(仍会下发 0 个,run 标记 Failed)。
- 命令下发异常(如节点不在线),导致 Failed。
排查方法:
查看 AppDeployHistory 中 pipeline/autoDeploy 和 deploy/install 记录;
查看 AppPipelineRun.Remark 和 AppPipelineStep.Message。