Merge pull request #1180 from pikasTech/fix/d518-source-workspace-safe-dir

fix(hwlab): stabilize D518 source workspace browser checks
This commit is contained in:
Lyon
2026-06-28 02:10:04 +08:00
committed by GitHub
2 changed files with 35 additions and 1 deletions
+7 -1
View File
@@ -1883,6 +1883,8 @@ function probeSentinelDashboardBrowser(state: SentinelCicdState, options: Extrac
`export UNIDESK_SENTINEL_DASHBOARD_HEIGHT=${shellQuote(heightRaw ?? "900")}`,
`export UNIDESK_SENTINEL_DASHBOARD_TIMEOUT_MS=${shellQuote(String(options.timeoutMs))}`,
`export UNIDESK_SENTINEL_DASHBOARD_FULL_PAGE=${shellQuote(options.fullPage ? "1" : "0")}`,
`export UNIDESK_SENTINEL_DASHBOARD_PLAYWRIGHT_MODULE=${shellQuote(`${state.spec.workspace}/node_modules/playwright/index.mjs`)}`,
"export PLAYWRIGHT_BROWSERS_PATH=0",
"if command -v chromium >/dev/null 2>&1; then",
" export UNIDESK_SENTINEL_DASHBOARD_EXECUTABLE_PATH=$(command -v chromium)",
"elif command -v chromium-browser >/dev/null 2>&1; then",
@@ -1949,7 +1951,11 @@ function probeSentinelDashboardBrowser(state: SentinelCicdState, options: Extrac
}
function sentinelDashboardBrowserModule(): string {
return String.raw`import { chromium } from "playwright";
return String.raw`import { pathToFileURL } from "node:url";
const playwrightModulePath = process.env.UNIDESK_SENTINEL_DASHBOARD_PLAYWRIGHT_MODULE || "";
const playwrightModuleSpecifier = playwrightModulePath ? pathToFileURL(playwrightModulePath).href : "playwright";
const { chromium } = await import(playwrightModuleSpecifier);
const url = process.env.UNIDESK_SENTINEL_DASHBOARD_URL;
const screenshotPath = process.env.UNIDESK_SENTINEL_DASHBOARD_SCREENSHOT || "";
@@ -133,6 +133,7 @@ function sourceWorkspaceStatusFromFields(fields: Record<string, string>, exitCod
&& missingCommands.length === 0
&& missingFiles.length === 0
&& fields.playwrightPackagePresent === "yes"
&& fields.browserExecutablePresent === "yes"
&& fields.launcherImportOk === "yes";
return {
ok,
@@ -155,6 +156,10 @@ function sourceWorkspaceStatusFromFields(fields: Record<string, string>, exitCod
npxVersion: fields.npxVersion || null,
playwrightPackagePresent: fields.playwrightPackagePresent === "yes",
browserCachePresent: fields.browserCachePresent === "yes",
browserExecutablePresent: fields.browserExecutablePresent === "yes",
browserExecutableExitCode: numericField(fields.browserExecutableExitCode),
browserExecutablePath: fields.browserExecutablePath || null,
browserExecutableErrorTail: fields.browserExecutableErrorTail || null,
launcherImportOk: fields.launcherImportOk === "yes",
launcherImportExitCode: numericField(fields.launcherImportExitCode),
statusShortLines: numericField(fields.statusShortLines),
@@ -226,6 +231,24 @@ function sourceWorkspaceStatusScript(spec: HwlabRuntimeLaneSpec, sourceWorkspace
" [ -d \"$cache_dir\" ] || continue",
" if find \"$cache_dir\" -maxdepth 1 -type d -name '*chromium*' 2>/dev/null | grep -q .; then browser_cache_present=yes; fi",
"done",
"browser_executable_present=no",
"browser_executable_exit=",
"browser_executable_path=",
"browser_executable_error_tail=",
"if command -v node >/dev/null 2>&1 && [ \"$playwright_package_present\" = yes ]; then",
" (cd \"$workspace\" && PLAYWRIGHT_BROWSERS_PATH=0 timeout 20s node --input-type=module - <<'NODE'",
"import { existsSync } from 'node:fs';",
"import { chromium } from 'playwright';",
"const executablePath = chromium.executablePath();",
"console.log(executablePath);",
"process.exit(existsSync(executablePath) ? 0 : 2);",
"NODE",
" ) >/tmp/hwlab-source-workspace-browser-executable.out 2>/tmp/hwlab-source-workspace-browser-executable.err",
" browser_executable_exit=$?",
" browser_executable_path=$(head -n 1 /tmp/hwlab-source-workspace-browser-executable.out 2>/dev/null | cut -c1-1000)",
" browser_executable_error_tail=$(tail -n 20 /tmp/hwlab-source-workspace-browser-executable.err 2>/dev/null | tr '\\n\\t' ' ' | cut -c1-1000)",
" [ \"$browser_executable_exit\" = 0 ] && browser_executable_present=yes",
"fi",
"launcher_import_ok=no",
"launcher_import_exit=",
"if command -v node >/dev/null 2>&1 && [ -f \"$workspace/scripts/src/browser-launcher.mjs\" ]; then",
@@ -254,6 +277,10 @@ function sourceWorkspaceStatusScript(spec: HwlabRuntimeLaneSpec, sourceWorkspace
"printf 'npxVersion\\t%s\\n' \"$npx_version\"",
"printf 'playwrightPackagePresent\\t%s\\n' \"$playwright_package_present\"",
"printf 'browserCachePresent\\t%s\\n' \"$browser_cache_present\"",
"printf 'browserExecutablePresent\\t%s\\n' \"$browser_executable_present\"",
"printf 'browserExecutableExitCode\\t%s\\n' \"$browser_executable_exit\"",
"printf 'browserExecutablePath\\t%s\\n' \"$browser_executable_path\"",
"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 'statusShortLines\\t%s\\n' \"$status_short_lines\"",
@@ -448,6 +475,7 @@ function sourceWorkspaceJobContainerScript(
" command -v \"$command_name\" >/dev/null 2>>\"$stderr_log\"",
"done <\"$tmp_dir/commands.txt\"",
"mkdir -p \"$(dirname \"$workspace\")\"",
"git config --global --add safe.directory \"$workspace\" >>\"$stdout_log\" 2>>\"$stderr_log\" || true",
"if [ -d \"$workspace/.git\" ] && git -C \"$workspace\" rev-parse --git-dir >/dev/null 2>&1; then",
" status_short=$(git -C \"$workspace\" status --short)",
" if [ -n \"$status_short\" ]; then echo \"source workspace is dirty; refusing to overwrite\" >>\"$stderr_log\"; exit 42; fi",