# HyperFrames Producer - Regression Test Image # # Matches the production rendering environment (same Chromium, fonts, FFmpeg) # but includes the full source + devDependencies for running the test harness. # # This ensures golden baselines match what production actually renders. # # Usage: # docker build -f Dockerfile.test -t hyperframes-producer:test . # docker run --rm -v ./packages/producer/tests:/app/packages/producer/tests hyperframes-producer:test # docker run --rm -v ./packages/producer/tests:/app/packages/producer/tests hyperframes-producer:test --update FROM node:22-bookworm-slim # ── System dependencies (identical to production) ──────────────────────────── RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ unzip \ ffmpeg \ chromium \ libgbm1 \ libnss3 \ libatk-bridge2.0-0 \ libdrm2 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ libcups2 \ libasound2 \ libpangocairo-1.0-0 \ libxshmfence1 \ libgtk-3-0 \ # Font support — matches production fonts-liberation \ fonts-noto-color-emoji \ fonts-noto-cjk \ fonts-noto-core \ fonts-noto-extra \ fonts-noto-ui-core \ fonts-freefont-ttf \ fonts-dejavu-core \ fontconfig \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean \ && fc-cache -fv # Use system Chromium (same as production) ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium ENV CONTAINER=true # Install chrome-headless-shell for deterministic BeginFrame rendering. # This lightweight Chrome binary supports HeadlessExperimental.beginFrame. # Install to ~/.cache/puppeteer/ where resolveHeadlessShellPath() looks. # # Pinned to a specific build (NOT @stable) so the regression-test golden # baselines in packages/producer/tests/*/output/output.mp4 stay reproducible. # Each Chrome stable bump shifts pixel output enough to fail PSNR. Bump this # version together with regenerating baselines via `docker:test:update`. RUN npx --yes @puppeteer/browsers install chrome-headless-shell@148.0.7778.167 \ --path /root/.cache/puppeteer \ && find /root/.cache/puppeteer/chrome-headless-shell -name "chrome-headless-shell" -type f \ && echo "chrome-headless-shell installed" WORKDIR /app # Install bun RUN curl -fsSL https://bun.sh/install | BUN_INSTALL="/root/.bun" bash -s "bun-v1.3.13" ENV PATH="/root/.bun/bin:$PATH" # Install dependencies (full, including devDependencies for tsx + test harness). # Every workspace member (packages/*) must be COPYed here — `bun install # --frozen-lockfile` treats any member missing from the build context as a # lockfile change and fails. COPY package.json bun.lock ./ COPY packages/parsers/package.json packages/parsers/package.json COPY packages/lint/package.json packages/lint/package.json COPY packages/studio-server/package.json packages/studio-server/package.json COPY packages/core/package.json packages/core/package.json COPY packages/engine/package.json packages/engine/package.json COPY packages/player/package.json packages/player/package.json COPY packages/producer/package.json packages/producer/package.json COPY packages/cli/package.json packages/cli/package.json COPY packages/studio/package.json packages/studio/package.json COPY packages/shader-transitions/package.json packages/shader-transitions/package.json COPY packages/aws-lambda/package.json packages/aws-lambda/package.json COPY packages/gcp-cloud-run/package.json packages/gcp-cloud-run/package.json COPY packages/sdk/package.json packages/sdk/package.json COPY packages/sdk-playground/package.json packages/sdk-playground/package.json RUN bun install --frozen-lockfile # Copy source COPY packages/parsers/ packages/parsers/ COPY packages/lint/ packages/lint/ COPY packages/studio-server/ packages/studio-server/ COPY packages/core/ packages/core/ COPY packages/engine/ packages/engine/ COPY packages/producer/ packages/producer/ # Build workspace packages so "node" export conditions resolve to built dist RUN bun run --filter '@hyperframes/{parsers,lint,studio-server}' build \ && bun run --cwd packages/core build # Build core runtime artifacts (needed by renderer) RUN bun run --filter @hyperframes/core build:hyperframes-runtime:modular # Generate embedded font data (deterministicFonts.ts imports this at runtime) RUN cd packages/producer && bunx tsx scripts/generate-font-data.ts WORKDIR /app/packages/producer ENTRYPOINT ["bunx", "tsx", "src/regression-harness.ts", "--", "--sequential"]