From 68a225ed9c0e8cf1cc7f2420faad22e628032d59 Mon Sep 17 00:00:00 2001 From: Jason Ross Date: Fri, 3 Jul 2026 10:23:36 -0500 Subject: [PATCH] ci(e2e): retry the API-29 emulator boot to absorb the android-emulator-runner keyevent race The matrix E2E (29) job intermittently fails (~2%, API-29 only) in reactivecircus/android-emulator-runner's un-guarded, fatal post-boot `adb shell input keyevent 82`: on snapshot resume sys.boot_completed=1 is restored before system_server republishes the `input` binder service, so the job aborts before Gradle runs with "No service published for: input" (fast-fail ~1m43s). Proven on run 28667366203. Make the "Run E2E tests" step non-fatal (id + continue-on-error) and add a guarded second attempt (if steps.e2e.outcome == 'failure'). Two independent boots drop the race to ~0.04%; a genuine failure on both attempts still fails the job (outcome, not conclusion). Definitive manual-boot fix: #218. Co-Authored-By: Claude Opus 4.8 --- .github/workflows/ci.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 825d7e1..d05abc5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -190,7 +190,27 @@ jobs: disable-animations: false script: echo "Generated AVD snapshot for caching." + # reactivecircus/android-emulator-runner runs an un-guarded, fatal `adb shell input keyevent 82` + # after boot. On snapshot resume that can race system_server (sys.boot_completed=1 before the + # `input` binder service is republished), aborting the job before Gradle runs with + # "No service published for: input" — an ~2%, API-29-only infra flake, not a test failure. Make + # the step non-fatal and retry once: two independent boots drop the race to ~0.04%. The definitive + # fix (adopt the e2e-preview job's manual-boot + `keyevent 82 || true`) is tracked separately. - name: Run E2E tests + id: e2e + continue-on-error: true + uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2.37.0 + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86_64 + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: ./gradlew connectedDebugAndroidTest --stacktrace + + - name: Run E2E tests (retry after emulator boot race) + if: steps.e2e.outcome == 'failure' uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # v2.37.0 with: api-level: ${{ matrix.api-level }}