name: Tests on: push: branches: [ master, 'robolectric-*.x', 'google' ] paths-ignore: - '**.md' pull_request: branches: [ master ] paths-ignore: - '**.md' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: contents: read env: cache-version: v1 jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'adopt' java-version: 17 - uses: gradle/actions/setup-gradle@v4 - name: Build run: | SKIP_ERRORPRONE=true SKIP_JAVADOC=true \ ./gradlew assemble testClasses --stacktrace unit-tests: runs-on: ubuntu-latest needs: build strategy: fail-fast: false matrix: api-versions: [ '21,22,23', '24,25,26', '27,28,29', '30,31,32', '33,34,35' ] steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'adopt' java-version: 17 - uses: gradle/actions/setup-gradle@v4 - name: Run unit tests run: | SKIP_ERRORPRONE=true SKIP_JAVADOC=true ./gradlew test \ --stacktrace --continue \ -Drobolectric.enabledSdks=${{ matrix.api-versions }} \ -Drobolectric.alwaysIncludeVariantMarkersInTestName=true \ -Dorg.gradle.workers.max=2 \ -x :integration_tests:nativegraphics:test \ -x :integration_tests:roborazzi:test - name: Upload Test Results uses: actions/upload-artifact@v4 if: always() with: name: test_results_${{ matrix.api-versions }} path: '**/build/test-results/**/TEST-*.xml' instrumentation-tests: runs-on: ubuntu-latest timeout-minutes: 60 needs: build strategy: # Allow tests to continue on other devices if they fail on one device. fail-fast: false matrix: api-level: [ 29, 34 ] steps: - name: Free disk space uses: jlumbroso/free-disk-space@v1.3.1 with: tool-cache: true android: false - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'adopt' java-version: 17 - uses: gradle/actions/setup-gradle@v4 - 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 - name: Determine emulator target id: determine-target run: | TARGET="google_apis" if [[ ${{ matrix.api-level }} -ge 34 ]]; then TARGET="aosp_atd" fi echo "TARGET=$TARGET" >> $GITHUB_OUTPUT - name: AVD cache uses: actions/cache@v4 id: avd-cache with: path: | ~/.android/avd/* ~/.android/adb* key: avd-ubuntu-${{ matrix.api-level }}-${{ env.cache-version }} - name: Create AVD and generate snapshot for caching if: steps.avd-cache.outputs.cache-hit != 'true' uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} target: ${{ steps.determine-target.outputs.TARGET }} arch: x86_64 force-avd-creation: false emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none disable-animations: true script: echo "Generated AVD snapshot for caching." - name: Run device tests # We need to use adb shell wm density to reset device's density to use fixed density # for all devices. Hope it can improve the stability of Emulator testing. uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} target: ${{ steps.determine-target.outputs.TARGET }} 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 profile: Nexus One script: | adb shell wm density 240 SKIP_ERRORPRONE=true SKIP_JAVADOC=true ./gradlew cAT --stacktrace -Dorg.gradle.workers.max=2 - name: Upload test results if: always() uses: actions/upload-artifact@v4 with: name: test-results-${{ matrix.api-level }}-${{ steps.determine-target.outputs.TARGET }}-${{ matrix.shard }} path: | **/build/reports/* **/build/outputs/*/connected/* publish-to-snapshots: runs-on: ubuntu-latest env: SONATYPE_LOGIN: ${{ secrets.SONATYPE_LOGIN }} SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} needs: unit-tests if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'adopt' java-version: 17 - uses: gradle/actions/setup-gradle@v4 - name: Publish run: ./gradlew publish --stacktrace