import { Environment } from '../environment'; import { IDeployProgressEvent } from './types'; /** 可编排的资源类型 */ export type ResourceType = 'database' | 'functions' | 'app' | 'hosting' | 'gateway'; /** 声明式部署选项 */ export interface IDeployOptions { /** 解析后的 cloudbaserc 配置(ConfigParser 输出,含 envOverrides 已应用) */ config: Record; envId: string; /** 只部署指定类型 */ only?: ResourceType[]; /** 跳过指定类型 */ skip?: ResourceType[]; /** dry-run:只输出计划不实际部署 */ dryRun?: boolean; /** 项目根目录(默认 process.cwd()) */ cwd?: string; /** 已存在资源(函数)的覆盖更新:yes=true 直接放行(AI Agent / CI 场景) */ yes?: boolean; /** 已存在资源(函数)的覆盖更新确认回调:返回 true 部署、false 跳过(CLI 注入 autoConfirm) */ confirmUpdate?: (item: IDeployPlanItem) => Promise; /** 同类型资源最大并行数,默认 1(串行)。仅作用于同类型连续实例之间,跨类型依赖顺序不变 */ concurrency?: number; /** 失败后继续部署其余资源(database 失败仍强制中断) */ continueOnError?: boolean; /** 函数资源内部部署阶段进度(校验、构建、推送、部署、等待可用、访问配置) */ onProgress?: (event: IDeployProgressEvent & { resourceType: ResourceType; resourceName: string; }) => void; log?: { info?: (msg: string) => void; success?: (msg: string) => void; warn?: (msg: string) => void; error?: (msg: string) => void; }; } /** 部署计划项(资源级) */ export interface IDeployPlanItem { type: ResourceType; name: string; /** 动作分类:create=新建;update=覆盖更新已有资源;skip=已存在且配置一致;conflict=检测到冲突(需中断);deploy=直传覆盖(无存在性概念) */ status: 'create' | 'update' | 'skip' | 'conflict' | 'deploy'; /** 动作说明(用户可读) */ action: string; /** 变更字段明细(如 database 迁移聚合、gateway 路由差异等) */ changes?: Array<{ field: string; from?: string; to?: string; }>; /** 资源级详情子行(dry-run 树状渲染用):如函数 runtime/构建策略、迁移逐条状态等 */ details?: Array<{ label: string; value: string; }>; } /** 部署结果 */ export interface IDeployResult { plan: IDeployPlanItem[]; results: Array<{ type: ResourceType; name: string; ok: boolean; url?: string; /** 资源部署器返回的结构化详情(函数包含策略、镜像、访问地址、阶段状态和耗时) */ detail?: Record; error?: string; errorCode?: string; failedStage?: string; /** 原始异常中的请求 ID(若可提取),用于定位平台侧接口报错 */ requestId?: string; /** 未执行原因:skip=未变更自动跳过;no-confirm=无确认机制保守跳过;skipped-by-user=用户拒绝覆盖 */ reason?: 'skip' | 'no-confirm' | 'skipped-by-user'; }>; } /** * 声明式部署编排器 * 顺序:database → functions → app → hosting → gateway * 支持 dry-run / only / skip / 幂等重试(database 失败/冲突会中断后续步骤) */ export declare class DeployOrchestrator { private environment; private databaseDeployer; private functionDeployer; private staticDeployer; private gatewayDeployer; constructor(environment: Environment); /** * 计算部署计划(dry-run 输出) */ deployPlan(options: IDeployOptions): Promise; /** * 执行部署 * * 编排模型:plan 按「连续相同资源类型」切成 segments,segment 之间严格按 * DEPLOY_ORDER 串行;segment 内部按 concurrency 并行执行。失败中断策略: * - 默认 fail-fast:任一资源失败即中断后续(return) * - continueOnError:非 database 资源失败仍继续,最后汇总失败数 * - database 失败始终强制中断(无论是否 continueOnError) */ deploy(options: IDeployOptions): Promise; /** * 归一化声明式函数配置:直接消费 cloudbaserc 的嵌套形状(imageConfig.build), * 不做字段平铺映射;非 HTTP 函数原样返回。 */ private normalizeFunctionConfigs; /** * 将扁平 plan 按「连续相同资源类型」切成有序 segments * * segment 之间保留 DEPLOY_ORDER 依赖顺序(严格串行);segment 内部为同类型 * 多实例,可并行执行。例如 [db, fnA, fnB, hostingX, hostingY, gateway] * → [[db], [fnA, fnB], [hostingX, hostingY], [gateway]] */ private segmentPlan; /** * 构建完整部署计划(按依赖顺序 + only/skip 过滤) * * 通过查询云端状态判定每个资源的动作: * - database:先按迁移文件做 preview,再聚合成单条资源级计划项(pending→create,存在 conflict→conflict,全部 applied→不出现在 plan) * - functions:ListFunctions 判断是否已存在 → create / update(不做本地 hash / 字段 diff) * - app:describeAppInfo 判断是否已存在 → create / update * - hosting:直传覆盖(无存在性概念) * - gateway:planRoutes 对比云端路由 → create / update / skip(含变更字段明细) * 云端查询失败时降级为保守判定(全 create),不影响 dry-run 展示。 */ private buildPlan; /** * 按资源类型构建计划(拆分自 buildPlan,控制圈复杂度) */ private buildPlanForType; /** * database 计划:preview 聚合成单条资源级计划项 */ private buildDatabasePlan; /** * app 计划:按云端存在性 → create / update */ private buildAppPlan; /** * hosting 计划:每次直传覆盖(无本地指纹 skip) */ private buildHostingPlans; /** * gateway 计划:planRoutes 对比云端路由 → create / update / skip(含变更字段明细) */ private buildGatewayPlans; /** * 查询环境中已存在的函数名集合(查询失败返回空集,降级为全新建判定) */ private listExistingFunctionNames; /** * 判断云应用是否已存在(查询失败返回 false,降级为新建判定) */ private appExists; /** * 执行单个计划步骤 */ private executeStep; /** * 轻量 inline 守卫:配置合法 + 目录存在(validateProject 接线点) */ private guardConfig; }