diff --git a/Dockerfile b/Dockerfile index d46a764..7c7879b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,13 @@ COPY . . RUN chmod +x /app/start.sh +# Locate sitespeed.js at build time and write the path to /sitespeed_env. +# The base image sets sitespeed.io as ENTRYPOINT via a full path, so it is +# not on $PATH. We find it once here so start.sh can export it at runtime. +RUN SITESPEED_JS=$(find / -name 'sitespeed.js' -path '*/bin/*' 2>/dev/null | head -1); \ + echo "Build-time sitespeed.js found at: $SITESPEED_JS"; \ + echo "export SITESPEED_BIN=$SITESPEED_JS" > /sitespeed_env + # Create persistent directories RUN mkdir -p /data/reports diff --git a/runner.js b/runner.js index b1f0ed4..ae4b0cd 100644 --- a/runner.js +++ b/runner.js @@ -6,10 +6,6 @@ import { existsSync } from 'fs'; const __dirname = dirname(fileURLToPath(import.meta.url)); const LOCAL_BIN = join(__dirname, '..', 'sitespeed.io', 'bin', 'sitespeed.js'); -// Shell-escape a single argument (single-quote wrapping) -function q(arg) { - return `'${String(arg).replace(/'/g, "'\\''")}'`; -} export function runTest(job, onLine) { return new Promise((resolve, reject) => { @@ -40,12 +36,17 @@ export function runTest(job, onLine) { let child; if (isDocker) { - // In Docker, sitespeed.io is on PATH but execSync can't see it from Node's - // limited environment. Use 'sh -c' so the full shell PATH is used. - const shellCmd = ['sitespeed.io', ...sitespeedArgs].map(q).join(' '); - onLine(`[runner] sh -c ${shellCmd.slice(0, 120)}...`); + // SITESPEED_BIN is set by start.sh from the build-time path discovery + const bin = process.env.SITESPEED_BIN; + if (!bin) { + return reject(new Error( + 'SITESPEED_BIN is not set. The Docker build may not have found sitespeed.js.\n' + + 'Check build logs for "Build-time sitespeed.js found at:"' + )); + } + onLine(`[runner] node ${bin}`); onLine(`[runner] DISPLAY=${env.DISPLAY}`); - child = spawn('sh', ['-c', shellCmd], { cwd: __dirname, env }); + child = spawn('node', [bin, ...sitespeedArgs], { cwd: __dirname, env }); } else { if (!existsSync(LOCAL_BIN)) { return reject(new Error( diff --git a/start.sh b/start.sh index 696dac1..2150a7c 100644 --- a/start.sh +++ b/start.sh @@ -1,12 +1,17 @@ #!/bin/bash set -e -# Start virtual framebuffer so Chrome/Firefox have a display to render into. -# This is what the base sitespeedio/sitespeed.io image's entrypoint does. +# Load the sitespeed.io binary path discovered at build time +if [ -f /sitespeed_env ]; then + source /sitespeed_env +fi + +echo "[start.sh] SITESPEED_BIN=${SITESPEED_BIN:-NOT FOUND}" + +# Start virtual framebuffer so Chrome/Firefox have a display to render into Xvfb :99 -ac -screen 0 1920x1080x24 +extension RANDR & export DISPLAY=:99 -# Give Xvfb a moment to initialise sleep 1 exec node /app/app.js