name: Test/Build on: pull_request: branches: [main] push: branches: [main] permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: lint: runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout code uses: actions/checkout@v6 - name: Set up JDK 21 uses: actions/setup-java@v5 with: distribution: 'zulu' java-version: 21 cache: gradle - name: Linter (gradle) run: ./gradlew spotlessCheck build-desktop: needs: lint strategy: fail-fast: false matrix: include: - os: ubuntu-latest desktop-task: packageDeb desktop-artifact-name: Desktop Linux DEB desktop-artifact-path: desktopApp/build/compose/binaries/main/deb/*.deb - os: macos-latest desktop-task: packageDmg desktop-artifact-name: Desktop macOS DMG desktop-artifact-path: desktopApp/build/compose/binaries/main/dmg/*.dmg - os: windows-latest desktop-task: packageMsi desktop-artifact-name: Desktop Windows MSI desktop-artifact-path: desktopApp/build/compose/binaries/main/msi/*.msi runs-on: ${{ matrix.os }} timeout-minutes: 60 defaults: run: shell: bash steps: - name: Checkout code uses: actions/checkout@v6 - name: Set up JDK 21 uses: actions/setup-java@v5 with: distribution: 'zulu' java-version: 21 cache: gradle # Cache vlc-setup plugin downloads (VLC + UPX archives) keyed on the # versions pinned in desktopApp/build.gradle.kts. Each OS gets its own # cache namespace because the plugin downloads platform-specific archives. # On a hit the vlcDownload / upxDownload tasks are up-to-date and we # never touch get.videolan.org; on a miss (version bump or new runner) # we fall back to fetching, which is what the in-build retry budget # exists for. - name: Cache vlc-setup downloads uses: actions/cache@v4 with: path: ~/.gradle/vlcSetup key: vlcsetup-${{ runner.os }}-${{ hashFiles('desktopApp/build.gradle.kts') }} restore-keys: | vlcsetup-${{ runner.os }}- - name: Test + Build Desktop (gradle) run: ./gradlew :quartz:jvmTest :commons:jvmTest :nestsClient:jvmTest :cli:test :desktopApp:test :desktopApp:${{ matrix.desktop-task }} --no-daemon # jpackage pins libicu to the build host's version (libicu74 on # ubuntu-24.04). Rewrite the .deb so testers on other Debian/Ubuntu # releases can install the uploaded artifact. - name: Relax libicu dependency in .deb if: matrix.desktop-task == 'packageDeb' run: | set -euo pipefail chmod +x scripts/relax-deb-libicu.sh scripts/relax-deb-libicu.sh desktopApp/build/compose/binaries/main/deb/*.deb - name: Upload Desktop Distribution uses: actions/upload-artifact@v7 with: name: ${{ matrix.desktop-artifact-name }} path: ${{ matrix.desktop-artifact-path }} test-and-build-android: needs: lint runs-on: ubuntu-latest timeout-minutes: 60 steps: - name: Checkout code uses: actions/checkout@v6 - name: Set up JDK 21 uses: actions/setup-java@v5 with: distribution: 'zulu' java-version: 21 cache: gradle - name: Android Lint (gradle) run: ./gradlew :amethyst:lintFdroidBenchmark :amethyst:lintPlayBenchmark --no-daemon - name: Upload Android Lint Reports uses: actions/upload-artifact@v7 if: always() with: name: Android Lint Reports path: amethyst/build/reports/lint-results-*.html - name: Test + Build Android (gradle) run: ./gradlew test assembleBenchmark --no-daemon - name: Android Test Report uses: asadmansr/android-test-report-action@v1.2.0 if: always() - name: Upload Test Results uses: actions/upload-artifact@v7 if: always() with: name: Test Reports path: amethyst/build/reports - name: Upload Play APK Benchmark uses: actions/upload-artifact@v7 with: name: Play Benchmark APK path: amethyst/build/outputs/apk/play/benchmark/amethyst-play-universal-benchmark.apk - name: Upload FDroid APK Benchmark uses: actions/upload-artifact@v7 with: name: FDroid Benchmark APK path: amethyst/build/outputs/apk/fdroid/benchmark/amethyst-fdroid-universal-benchmark.apk - name: Upload Compose Reports uses: actions/upload-artifact@v7 with: name: Compose Reports path: amethyst/build/compose_compiler