diff --git a/config/hwlab-hwpod-nodes.yaml b/config/hwlab-hwpod-nodes.yaml index d159eaf7..2dbfc2bc 100644 --- a/config/hwlab-hwpod-nodes.yaml +++ b/config/hwlab-hwpod-nodes.yaml @@ -43,6 +43,7 @@ targets: configPath: "C:\\Users\\liang\\.hwlab\\config.json" credentialPath: "C:\\Users\\liang\\.hwlab\\hwpod-node.token" logPath: "C:\\Users\\liang\\.hwlab\\logs\\hwlab-node.log" + applyTimeoutMs: 90000 artifact: metadataUrl: https://lab-dev.hwpod.com/v1/hwlab-node/update channel: stable @@ -94,6 +95,7 @@ targets: configPath: "C:\\Users\\lyon\\.hwlab\\config.json" credentialPath: "C:\\Users\\lyon\\.hwlab\\hwpod-node.token" logPath: "C:\\Users\\lyon\\.hwlab\\logs\\hwlab-node.log" + applyTimeoutMs: 90000 artifact: metadataUrl: https://lab-dev.hwpod.com/v1/hwlab-node/update channel: stable diff --git a/scripts/src/hwlab-hwpod-node.ts b/scripts/src/hwlab-hwpod-node.ts index a5822349..bb9d2d31 100644 --- a/scripts/src/hwlab-hwpod-node.ts +++ b/scripts/src/hwlab-hwpod-node.ts @@ -63,6 +63,7 @@ interface HwpodNodeSpec { configPath: string; credentialPath: string; logPath: string; + applyTimeoutMs: number; }; artifact: { metadataUrl: string; channel: string; platform: string; localPath: string | null; localVersion: string | null }; workspace: { allowedRoots: string[]; defaultRoot: string }; @@ -242,6 +243,7 @@ function readSpec(node: string, lane: string): HwpodNodeSpec { configPath: text(runtime.configPath, `targets.${node}.runtime.configPath`), credentialPath: text(runtime.credentialPath, `targets.${node}.runtime.credentialPath`), logPath: text(runtime.logPath, `targets.${node}.runtime.logPath`), + applyTimeoutMs: positiveInteger(runtime.applyTimeoutMs, `targets.${node}.runtime.applyTimeoutMs`), }, artifact: { metadataUrl: text(artifact.metadataUrl, `targets.${node}.artifact.metadataUrl`), @@ -482,7 +484,7 @@ function applyDesktop(spec: HwpodNodeSpec, artifact: ArtifactBundle, credential: configSha256: sha256Hex(`${JSON.stringify(config, null, 2)}\n`), credentialBase64: Buffer.from(`${credential}\n`, "utf8").toString("base64"), }; - const result = runPowerShell(spec.windowsRoute, desktopApplyScript(payload), 55000); + const result = runPowerShell(spec.windowsRoute, desktopApplyScript(payload), spec.runtime.applyTimeoutMs); if (!commandSucceeded(result)) throw new Error(`部署 Windows HWPOD 节点失败:${compactFailure(result)}`); const parsed = parseJsonRecord(result.stdout); if (parsed?.ok !== true) throw new Error(`Windows HWPOD 节点部署未就绪:${JSON.stringify(parsed ?? { stdout: result.stdout.slice(-600) })}`); @@ -730,6 +732,12 @@ function bool(value: unknown, path: string): boolean { return value; } +function positiveInteger(value: unknown, path: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 1) throw new Error(`${path} 必须是正整数`); + return parsed; +} + function secretPath(sourceRef: string): string { if (isAbsolute(sourceRef) || sourceRef.includes("..")) throw new Error(`Secret sourceRef 必须是相对路径且不能包含 ..:${sourceRef}`); return join(SECRET_ROOT, sourceRef);