Files
heygen-com__hyperframes/Dockerfile.test
James 0386246bc0 fix(ci): pin chrome-headless-shell to fix regression baseline drift
`Dockerfile.test:56` installed `chrome-headless-shell@stable` via
`@puppeteer/browsers`. `@stable` is a moving tag, so every Chrome stable
bump shifted pixel output enough to fail PSNR on the golden baselines.
The regression suite silently broke whenever Docker.test rebuilt
against a freshly-promoted stable.

Pin to `chrome-headless-shell@148.0.7778.167` — the Chrome 148 stable
build that `@stable` currently resolves to, matching what most goldens
on `main` were captured against. Comment notes that future bumps must
be paired with `docker:test:update` so the pin and the baselines stay
in lockstep.

Also regenerates the `style-12-prod` golden baseline. PR #918 regenerated
it once at b9bdc80d, but that commit landed *before* the
`refactor: extract shared inlineSubCompositions from bundler and producer`
(581e7a7e) and the linkedom-fragment fix (754b0edc) in the same stack.
The compiler refactor changes `__hfRootSelector` from `null` to a scoped
`[data-composition-id="..."]` selector in the inlined sub-compositions,
which affects the rendered output. style-12-prod was the one fixture in
that stack that didn't get a second regen pass after the refactor, so
it has been failing on plain `origin/main` (PSNR ~13 from frame 8.26s
onward — the mondrian-colors blocks no longer match expected).
The new baseline regenerated under this pin passes at PSNR 62-102 dB.
2026-05-17 19:02:12 +00:00

98 lines
3.6 KiB
Docker

# 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 | bash
ENV PATH="/root/.bun/bin:$PATH"
# Install dependencies (full, including devDependencies for tsx + test harness)
COPY package.json bun.lock ./
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
RUN bun install --frozen-lockfile
# Copy source
COPY packages/core/ packages/core/
COPY packages/engine/ packages/engine/
COPY packages/producer/ packages/producer/
# 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"]