1name: Presubmit 2 3on: [pull_request] 4 5concurrency: 6 group: build-${{ github.ref }} 7 cancel-in-progress: true 8 9env: 10 JDK_VERSION: 17 11 DISTRIBUTION: 'zulu' 12 13jobs: 14 build: 15 name: Build 16 runs-on: ubuntu-latest 17 timeout-minutes: 120 18 steps: 19 - name: Checkout 20 uses: actions/checkout@v4 21 22 - name: Validate Gradle Wrapper 23 uses: gradle/wrapper-validation-action@v2 24 25 - name: Set up JDK 26 uses: actions/setup-java@v4 27 with: 28 distribution: ${{ env.DISTRIBUTION }} 29 java-version: ${{ env.JDK_VERSION }} 30 cache: gradle 31 32 - name: Setup Gradle 33 uses: gradle/gradle-build-action@v3 34 35 - name: Build all build type and flavor permutations 36 run: ./gradlew assemble --parallel --build-cache 37 38 - name: Upload build outputs (APKs) 39 uses: actions/upload-artifact@v4 40 with: 41 name: build-outputs 42 path: app/build/outputs 43 44 - name: Upload build reports 45 if: always() 46 continue-on-error: true 47 uses: actions/upload-artifact@v4 48 with: 49 name: build-reports 50 path: "*/build/reports" 51 52 test: 53 name: Unit Tests 54 runs-on: ubuntu-latest 55 timeout-minutes: 120 56 steps: 57 - name: Checkout 58 uses: actions/checkout@v4 59 60 - name: Validate Gradle Wrapper 61 uses: gradle/wrapper-validation-action@v2 62 63 - name: Set up JDK 64 uses: actions/setup-java@v4 65 with: 66 distribution: ${{ env.DISTRIBUTION }} 67 java-version: ${{ env.JDK_VERSION }} 68 cache: gradle 69 70 - name: Setup Gradle 71 uses: gradle/gradle-build-action@v3 72 continue-on-error: true 73 74 - name: Run local tests 75 run: ./gradlew test --parallel --build-cache 76 77 - name: Upload test reports on failure 78 if: failure() 79 uses: actions/upload-artifact@v4 80 with: 81 name: test-reports 82 path: "*/build/reports/tests" 83 84 android-test: 85 name: Instrumentation Tests (${{ matrix.device.name }}) 86 runs-on: ubuntu-latest 87 timeout-minutes: 30 88 strategy: 89 fail-fast: false 90 matrix: 91 device: 92 - { name: pixel2Api28, img: 'system-images;android-28;google_apis;x86' } 93 - { name: pixel8Api34, img: 'system-images;android-34;aosp_atd;x86_64' } 94 95 steps: 96 - name: Checkout 97 uses: actions/checkout@v4 98 99 - name: Enable KVM group perms 100 run: | 101 echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules 102 sudo udevadm control --reload-rules 103 sudo udevadm trigger --name-match=kvm 104 105 - name: Set up JDK 106 uses: actions/setup-java@v4 107 with: 108 distribution: ${{ env.DISTRIBUTION }} 109 java-version: ${{ env.JDK_VERSION }} 110 111 - name: Install Emulator 112 run: | 113 yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager --install "${{ matrix.device.img }}" 114 115 116 - name: Accept licenses 117 run: yes | "$ANDROID_HOME"/cmdline-tools/latest/bin/sdkmanager --licenses || true 118 119 - name: Run instrumentation tests 120 uses: gradle/gradle-build-action@v3 121 with: 122 arguments: ${{ matrix.device.name }}DebugAndroidTest 123 124 - name: Upload instrumentation test reports and logs on failure 125 if: failure() 126 uses: actions/upload-artifact@v4 127 with: 128 name: instrumentation-test-reports-${{ matrix.device.name }} 129 path: | 130 */build/reports/androidTests/**/${{ matrix.device.name }} 131 */build/outputs/androidTest-results/**/${{ matrix.device.name }} 132 133 spotless: 134 name: Spotless Check 135 runs-on: ubuntu-latest 136 timeout-minutes: 60 137 steps: 138 - name: Checkout 139 uses: actions/checkout@v4 140 with: 141 fetch-depth: 0 142 143 - name: Validate Gradle Wrapper 144 uses: gradle/wrapper-validation-action@v2 145 146 - name: Set up JDK 147 uses: actions/setup-java@v4 148 with: 149 distribution: ${{ env.DISTRIBUTION }} 150 java-version: ${{ env.JDK_VERSION }} 151 cache: gradle 152 153 - name: Setup Gradle 154 uses: gradle/gradle-build-action@v3 155 156 - name: Spotless Check 157 run: ./gradlew spotlessCheck --init-script gradle/init.gradle.kts --parallel --build-cache 158