From a4a475de5317418034d735573a2eba1274bd734d Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 29 Jun 2026 09:38:32 +0000 Subject: [PATCH] fix: validate JD01 source browser launch --- config/hwlab-node-lanes.yaml | 2 +- scripts/src/hwlab-node/source-workspace.ts | 26 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/config/hwlab-node-lanes.yaml b/config/hwlab-node-lanes.yaml index 7471d306..4e00e516 100644 --- a/config/hwlab-node-lanes.yaml +++ b/config/hwlab-node-lanes.yaml @@ -823,7 +823,7 @@ lanes: npx --version install: executor: host - dependencyCommand: npm install --no-save --package-lock=false --ignore-scripts --no-audit --no-fund playwright@1.59.1 + dependencyCommand: npm install --no-save --package-lock=false --ignore-scripts --no-audit --no-fund playwright@1.59.1 && npx playwright install-deps chromium browserCommand: PLAYWRIGHT_BROWSERS_PATH=0 npx playwright install chromium stateDir: /var/lib/unidesk/hwlab-source-workspace-install timeoutSeconds: 900 diff --git a/scripts/src/hwlab-node/source-workspace.ts b/scripts/src/hwlab-node/source-workspace.ts index f95ae2ba..9a3f0502 100644 --- a/scripts/src/hwlab-node/source-workspace.ts +++ b/scripts/src/hwlab-node/source-workspace.ts @@ -644,7 +644,8 @@ function sourceWorkspaceStatusFromFields(fields: Record, exitCod && missingFiles.length === 0 && fields.playwrightPackagePresent === "yes" && fields.browserExecutablePresent === "yes" - && fields.launcherImportOk === "yes"; + && fields.launcherImportOk === "yes" + && fields.browserLaunchOk === "yes"; return { ok, workspace: fields.workspace || null, @@ -672,6 +673,9 @@ function sourceWorkspaceStatusFromFields(fields: Record, exitCod browserExecutableErrorTail: fields.browserExecutableErrorTail || null, launcherImportOk: fields.launcherImportOk === "yes", launcherImportExitCode: numericField(fields.launcherImportExitCode), + browserLaunchOk: fields.browserLaunchOk === "yes", + browserLaunchExitCode: numericField(fields.browserLaunchExitCode), + browserLaunchErrorTail: fields.browserLaunchErrorTail || null, statusShortLines: numericField(fields.statusShortLines), statusShortPreview: fields.statusShortPreview || null, valuesPrinted: false, @@ -876,6 +880,23 @@ function sourceWorkspaceStatusScript(spec: HwlabRuntimeLaneSpec, sourceWorkspace " launcher_import_exit=$?", " [ \"$launcher_import_exit\" = 0 ] && launcher_import_ok=yes", "fi", + "browser_launch_ok=no", + "browser_launch_exit=", + "browser_launch_error_tail=", + "if command -v node >/dev/null 2>&1 && [ \"$launcher_import_ok\" = yes ]; then", + " (cd \"$workspace\" && PLAYWRIGHT_BROWSERS_PATH=0 timeout 30s node --input-type=module - <<'NODE'", + "const doctor = await import('./scripts/src/browser-launcher.mjs').then((mod) => mod.browserDoctor());", + "if (doctor.status !== 'pass') {", + " console.error(JSON.stringify({ failureCode: doctor.failureCode, error: doctor.error, browser: doctor.browser, managedBrowser: doctor.managedBrowser, remediation: doctor.remediation }));", + " process.exit(1);", + "}", + "console.log(JSON.stringify({ status: doctor.status, browser: doctor.browser, managedBrowser: doctor.managedBrowser }));", + "NODE", + " ) >/tmp/hwlab-source-workspace-browser-launch.out 2>/tmp/hwlab-source-workspace-browser-launch.err", + " browser_launch_exit=$?", + " browser_launch_error_tail=$(tail -n 20 /tmp/hwlab-source-workspace-browser-launch.err 2>/dev/null | tr '\\n\\t' ' ' | cut -c1-1000)", + " [ \"$browser_launch_exit\" = 0 ] && browser_launch_ok=yes", + "fi", "status_short_lines=$(printf '%s' \"$status_short\" | sed '/^$/d' | wc -l | tr -d ' ')", "status_short_preview=$(printf '%s' \"$status_short\" | tr '\\n\\t' ' ' | cut -c1-1000)", "printf 'workspace\\t%s\\n' \"$workspace\"", @@ -903,6 +924,9 @@ function sourceWorkspaceStatusScript(spec: HwlabRuntimeLaneSpec, sourceWorkspace "printf 'browserExecutableErrorTail\\t%s\\n' \"$browser_executable_error_tail\"", "printf 'launcherImportOk\\t%s\\n' \"$launcher_import_ok\"", "printf 'launcherImportExitCode\\t%s\\n' \"$launcher_import_exit\"", + "printf 'browserLaunchOk\\t%s\\n' \"$browser_launch_ok\"", + "printf 'browserLaunchExitCode\\t%s\\n' \"$browser_launch_exit\"", + "printf 'browserLaunchErrorTail\\t%s\\n' \"$browser_launch_error_tail\"", "printf 'statusShortLines\\t%s\\n' \"$status_short_lines\"", "printf 'statusShortPreview\\t%s\\n' \"$status_short_preview\"", ].join("\n");