From 33d21966fbc5d5a4fea9e9e8600f600dcf30204b Mon Sep 17 00:00:00 2001 From: gre Date: Mon, 4 May 2026 11:17:59 +0200 Subject: [PATCH 1/5] ci: enforce E2E pass/fail, add new-arch iOS smoke build, dedupe web snapshots - E2E jobs no longer mask failures: removed continue-on-error: true on the Detox iOS and Playwright web example jobs so PRs cannot land green while their E2E suites are red. - New job build-ios-new-arch builds the iOS example with RCT_NEW_ARCH_ENABLED=1 (Fabric + TurboModules). Detox still runs in old-arch only; this catches new-arch-only build regressions in CI. - Android Detox CI comment now explains *why* the job is disabled (native library conflicts not yet reproduced outside CI) and points to a tracking issue (to be filed separately). - Playwright snapshots now use a single per-test file instead of one per OS. example-web/e2e/snapshots/reference/.../*-darwin.png removed, *-linux.png renamed to drop the platform suffix. Linux (CI) is the reference; macOS dev runs may produce diffs and should regenerate from CI artifacts when committing visual changes. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 65 ++++++++++++++++-- ...basic-test-png-capture-chromium-darwin.png | Bin 8024 -> 0 bytes ...ng => basic-test-png-capture-chromium.png} | Bin ...complex-layout-capture-chromium-darwin.png | Bin 14457 -> 0 bytes ...ng => complex-layout-capture-chromium.png} | Bin .../cors-image-capture-chromium-darwin.png | Bin 8212 -> 0 bytes ...ux.png => cors-image-capture-chromium.png} | Bin ...ge-test-screen-capture-chromium-darwin.png | Bin 21051 -> 0 bytes ...=> image-test-screen-capture-chromium.png} | Bin ...=> viewshot-component-manual-chromium.png} | Bin example-web/playwright.config.ts | 8 +++ 11 files changed, 69 insertions(+), 4 deletions(-) delete mode 100644 example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium-darwin.png rename example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/{basic-test-png-capture-chromium-linux.png => basic-test-png-capture-chromium.png} (100%) delete mode 100644 example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium-darwin.png rename example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/{complex-layout-capture-chromium-linux.png => complex-layout-capture-chromium.png} (100%) delete mode 100644 example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium-darwin.png rename example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/{cors-image-capture-chromium-linux.png => cors-image-capture-chromium.png} (100%) delete mode 100644 example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/image-test-screen-capture-chromium-darwin.png rename example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/{image-test-screen-capture-chromium-linux.png => image-test-screen-capture-chromium.png} (100%) rename example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/{viewshot-component-manual-chromium-linux.png => viewshot-component-manual-chromium.png} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b4d28e4..90bb1f6c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -193,6 +193,62 @@ jobs: name: ios-build-logs path: ~/Library/Logs/DiagnosticReports/ + build-ios-new-arch: + # Smoke test: confirm the iOS example still compiles with the new + # architecture (Fabric + TurboModules) enabled. Detox E2E currently runs in + # old arch only; this job catches new-arch-only build regressions. + name: Build iOS App (New Architecture) + runs-on: macos-15 + needs: lint-and-type-check + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Cache CocoaPods (new arch) + uses: actions/cache@v4 + with: + path: example/ios/Pods + key: ${{ runner.os }}-pods-newarch-${{ hashFiles('**/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods-newarch- + + - name: Install dependencies + run: npm install --legacy-peer-deps + + - name: Build library + run: npm run build + + - name: Install example dependencies + working-directory: example + run: npm ci --legacy-peer-deps + + - name: Setup CocoaPods + uses: maxim-lobanov/setup-cocoapods@v1 + with: + version: latest + + - name: Pod install (new arch) + working-directory: example/ios + env: + RCT_NEW_ARCH_ENABLED: '1' + run: pod install --verbose + + - name: Build iOS (new arch) + working-directory: example + run: | + xcodebuild -workspace ios/ViewShotExample.xcworkspace \ + -scheme ViewShotExample \ + -configuration Debug \ + -destination 'generic/platform=iOS Simulator' \ + build CODE_SIGNING_ALLOWED=NO + test-windows-unit: name: Run Windows unit tests runs-on: ubuntu-latest @@ -538,7 +594,6 @@ jobs: - name: Run Detox Tests working-directory: example run: npm run test:e2e:ios - continue-on-error: true id: detox_ios_tests - name: Stop Metro Bundler @@ -578,8 +633,11 @@ jobs: echo "✅ Detox iOS tests completed" fi - # TODO: Android Detox E2E tests disabled temporarily - not stable on CI. - # Re-enable when Android emulator reliability is improved. + # Android Detox E2E tests are disabled on CI due to native library conflicts + # between the example app and the Detox test runner that we have not yet + # reproduced reliably outside of CI. iOS Detox covers the cross-platform JS/TS + # paths; Android-specific regressions must be caught manually until this is + # resolved. Tracking issue: TODO link once filed (see PR description). # test-detox-android: # name: Detox E2E Tests (Android) # runs-on: ubuntu-latest @@ -694,7 +752,6 @@ jobs: - name: Run Playwright tests working-directory: example-web run: npm run test:e2e - continue-on-error: true id: playwright_tests - name: Stop web development server diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium-darwin.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium-darwin.png deleted file mode 100644 index 5c293b7eaba74b465e514f484327fdb866c730dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8024 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 C-cPCk diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium-linux.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium.png similarity index 100% rename from example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium-linux.png rename to example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/basic-test-png-capture-chromium.png diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium-darwin.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium-darwin.png deleted file mode 100644 index 71c05c47fbdc8263e200e265fef39e47ab145240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14457 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 BNtgft diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium-linux.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium.png similarity index 100% rename from example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium-linux.png rename to example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/complex-layout-capture-chromium.png diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium-darwin.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium-darwin.png deleted file mode 100644 index d4982969ce444ccac61d46f95e25399d49abe34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8212 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 IXZHDj0Hbf}djJ3c diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium-linux.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium.png similarity index 100% rename from example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium-linux.png rename to example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/cors-image-capture-chromium.png diff --git a/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/image-test-screen-capture-chromium-darwin.png b/example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/image-test-screen-capture-chromium-darwin.png deleted file mode 100644 index 634a3baf6cc457905eb24f22316178bdf265fcae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21051 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 Date: Mon, 4 May 2026 11:49:32 +0200 Subject: [PATCH 2/5] ci: address Copilot feedback on tier 3 hardening MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the three real issues Copilot flagged in PR #644. - Detox iOS: restore continue-on-error: true on the test step (the Jest SummaryReporter is known to crash with TypeError on undefined isSet, which would now make every otherwise-green run red). Add a follow-up "Verify Detox results from JUnit XML" step that parses example/e2e/test-results/detox-results.xml and fails the job when failures > 0, errors > 0, or no XML was produced. CI now gates on test outcomes rather than the unreliable runner exit code. - example-web/package.json: guard test:e2e:update-snapshots so it refuses to run on macOS / Windows. Updating baselines outside Linux would otherwise overwrite committed Linux references and immediately fail CI on the next run, since playwright.config.ts now uses a single shared snapshot file per test (no -platform suffix). - example-web/e2e/snapshots/README.md: rewrite to match the new layout (single shared file, viewshot.spec.ts-snapshots/ subdir, no -darwin references) and document the CI-artifact update flow. - ci.yml snapshot-diff summary: point at the actual artifact (web-snapshots-actual) and explain how to copy *-actual.png files over the matching baselines (the previous text named a non-existent web-snapshots-reference artifact). Note: the three orphan top-level PNGs at example-web/e2e/snapshots/ reference/{basic-test-png-capture,complex-layout-capture,image-test- screen-capture}.png are still present — they're committed but not referenced by any test (Playwright reads from the viewshot.spec.ts-snapshots/ subdir per the snapshotPathTemplate). Pending owner sign-off before deleting. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 43 +++++++++++++----- example-web/e2e/snapshots/README.md | 67 +++++++++++++++-------------- example-web/package.json | 2 +- 3 files changed, 68 insertions(+), 44 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90bb1f6c..0469ea2a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -593,7 +593,15 @@ jobs: - name: Run Detox Tests working-directory: example + # Detox/Jest exits non-zero on a known SummaryReporter crash + # (TypeError: Cannot read properties of undefined reading 'isSet') + # even when every test passed, so we cannot use the exit code as + # the source of truth. We allow this step to "succeed" and parse + # the JUnit XML in the next step instead. continue-on-error must + # NOT be used as a way to ignore real failures — see the + # Verify step below. run: npm run test:e2e:ios + continue-on-error: true id: detox_ios_tests - name: Stop Metro Bundler @@ -621,17 +629,32 @@ jobs: example/e2e/test-results/**/* example/artifacts/**/*.xml - - name: Report iOS test results + - name: Verify Detox results from JUnit XML if: always() + # Source of truth for Detox iOS pass/fail: parse the jest-junit + # XML that the runner writes regardless of the SummaryReporter + # crash. Fails CI when failures > 0 or errors > 0; also fails + # when no XML was produced at all (bail before tests started). run: | - # Note: Detox exit code is unreliable due to Jest SummaryReporter crash - # (TypeError: Cannot read properties of undefined reading 'isSet') - # Tests results are best checked via the uploaded artifacts and screenshots - if [ "${{ steps.detox_ios_tests.outcome }}" == "failure" ]; then - echo "⚠️ Detox exited with error (may be Jest reporter crash, check artifacts for actual results)" - else - echo "✅ Detox iOS tests completed" + XML=example/e2e/test-results/detox-results.xml + if [ ! -f "$XML" ]; then + echo "::error::Expected $XML to be produced by jest-junit but it is missing — Detox likely failed before any test ran." + exit 1 + fi + # The first element carries aggregated counts. + FAILURES=$(grep -oE 'failures="[0-9]+"' "$XML" | head -n1 | grep -oE '[0-9]+') + ERRORS=$(grep -oE 'errors="[0-9]+"' "$XML" | head -n1 | grep -oE '[0-9]+') + TESTS=$(grep -oE ' tests="[0-9]+"' "$XML" | head -n1 | grep -oE '[0-9]+') + echo "Detox iOS results: tests=${TESTS:-?} failures=${FAILURES:-?} errors=${ERRORS:-?}" + if [ "${FAILURES:-0}" -gt 0 ] || [ "${ERRORS:-0}" -gt 0 ]; then + echo "::error::Detox iOS reported $FAILURES failures and $ERRORS errors — see uploaded artifacts." + exit 1 + fi + if [ "${TESTS:-0}" -eq 0 ]; then + echo "::error::Detox iOS ran 0 tests — treating as failure." + exit 1 fi + echo "✅ Detox iOS: $TESTS tests passed" # Android Detox E2E tests are disabled on CI due to native library conflicts # between the example app and the Detox test runner that we have not yet @@ -776,8 +799,8 @@ jobs: echo "- Font or styling differences" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**To update snapshots:**" >> $GITHUB_STEP_SUMMARY - echo "1. Download the \`web-snapshots-reference\` artifact" >> $GITHUB_STEP_SUMMARY - echo "2. Replace \`example-web/e2e/snapshots/reference/\` with the downloaded files" >> $GITHUB_STEP_SUMMARY + echo "1. Download the \`web-snapshots-actual\` artifact (uploaded below)" >> $GITHUB_STEP_SUMMARY + echo "2. Take the \`*-actual.png\` files and copy them over the matching baselines in \`example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/\` (drop the \`-actual\` suffix)" >> $GITHUB_STEP_SUMMARY echo "3. Commit the updated snapshots" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "**Diff files available in artifacts:**" >> $GITHUB_STEP_SUMMARY diff --git a/example-web/e2e/snapshots/README.md b/example-web/e2e/snapshots/README.md index 026e4c55..3d044d06 100644 --- a/example-web/e2e/snapshots/README.md +++ b/example-web/e2e/snapshots/README.md @@ -1,40 +1,41 @@ # Web Example Snapshots -This directory contains reference screenshots for visual regression testing with Playwright. - -## Directory Structure +Reference screenshots for visual regression testing with Playwright. ``` snapshots/ -├── reference/ # Golden snapshots (committed to git) -│ ├── basic-test-png-capture-chromium-darwin.png -│ └── transparency-solid-capture-chromium-darwin.png -└── output/ # Test results (git ignored) -``` - -## Updating Snapshots - -### Local Development - -Run tests in update mode to regenerate all snapshots: - -```bash -npm run test:e2e:update-snapshots +├── reference/ +│ └── viewshot.spec.ts-snapshots/ # Golden snapshots (committed to git) +│ ├── basic-test-png-capture-chromium.png +│ └── ... +└── output/ # Test results (git-ignored) ``` -### From CI - -When tests fail in CI due to visual changes: - -1. Go to the failed GitHub Actions workflow -2. Download the `web-snapshots-reference` artifact -3. Extract the PNG files -4. Replace files in `example-web/e2e/snapshots/reference/` -5. Review the changes with `git diff` -6. Commit if the changes are expected - -## Platform Notes - -Snapshots are platform-specific (e.g., `-chromium-darwin.png`). The CI runs on Linux, so you may see different snapshot names in CI vs local macOS development. - -For consistent CI testing, we use the snapshots generated on the CI platform (Linux + Chromium). +A single golden file per test is committed regardless of OS (no +`-darwin` / `-linux` suffix). The CI runs on Linux + Chromium and is the +source of truth — local macOS or Windows runs will produce visual diffs +because of font and anti-aliasing differences. That's expected. + +## Updating snapshots + +Snapshot baselines must be regenerated **on Linux only** (the CI +platform). The `npm run test:e2e:update-snapshots` script enforces this +locally — it refuses to run on macOS / Windows because the resulting +files would differ from the committed Linux baselines and fail CI on +the next run. + +The recommended flow is to update via CI artifacts: + +1. Push your branch. CI runs Playwright; if your visual change made + tests fail, the failing job uploads the rendered screenshots as the + `web-snapshots-actual` artifact. +2. Download `web-snapshots-actual` from the failed GitHub Actions run. +3. For each `*-actual.png` file, copy it over the matching baseline in + `example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/`, + dropping the `-actual` suffix. +4. Review the diff with `git diff` (image diffs render in GitHub PRs). +5. Commit if the visual change is intended. + +If you really need to regenerate locally (e.g. to bootstrap a brand new +test), do it inside a Linux container or VM; do not commit baselines +generated on macOS or Windows. diff --git a/example-web/package.json b/example-web/package.json index caa682a8..25dc0d75 100644 --- a/example-web/package.json +++ b/example-web/package.json @@ -10,7 +10,7 @@ "test:e2e": "playwright test --reporter=list", "test:e2e:headed": "playwright test --headed --reporter=list", "test:e2e:debug": "playwright test --headed --debug", - "test:e2e:update-snapshots": "playwright test --update-snapshots" + "test:e2e:update-snapshots": "node -e \"if (process.platform !== 'linux') { console.error('\\n Snapshot baselines must be regenerated on Linux (the CI platform). On macOS / Windows the renders differ\\n enough to overwrite the committed Linux baselines and fail CI.\\n\\n To update snapshots, push your branch and grab the web-snapshots-actual artifact from the failing CI run\\n (see example-web/e2e/snapshots/README.md for instructions).\\n'); process.exit(1) }\" && playwright test --update-snapshots" }, "dependencies": { "html2canvas": "^1.4.1", From 3d319f9a91195d598ebb027712e0cb5d8738458a Mon Sep 17 00:00:00 2001 From: gre Date: Mon, 4 May 2026 13:00:24 +0200 Subject: [PATCH 3/5] ci: drop the Detox JUnit verify step (pre-existing failures) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous attempt to make Detox iOS strictly blocking via jest-junit XML parsing fails because: 1. jest-junit doesn't flush its XML when the Jest SummaryReporter crashes (TypeError: Cannot read properties of undefined reading 'isSet'), which it does on every run today. So the XML is missing even when all tests pass. 2. There are pre-existing real failures on master in example/e2e/tests/snapshot-content-container.test.js and example/e2e/tests/style-filters.test.js. Making Detox blocking now would turn every PR red — those need their own fix first. Restore the original "Report iOS test results" echo step with a clearer comment explaining why this job is intentionally non-blocking and what needs to happen before it can be made strict (fix the SummaryReporter crash + the two failing suites). The Playwright web example side of this PR (continue-on-error removal there) is kept, since it's stable. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 42 ++++++++++++---------------------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0469ea2a..66b457c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -593,13 +593,6 @@ jobs: - name: Run Detox Tests working-directory: example - # Detox/Jest exits non-zero on a known SummaryReporter crash - # (TypeError: Cannot read properties of undefined reading 'isSet') - # even when every test passed, so we cannot use the exit code as - # the source of truth. We allow this step to "succeed" and parse - # the JUnit XML in the next step instead. continue-on-error must - # NOT be used as a way to ignore real failures — see the - # Verify step below. run: npm run test:e2e:ios continue-on-error: true id: detox_ios_tests @@ -629,32 +622,21 @@ jobs: example/e2e/test-results/**/* example/artifacts/**/*.xml - - name: Verify Detox results from JUnit XML + - name: Report iOS test results if: always() - # Source of truth for Detox iOS pass/fail: parse the jest-junit - # XML that the runner writes regardless of the SummaryReporter - # crash. Fails CI when failures > 0 or errors > 0; also fails - # when no XML was produced at all (bail before tests started). + # Detox iOS is intentionally non-blocking: jest-junit doesn't flush + # its XML when the Jest SummaryReporter crashes + # (TypeError: Cannot read properties of undefined reading 'isSet'), + # and there are pre-existing failing suites + # (snapshot-content-container, style-filters) that need their own + # fixes before this job can be made strict. Until then, treat the + # uploaded artifacts and screenshots as the source of truth. run: | - XML=example/e2e/test-results/detox-results.xml - if [ ! -f "$XML" ]; then - echo "::error::Expected $XML to be produced by jest-junit but it is missing — Detox likely failed before any test ran." - exit 1 - fi - # The first element carries aggregated counts. - FAILURES=$(grep -oE 'failures="[0-9]+"' "$XML" | head -n1 | grep -oE '[0-9]+') - ERRORS=$(grep -oE 'errors="[0-9]+"' "$XML" | head -n1 | grep -oE '[0-9]+') - TESTS=$(grep -oE ' tests="[0-9]+"' "$XML" | head -n1 | grep -oE '[0-9]+') - echo "Detox iOS results: tests=${TESTS:-?} failures=${FAILURES:-?} errors=${ERRORS:-?}" - if [ "${FAILURES:-0}" -gt 0 ] || [ "${ERRORS:-0}" -gt 0 ]; then - echo "::error::Detox iOS reported $FAILURES failures and $ERRORS errors — see uploaded artifacts." - exit 1 - fi - if [ "${TESTS:-0}" -eq 0 ]; then - echo "::error::Detox iOS ran 0 tests — treating as failure." - exit 1 + if [ "${{ steps.detox_ios_tests.outcome }}" == "failure" ]; then + echo "⚠️ Detox exited with error (may be Jest reporter crash, check artifacts for actual results)" + else + echo "✅ Detox iOS tests completed" fi - echo "✅ Detox iOS: $TESTS tests passed" # Android Detox E2E tests are disabled on CI due to native library conflicts # between the example app and the Detox test runner that we have not yet From e8e4f60d49bf8afa7bcfdc4531fb8488c45647da Mon Sep 17 00:00:00 2001 From: gre Date: Mon, 4 May 2026 14:08:15 +0200 Subject: [PATCH 4/5] chore: trim CI comments, extract require-linux script, drop orphan PNGs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-review pass. - Replace the inline `node -e \"…\"` (with escaped quotes) in example-web/package.json with a small scripts/require-linux.js. - Trim verbose comment blocks on build-ios-new-arch, the Detox report step, the Android Detox placeholder, and snapshotPathTemplate. - Delete the three orphan top-level PNGs at example-web/e2e/snapshots/reference/. Playwright reads from the viewshot.spec.ts-snapshots/ subdirectory per snapshotPathTemplate; these top-level files were never read by any test. --- .github/workflows/ci.yml | 19 ++++-------------- .../reference/basic-test-png-capture.png | Bin 7737 -> 0 bytes .../reference/complex-layout-capture.png | Bin 14107 -> 0 bytes .../reference/image-test-screen-capture.png | Bin 20520 -> 0 bytes example-web/package.json | 2 +- example-web/playwright.config.ts | 7 +------ example-web/scripts/require-linux.js | 9 +++++++++ 7 files changed, 15 insertions(+), 22 deletions(-) delete mode 100644 example-web/e2e/snapshots/reference/basic-test-png-capture.png delete mode 100644 example-web/e2e/snapshots/reference/complex-layout-capture.png delete mode 100644 example-web/e2e/snapshots/reference/image-test-screen-capture.png create mode 100644 example-web/scripts/require-linux.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66b457c2..e9510885 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -194,9 +194,6 @@ jobs: path: ~/Library/Logs/DiagnosticReports/ build-ios-new-arch: - # Smoke test: confirm the iOS example still compiles with the new - # architecture (Fabric + TurboModules) enabled. Detox E2E currently runs in - # old arch only; this job catches new-arch-only build regressions. name: Build iOS App (New Architecture) runs-on: macos-15 needs: lint-and-type-check @@ -624,13 +621,8 @@ jobs: - name: Report iOS test results if: always() - # Detox iOS is intentionally non-blocking: jest-junit doesn't flush - # its XML when the Jest SummaryReporter crashes - # (TypeError: Cannot read properties of undefined reading 'isSet'), - # and there are pre-existing failing suites - # (snapshot-content-container, style-filters) that need their own - # fixes before this job can be made strict. Until then, treat the - # uploaded artifacts and screenshots as the source of truth. + # Non-blocking: Jest SummaryReporter crashes (isSet TypeError) and the + # snapshot-content-container / style-filters suites are known-failing. run: | if [ "${{ steps.detox_ios_tests.outcome }}" == "failure" ]; then echo "⚠️ Detox exited with error (may be Jest reporter crash, check artifacts for actual results)" @@ -638,11 +630,8 @@ jobs: echo "✅ Detox iOS tests completed" fi - # Android Detox E2E tests are disabled on CI due to native library conflicts - # between the example app and the Detox test runner that we have not yet - # reproduced reliably outside of CI. iOS Detox covers the cross-platform JS/TS - # paths; Android-specific regressions must be caught manually until this is - # resolved. Tracking issue: TODO link once filed (see PR description). + # Android Detox is disabled on CI: native library conflicts not yet + # reproduced outside the runner. Track via the PR description. # test-detox-android: # name: Detox E2E Tests (Android) # runs-on: ubuntu-latest diff --git a/example-web/e2e/snapshots/reference/basic-test-png-capture.png b/example-web/e2e/snapshots/reference/basic-test-png-capture.png deleted file mode 100644 index ff3389052d72b37e89b1278ffb0101fedfdd3279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7737 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 diff --git a/example-web/e2e/snapshots/reference/complex-layout-capture.png b/example-web/e2e/snapshots/reference/complex-layout-capture.png deleted file mode 100644 index 09bc97352be328b83b0a0583941e024aa08e4408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14107 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 diff --git a/example-web/e2e/snapshots/reference/image-test-screen-capture.png b/example-web/e2e/snapshots/reference/image-test-screen-capture.png deleted file mode 100644 index 39635c0eefc753bac182f04741a83157dc9c9a46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20520 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 Date: Mon, 4 May 2026 14:38:45 +0200 Subject: [PATCH 5/5] =?UTF-8?q?ci:=20address=20Copilot=20round=203=20?= =?UTF-8?q?=E2=80=94=20per-platform=20local=20snapshots,=20log=20upload,?= =?UTF-8?q?=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build-ios-new-arch: upload DiagnosticReports on failure (mirrors build-ios) so new-arch regressions are triageable from CI alone. - playwright.config.ts: keep the deduped shared baseline only on Linux / CI; on macOS / Windows fall back to per-platform snapshot files so local `npm run test:e2e` doesn't fail on font/anti-aliasing diffs and doesn't overwrite the committed Linux baseline. - README: stop hardcoding viewshot.spec.ts-snapshots; describe the generic `.ts-snapshots/` layout. Document the per-platform local fallback. - require-linux.js: the recovery message now points to the package-local path (e2e/snapshots/README.md) since the script runs from example-web. --- .github/workflows/ci.yml | 7 +++++++ example-web/e2e/snapshots/README.md | 31 ++++++++++++++-------------- example-web/playwright.config.ts | 8 +++++-- example-web/scripts/require-linux.js | 2 +- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e9510885..83ee7c4d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -246,6 +246,13 @@ jobs: -destination 'generic/platform=iOS Simulator' \ build CODE_SIGNING_ALLOWED=NO + - name: Upload iOS Build Logs (new arch) + if: failure() + uses: actions/upload-artifact@v4 + with: + name: ios-build-logs-new-arch + path: ~/Library/Logs/DiagnosticReports/ + test-windows-unit: name: Run Windows unit tests runs-on: ubuntu-latest diff --git a/example-web/e2e/snapshots/README.md b/example-web/e2e/snapshots/README.md index 3d044d06..29e3dfe2 100644 --- a/example-web/e2e/snapshots/README.md +++ b/example-web/e2e/snapshots/README.md @@ -5,24 +5,22 @@ Reference screenshots for visual regression testing with Playwright. ``` snapshots/ ├── reference/ -│ └── viewshot.spec.ts-snapshots/ # Golden snapshots (committed to git) -│ ├── basic-test-png-capture-chromium.png -│ └── ... -└── output/ # Test results (git-ignored) +│ └── .ts-snapshots/ # Golden snapshots (committed) +│ └── -chromium.png +└── output/ # Test results (git-ignored) ``` -A single golden file per test is committed regardless of OS (no -`-darwin` / `-linux` suffix). The CI runs on Linux + Chromium and is the -source of truth — local macOS or Windows runs will produce visual diffs -because of font and anti-aliasing differences. That's expected. +The CI (Linux + Chromium) writes a single shared golden file per test, +which is what gets committed. Local non-Linux runs use a per-platform +file (`-chromium-darwin.png` etc.) so font/anti-aliasing diffs +don't fail your local e2e and don't overwrite the committed Linux +baseline. Those local files are not committed. ## Updating snapshots -Snapshot baselines must be regenerated **on Linux only** (the CI -platform). The `npm run test:e2e:update-snapshots` script enforces this -locally — it refuses to run on macOS / Windows because the resulting -files would differ from the committed Linux baselines and fail CI on -the next run. +Baselines must be regenerated **on Linux only**. +`npm run test:e2e:update-snapshots` refuses to run on macOS / Windows +to prevent overwriting the committed Linux references. The recommended flow is to update via CI artifacts: @@ -30,9 +28,10 @@ The recommended flow is to update via CI artifacts: tests fail, the failing job uploads the rendered screenshots as the `web-snapshots-actual` artifact. 2. Download `web-snapshots-actual` from the failed GitHub Actions run. -3. For each `*-actual.png` file, copy it over the matching baseline in - `example-web/e2e/snapshots/reference/viewshot.spec.ts-snapshots/`, - dropping the `-actual` suffix. +3. For each `*-actual.png` file, copy it over the matching baseline + under the corresponding `.ts-snapshots/` directory in + `example-web/e2e/snapshots/reference/`, dropping the `-actual` + suffix. 4. Review the diff with `git diff` (image diffs render in GitHub PRs). 5. Commit if the visual change is intended. diff --git a/example-web/playwright.config.ts b/example-web/playwright.config.ts index 2b19ec1e..8e654f51 100644 --- a/example-web/playwright.config.ts +++ b/example-web/playwright.config.ts @@ -3,9 +3,13 @@ import {defineConfig, devices} from "@playwright/test"; export default defineConfig({ testDir: "./e2e", snapshotDir: "./e2e/snapshots/reference", - // No `{platform}` segment — Linux (CI) is the single source of truth. + // CI (Linux) writes/reads a single shared baseline; local non-Linux runs + // get their own per-platform files so font/anti-aliasing diffs don't fail + // local e2e and don't overwrite the committed Linux baseline. snapshotPathTemplate: - "{snapshotDir}/{testFilePath}-snapshots/{arg}-{projectName}{ext}", + process.env.CI || process.platform === "linux" + ? "{snapshotDir}/{testFilePath}-snapshots/{arg}-{projectName}{ext}" + : "{snapshotDir}/{testFilePath}-snapshots/{arg}-{projectName}-{platform}{ext}", fullyParallel: true, forbidOnly: !!process.env.CI, retries: process.env.CI ? 2 : 0, diff --git a/example-web/scripts/require-linux.js b/example-web/scripts/require-linux.js index 72ebef25..29d46387 100644 --- a/example-web/scripts/require-linux.js +++ b/example-web/scripts/require-linux.js @@ -3,7 +3,7 @@ if (process.platform !== "linux") { "\n Snapshot baselines must be regenerated on Linux (the CI platform).\n" + " On macOS / Windows the renders differ enough to overwrite the committed Linux baselines and fail CI.\n\n" + " Push your branch and grab the web-snapshots-actual artifact from the failing CI run\n" + - " (see example-web/e2e/snapshots/README.md).\n", + " (see e2e/snapshots/README.md).\n", ); process.exit(1); }