fix: reduce infra feedback CLI friction
This commit is contained in:
@@ -66,8 +66,20 @@ export async function runSshPlaywrightOperation(
|
||||
const localDir = resolve(options.localDir);
|
||||
const submitCommand = builders.buildRouteCommand(invocation.route, ["sh", "-c", remotePlaywrightSubmitScript(remoteDir), "unidesk-playwright-submit"], { stdin: true });
|
||||
const submit = await executor.runRemoteCommand(submitCommand, userScript);
|
||||
if (submit.exitCode !== 0) {
|
||||
throw new Error(`ssh playwright submit failed: exitCode=${submit.exitCode}; stdoutTail=${JSON.stringify(submit.stdout.slice(-1000))}; stderrTail=${JSON.stringify(submit.stderr.slice(-1000))}`);
|
||||
const submitRecovery = submit.exitCode !== 0 && isRecoverableSubmitTimeout(submit)
|
||||
? {
|
||||
recovered: true,
|
||||
reason: "submit-short-connection-timeout",
|
||||
remoteDir,
|
||||
runId,
|
||||
exitCode: submit.exitCode,
|
||||
stdoutTail: submit.stdout.slice(-1000),
|
||||
stderrTail: submit.stderr.slice(-1000),
|
||||
next: "submit may have been cut by the 60s trans runtime limit after the background job was launched; polling remote status by remoteDir/runId",
|
||||
}
|
||||
: null;
|
||||
if (submit.exitCode !== 0 && submitRecovery === null) {
|
||||
throw new Error(`ssh playwright submit failed: exitCode=${submit.exitCode}; remoteDir=${remoteDir}; runId=${runId}; stdoutTail=${JSON.stringify(submit.stdout.slice(-1000))}; stderrTail=${JSON.stringify(submit.stderr.slice(-1000))}`);
|
||||
}
|
||||
const manifest = await pollRemoteManifest(invocation.route, executor, builders, remoteDir, runId, options);
|
||||
const artifacts: Array<SshVerifiedDownloadResult & { manifestBytes: number | null; manifestSha256: string | null }> = [];
|
||||
@@ -124,6 +136,8 @@ export async function runSshPlaywrightOperation(
|
||||
remoteCommand: {
|
||||
exitCode: manifest.exitCode,
|
||||
submitExitCode: submit.exitCode,
|
||||
submitRecovered: submitRecovery !== null,
|
||||
submitRecovery,
|
||||
submitStdoutBytes: Buffer.byteLength(submit.stdout, "utf8"),
|
||||
submitStderrBytes: Buffer.byteLength(submit.stderr, "utf8"),
|
||||
},
|
||||
@@ -272,17 +286,23 @@ async function pollRemoteManifest(
|
||||
lastStatus = status;
|
||||
if (status.exitCode === 0 && status.stdout.includes(manifestEnd)) return parseRemoteManifest(status, remoteDir, runId);
|
||||
if (status.exitCode !== 0 && !/status\t(?:pending|running)/u.test(status.stdout)) {
|
||||
throw new Error(`ssh playwright status failed: exitCode=${status.exitCode}; stdoutTail=${JSON.stringify(status.stdout.slice(-1000))}; stderrTail=${JSON.stringify(status.stderr.slice(-1000))}`);
|
||||
throw new Error(`ssh playwright status failed: exitCode=${status.exitCode}; remoteDir=${remoteDir}; runId=${runId}; stdoutTail=${JSON.stringify(status.stdout.slice(-1000))}; stderrTail=${JSON.stringify(status.stderr.slice(-1000))}`);
|
||||
}
|
||||
await sleep(options.pollIntervalMs);
|
||||
}
|
||||
throw new Error(`ssh playwright timed out waiting for remote job after ${options.waitTimeoutMs}ms; lastStdoutTail=${JSON.stringify(lastStatus?.stdout.slice(-1000) ?? "")}; lastStderrTail=${JSON.stringify(lastStatus?.stderr.slice(-1000) ?? "")}`);
|
||||
throw new Error(`ssh playwright timed out waiting for remote job after ${options.waitTimeoutMs}ms; remoteDir=${remoteDir}; runId=${runId}; lastStdoutTail=${JSON.stringify(lastStatus?.stdout.slice(-1000) ?? "")}; lastStderrTail=${JSON.stringify(lastStatus?.stderr.slice(-1000) ?? "")}`);
|
||||
}
|
||||
|
||||
function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
|
||||
}
|
||||
|
||||
function isRecoverableSubmitTimeout(submit: SshCaptureResult): boolean {
|
||||
if (submit.exitCode === 124) return true;
|
||||
const combined = `${submit.stdout}\n${submit.stderr}`;
|
||||
return /(?:timed?\s*out|timeout|60s|exitCode=124|signal\s+TERM|signal\s+KILL)/iu.test(combined);
|
||||
}
|
||||
|
||||
function remotePlaywrightSubmitScript(remoteDir: string): string {
|
||||
const runner = Buffer.from(remotePlaywrightRunnerScript(remoteDir), "utf8").toString("base64");
|
||||
return [
|
||||
|
||||
Reference in New Issue
Block a user