Retry only failed Android E2E flows - #57998
Open
cipolleschi wants to merge 5 commits into
Open
Conversation
|
@cipolleschi has imported this pull request. If you are a Meta employee, you can view this in D116463690. |
cipolleschi
force-pushed
the
cipolleschi/ci/android-e2e-selective-retries
branch
from
August 18, 2026 19:38
29f35f4 to
eab1a5b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary:
Android Maestro E2E jobs currently stop after the first flow that exhausts its in-process retries. The workflow-level retry then starts the whole suite again, including flows that already passed.
This changes the retry model so that:
passed,failed, andpendingstate is saved atomically after every flow;The Android E2E timeout is increased from 60 to 90 minutes to give the initial all-flows attempt enough time to finish. The existing three workflow attempts now provide up to three executions per failing flow instead of multiplying workflow retries by in-process retries.
CI follow-ups
if: always()preserves passed, failed, and pending results after an E2E timeout.test_jsvariants failed because the repository Jest preset throws wheneverconsole.erroris called, and the new failure-path unit test intentionally exercised a production error log. The test now mocks that expected log while continuing to assert the aggregate flow failure.image-wide-gamut.ymlwith exactly 83.974% screenshot similarity andlegacy-native-module.ymlbefore the APIs search became visible, while Release passed both immediately. Reproducing Debug with an offline Android emulator showed the actual cause: importingImageExample.jseagerly starts a Facebook image prefetch, and its promise could reject before the Image Loading Events example attached its rejection callback. That produced anUncaught (in promise): UnknownHostExceptionLogBox notification, which covered the screenshot and intercepted the APIs tab. The prefetch now attaches a rejection handler immediately while preserving the existing example-level success/failure reporting. No LogBox dismissal or E2E-specific workaround remains.Changelog:
[INTERNAL] [CHANGED] - Retry only failed or unfinished Android Maestro E2E flows.
Test Plan:
git diff --check(passed)node --check .github/workflow-scripts/maestro-android.js(passed)yarn jest .github/workflow-scripts/__tests__/maestro-android-test.js --runInBand --config '{"testEnvironment":"node","transform":{}}'(passed)ruby -ryaml -e "ARGV.each { |file| YAML.parse_file(file) }" .github/actions/maestro-android/action.yml .github/workflows/e2e-android-rntester.yml .github/workflows/e2e-android-templateapp.yml .github/workflows/test-all.yml(passed)yarn prettier --check .github/workflow-scripts/maestro-android.js .github/workflow-scripts/__tests__/maestro-android-test.js .github/actions/maestro-android/action.yml .github/workflows/e2e-android-rntester.yml .github/workflows/e2e-android-templateapp.yml .github/workflows/test-all.yml(passed)jqpredicate returns false only when every recorded flow has passed../node_modules/.bin/prettier --check packages/rn-tester/js/examples/Image/ImageExample.js(passed)logcatreportedUncaught (in promise): UnknownHostExceptionand LogBox covered the bottom navigation. After the fix, no unhandled rejection or LogBox appeared, the APIs tab displayedexplorer_search, and the wide-gamut example was unobstructed.