name: Build on: push: branches: - main pull_request: concurrency: group: build-${{ github.ref }} cancel-in-progress: true jobs: test_and_apk: name: "Local tests and APKs" runs-on: ubuntu-latest permissions: contents: write timeout-minutes: 60 steps: - name: Checkout uses: actions/checkout@v4 - name: Validate Gradle Wrapper uses: gradle/wrapper-validation-action@v1 - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 - name: Setup Gradle uses: gradle/gradle-build-action@v2 - name: Check spotless run: ./gradlew spotlessCheck --init-script gradle/init.gradle.kts --no-configuration-cache - name: Run all local screenshot tests (Roborazzi) id: screenshotsverify continue-on-error: true run: ./gradlew verifyRoborazziDemoDebug - name: Prevent pushing new screenshots if this is a fork id: checkfork continue-on-error: false if: steps.screenshotsverify.outcome == 'failure' && github.event.pull_request.head.repo.full_name != github.repository run: | echo "::error::Screenshot tests failed, please create a PR in your fork first." && exit 1 # Runs if previous job failed - name: Generate new screenshots if verification failed and it's a PR id: screenshotsrecord if: steps.screenshotsverify.outcome == 'failure' && github.event_name == 'pull_request' run: | ./gradlew recordRoborazziDemoDebug - name: Push new screenshots if available uses: stefanzweifel/git-auto-commit-action@v5 if: steps.screenshotsrecord.outcome == 'success' with: file_pattern: '*/*.png' disable_globbing: true commit_message: "🤖 Updates screenshots" # Run local tests after screenshot tests to avoid wrong UP-TO-DATE. TODO: Ignore screenshots. - name: Run local tests if: always() run: ./gradlew testDemoDebug testProdDebug :lint:test - name: Build all build type and flavor permutations run: ./gradlew assemble - name: Upload build outputs (APKs) uses: actions/upload-artifact@v3 with: name: APKs path: '**/build/outputs/apk/**/*.apk' - name: Upload test results (XML) if: always() uses: actions/upload-artifact@v3 with: name: test-results path: '**/build/test-results/test*UnitTest/**.xml' - name: Check lint run: ./gradlew :app:lintProdRelease :app-nia-catalog:lintRelease :lint:lint - name: Upload lint reports (HTML) if: always() uses: actions/upload-artifact@v3 with: name: lint-reports path: '**/build/reports/lint-results-*.html' - name: Check badging run: ./gradlew :app:checkProdReleaseBadging androidTest: runs-on: macOS-latest # enables hardware acceleration in the virtual machine timeout-minutes: 60 strategy: matrix: api-level: [26, 30] steps: - name: Checkout uses: actions/checkout@v4 - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: 17 - name: Setup Gradle uses: gradle/gradle-build-action@v2 - name: Build projects before running emulator run: ./gradlew packageDemoDebug packageDemoDebugAndroidTest - name: Run instrumentation tests uses: reactivecircus/android-emulator-runner@v2 with: api-level: ${{ matrix.api-level }} arch: x86_64 disable-animations: true disk-size: 6000M heap-size: 600M script: ./gradlew connectedDemoDebugAndroidTest --daemon - name: Upload test reports if: always() uses: actions/upload-artifact@v3 with: name: test-reports-${{ matrix.api-level }} path: '**/build/reports/androidTests'