diff --git a/.github/scripts/summarize-maestro.mjs b/.github/scripts/summarize-maestro.mjs index 0ba097558f..7154f5b0ee 100644 --- a/.github/scripts/summarize-maestro.mjs +++ b/.github/scripts/summarize-maestro.mjs @@ -116,7 +116,10 @@ function platformResult({name, status, root, artifactUrl}) { // A cancelled or timed-out Maestro run may never flush JUnit. Its CLI log is // streamed continuously, so use those failure lines when JUnit has no detail. const failures = junitFailures.length > 0 ? junitFailures : cliFailures - const failed = status !== 'success' || failures.length > 0 + // A skipped platform (e.g. iOS while temporarily disabled) is not a failure + // as long as it produced no flow failures. + const failed = + (status !== 'success' && status !== 'skipped') || failures.length > 0 return { name, status, @@ -129,7 +132,9 @@ function platformResult({name, status, root, artifactUrl}) { } function statusEmoji(status) { - return status === 'success' ? ':white_check_mark:' : ':x:' + if (status === 'success') return ':white_check_mark:' + if (status === 'skipped') return ':fast_forward:' + return ':x:' } function slackEscape(value) { @@ -179,8 +184,14 @@ function githubSummary({notify, platforms, shortSha, runUrl, commitUrl}) { ] for (const platform of platforms) { + const headerEmoji = + platform.status === 'success' + ? '✅' + : platform.status === 'skipped' + ? '⏭️' + : '❌' lines.push( - `## ${platform.status === 'success' ? '✅' : '❌'} ${platform.name}`, + `## ${headerEmoji} ${platform.name}`, '', `Job status: \`${platform.status}\``, '', diff --git a/.github/workflows/nightly-e2e.yml b/.github/workflows/nightly-e2e.yml index b46daab3ea..b663e672e1 100644 --- a/.github/workflows/nightly-e2e.yml +++ b/.github/workflows/nightly-e2e.yml @@ -29,7 +29,8 @@ env: jobs: ios: name: iOS Maestro E2E - if: github.repository == 'bluesky-social/social-app' + # TODO(samuel): temporarily disabled while stabilizing Android; restore to: github.repository == 'bluesky-social/social-app' + if: false runs-on: macos-26-xlarge timeout-minutes: 120 steps: @@ -210,7 +211,10 @@ jobs: android_sdk="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-/usr/local/lib/android/sdk}}" sdkmanager_bin="$android_sdk/cmdline-tools/latest/bin/sdkmanager" avdmanager_bin="$android_sdk/cmdline-tools/latest/bin/avdmanager" - system_image="system-images;android-35;google_apis;x86_64" + # API 35 emulator images have known stability problems in headless CI + # (see flutter/flutter#153445); the qemu process died deterministically + # on the first native stack-screen push with the API 35 image. + system_image="system-images;android-34;google_apis;x86_64" if [ ! -x "$sdkmanager_bin" ] || [ ! -x "$avdmanager_bin" ]; then echo "Android command-line tools were not found under $android_sdk" >&2 @@ -264,6 +268,9 @@ jobs: # PID from that file directly; killing the subshell would not kill the # emulator child. ( + # wait returns the emulator's non-zero status on crash; set -e would + # abort the subshell before the status is logged. + set +e "$android_sdk/emulator/emulator" @nightly-e2e \ -port 5554 \ -no-window \ @@ -325,8 +332,14 @@ jobs: pgrep -fa "emulator.*nightly-e2e" || echo "Emulator process not found" echo "=== Emulator exit status ===" grep "Emulator exited" artifacts/android/emulator.log || echo "No emulator exit status recorded" - echo "=== OOM killer check ===" - sudo dmesg 2>/dev/null | grep -i "oom\|killed\|out of memory" | tail -20 || echo "dmesg not available" + echo "=== OOM killer check (kernel) ===" + oom_lines=$(sudo dmesg 2>/dev/null | grep -iE "oom|killed process|out of memory" | tail -20) + echo "${oom_lines:-No kernel OOM evidence found (or dmesg unavailable)}" + echo "=== systemd-oomd check ===" + oomd_lines=$(journalctl -u systemd-oomd --no-pager 2>/dev/null | tail -20) + echo "${oomd_lines:-No systemd-oomd journal entries (or journalctl unavailable)}" + echo "=== journal kernel tail ===" + journalctl -k --no-pager 2>/dev/null | tail -30 || echo "journalctl -k unavailable" echo "=== Emulator crash database ===" ls -la /tmp/android-runner/emu-crash-*.db 2>/dev/null || echo "No crash database found" } > artifacts/android/emulator-diagnostics.log 2>&1