Skip to content

refactor(crashlytics): migrate to TypeScript. #3567

refactor(crashlytics): migrate to TypeScript.

refactor(crashlytics): migrate to TypeScript. #3567

name: Testing E2E Android
on:
workflow_dispatch:
inputs:
iterations:
description: "Number of iterations to run. Default 1. Max 256."
required: true
default: 1
type: number
pull_request:
branches:
- '**'
paths-ignore:
- 'docs/**'
- 'website/**'
- '.spellcheck.dict.txt'
- '**/*.md'
push:
branches:
- main
- v14-release
paths-ignore:
- 'docs/**'
- 'website/**'
- '.spellcheck.dict.txt'
- '**/*.md'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# We want to generate our matrix dynamically
# Initial job generates the matrix as a JSON, and following job will use deserialize and use the result
matrix_prep:
# Do not run the scheduled jobs on forks
if: (github.event_name == 'schedule' && github.repository == 'invertase/react-native-firebase') || (github.event_name != 'schedule')
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.build-matrix.outputs.result }}
steps:
- id: build-matrix
uses: actions/github-script@v7
with:
script: |
// by default, we will run one iteration
let iterationArray = [0]
// workflow dispatch will be a drop-down of different options
if (context.eventName === "workflow_dispatch") {
const inputs = ${{ toJSON(inputs) }}
console.log('inputs is: ' + JSON.stringify(inputs))
const iterationInput = inputs.iterations
console.log('iterations input is: ' + iterationInput)
// this will expand for example with input 5 => [0, 1, 2, 3, 4]
iterationArray = []
for (let i = 0; i < iterationInput; i++) {
iterationArray.push(i);
}
console.log('iterationArray is: ' + iterationArray)
}
// If we are running on a schedule it's our periodic passive scan for flakes
// Goal is to run enough iterations on all systems that we have confidence there are no flakes
if (context.eventName === "schedule") {
const iterationCount = 15
for (let i = 0; i < iterationCount; i++) {
iterationArray.push(i);
}
}
// TODO Refactor to make these dynamic with a minSdk/max bracket only on schedule, not push
let apiLevel = [36];
// These are used for performance tuning what emulator to use.
// try different architectures, targets etc
let arch = ['x86_64'];
let target = ['google_apis'];
return {
"iteration": iterationArray,
"api-level": apiLevel,
"arch": arch,
"target": target
}
- name: Debug Output
run: echo "${{ steps.build-matrix.outputs.result }}"
# This uses the matrix generated from the matrix-prep stage
# it will run unit tests on whatever OS combinations are desired
android:
name: Android (${{ matrix.api-level }}, ${{ matrix.arch }}, ${{ matrix.target }}, ${{ matrix.iteration }})
runs-on: ubuntu-latest
needs: matrix_prep
timeout-minutes: 60
strategy:
fail-fast: false
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
steps:
- name: Free Disk Space (Ubuntu)
uses: AdityaGarg8/remove-unwanted-software@v5
with:
remove-dotnet: true
remove-haskell: true
remove-codeql: true
remove-docker-images: true
remove-large-packages: true # ths is slow, but recently we need that last ~2GB as of 20251120
- name: Post Free Disk Space (Ubuntu)
run: df -h
- name: Enable KVM group perms
run: |
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- uses: actions/checkout@v4
with:
fetch-depth: 50
# Set up tool versions
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Configure JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
# Set path variables needed for caches
- name: Set workflow variables
id: workflow-variables
run: |
echo "metro-cache=$HOME/.metro" >> $GITHUB_OUTPUT
echo "tempdir=$TMPDIR" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
name: Yarn Cache
id: yarn-cache
with:
path: .yarn/cache
key: ${{ runner.os }}-android-yarn-v1-${{ hashFiles('yarn.lock') }}
restore-keys: ${{ runner.os }}-android-yarn-v1
- name: Yarn Install
uses: nick-fields/retry@v3
with:
timeout_minutes: 15
retry_wait_seconds: 60
max_attempts: 3
command: DETOX_DISABLE_POSTINSTALL=1 yarn
- name: Cache Firestore Emulator
uses: actions/cache@v4
with:
path: ~/.cache/firebase/emulators
key: firebase-emulators-v1-${{ github.run_id }}
restore-keys: firebase-emulators-v1
- name: Start Firestore Emulator
run: yarn tests:emulator:start-ci
- uses: actions/cache@v4
name: Gradle Cache
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-v1-${{ hashFiles('yarn.lock', 'tests/android/build.gradle', 'tests/android/app/build.gradle') }}
restore-keys: ${{ runner.os }}-gradle-v1
- name: Build Android App
uses: nick-fields/retry@v3
with:
timeout_minutes: 25
retry_wait_seconds: 60
max_attempts: 3
command: yarn tests:android:build
- name: Metro Bundler Cache
uses: actions/cache@v4
with:
path: ${{ steps.workflow-variables.outputs.metro-cache }}
key: ${{ runner.os }}-metro-v1-${{ github.run_id }}
restore-keys: ${{ runner.os }}-metro-v1
- name: Pre-fetch Javascript bundle
# Prebuild the bundle so that's fast when the app starts.
run: |
nohup yarn tests:packager:jet-ci &
printf 'Waiting for packager to come online'
until curl --output /dev/null --silent --head --fail http://localhost:8081/status; do
printf '.'
sleep 2
done
echo "Packager is online! Preparing javascript bundle..."
curl --output /dev/null --silent --head --fail "http://localhost:8081/index.bundle?platform=android&dev=true&minify=false&inlineSourceMap=true"
echo "...javascript bundle ready."
- name: Test Tapper
# Detox uses Espresso to choreograph UI events, we send a stream of taps to keep choreography moving quickly
# Run this outside the emulator runner so the emulator runner does not wait on it for cleanup
run: |
nohup sh -c "until false; do $ANDROID_HOME/platform-tools/adb shell input tap 100 800; sleep 0.2; done" &
shell: bash
- name: Detox Tests
uses: reactivecircus/android-emulator-runner@v2
timeout-minutes: 45
with:
api-level: ${{ matrix.api-level }}
avd-name: TestingAVD
target: ${{ matrix.target }}
disable-spellchecker: true
arch: ${{ matrix.arch }}
emulator-build: 14214601 # needed as of 20251205 when emulator 36.3.10.0 (build_id 14472402) released
pre-emulator-launch-script: |
sudo mkdir /mnt/avd
sudo chown $USER:$USER /mnt/avd
mkdir -p $HOME/.android
ln -s /mnt/avd $HOME/.android/avd
script: |
$ANDROID_HOME/platform-tools/adb devices
nohup sh -c "$ANDROID_HOME/platform-tools/adb logcat '*:D' > adb-log.txt" &
yarn tests:android:test-cover --headless
yarn tests:android:test:jacoco-report
- uses: codecov/codecov-action@v5
with:
verbose: true
- name: Upload Emulator Log
uses: actions/upload-artifact@v4
if: always()
with:
name: adb_logs_${{ matrix.api-level}}_${{ matrix.arch }}_${{ matrix.target }}_${{ matrix.iteration }}
path: adb-*.txt