diff --git a/.github/actions/disk-cleanup/action.yml b/.github/actions/disk-cleanup/action.yml new file mode 100644 index 00000000000..4c3e097c810 --- /dev/null +++ b/.github/actions/disk-cleanup/action.yml @@ -0,0 +1,34 @@ +name: Disk cleanup +description: Clean up disk space by removing unnecessary files +runs: + using: 'composite' + steps: + - name: Clean up unnecessary files + shell: bash + run: | + # Remove .NET SDKs + sudo rm -rf /usr/share/dotnet + + # Remove Swift toolchain + sudo rm -rf /usr/share/swift + + # Remove Haskell (GHC) + sudo rm -rf /usr/local/.ghcup + + # Remove Julia + sudo rm -rf /usr/local/julia* + + # Remove Chromium (optional if not using for browser tests) + sudo rm -rf /usr/local/share/chromium + + # Remove Microsoft/Edge and Google Chrome builds + sudo rm -rf /opt/microsoft /opt/google + + # Remove Azure CLI + sudo rm -rf /opt/az + + # Remove PowerShell + sudo rm -rf /usr/local/share/powershell + + # Remove CodeQL and other toolcaches + sudo rm -rf /opt/hostedtoolcache diff --git a/.github/actions/disk-usage/action.yml b/.github/actions/disk-usage/action.yml new file mode 100644 index 00000000000..35ab674fe4f --- /dev/null +++ b/.github/actions/disk-usage/action.yml @@ -0,0 +1,24 @@ +name: Disk usage +description: Show disk usage +runs: + using: 'composite' + steps: + - name: Total runner disk usage + shell: bash + run: df -h / + + - name: Workspace usage + shell: bash + run: du -sh $GITHUB_WORKSPACE || true + + - name: Gradle user home usage + shell: bash + run: du -sh ~/.gradle || true + + - name: Gradle cache usage + shell: bash + run: du -sh ~/.gradle/caches ~/.gradle/wrapper || true + + - name: Build outputs usage + shell: bash + run: du -sh build app-*/build || true diff --git a/.github/actions/setup-gradle/action.yml b/.github/actions/setup-gradle/action.yml new file mode 100644 index 00000000000..bc9d0109316 --- /dev/null +++ b/.github/actions/setup-gradle/action.yml @@ -0,0 +1,34 @@ +name: Set up Gradle build environment +description: Prepares environment for building with JDK and Gradle +inputs: + run-release: + description: 'Whether to run in release mode (true/false). In release mode, Gradle cache is not used.' + required: false + default: 'false' + add-job-summary: + description: 'Whether to add a job summary (always, never, on-failure).' + required: false + default: 'always' + cache-encryption-key: + description: 'The secret key to use for encrypting the Gradle cache.' + required: false + default: '' +runs: + using: 'composite' + steps: + - name: Copy CI gradle.properties + shell: bash + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Set up JDK + uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + with: + distribution: 'temurin' + java-version: '21' + + - name: Set up Gradle without cache + uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 + with: + cache-disabled: ${{ inputs.run-release }} + add-job-summary: ${{ inputs.add-job-summary }} + cache-encryption-key: ${{ inputs.cache-encryption-key }} diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f3446bfc3dd..bec4151c9d3 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -5,16 +5,16 @@ runs: steps: - name: Copy CI gradle.properties shell: bash - run: mkdir -p ~/.gradle ; cp .github/ci-gradle-android-pr-workflow.properties ~/.gradle/gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - name: Set up JDK - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 with: distribution: 'temurin' java-version: '21' - name: Set up Gradle - uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 - name: Restore Gradle cache uses: ./.github/actions/gradle_cache diff --git a/.github/ci-gradle-android-pr-workflow.properties b/.github/ci-gradle-android-pr-workflow.properties deleted file mode 100644 index aa7bdba98be..00000000000 --- a/.github/ci-gradle-android-pr-workflow.properties +++ /dev/null @@ -1,10 +0,0 @@ -org.gradle.daemon=false -org.gradle.parallel=true -org.gradle.caching=true -org.gradle.configuration-cache=true -org.gradle.configuration-cache.parallel=true -org.gradle.workers.max=4 -org.gradle.jvmargs=-Xmx10g -XX:MaxMetaspaceSize=4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError - -kotlin.incremental=true -kotlin.compiler.execution.strategy=in-process diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties index 51c4e2f1d3f..ce414326caf 100644 --- a/.github/ci-gradle.properties +++ b/.github/ci-gradle.properties @@ -1,7 +1,10 @@ org.gradle.daemon=false org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true org.gradle.workers.max=4 -org.gradle.jvmargs=-Xmx10g -XX:MaxMetaspaceSize=2g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx10g -XX:MaxMetaspaceSize=4g -Dfile.encoding=UTF-8 -XX:+UseParallelGC kotlin.incremental=true kotlin.compiler.execution.strategy=in-process diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9206ebd8427..4d634ef05c9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,7 +1,11 @@ version: 2 updates: + # Dependabot does not support GitHub composite actions by default (.github/actions) + # so we need to add the folder by hand to the directories entry. - package-ecosystem: "github-actions" - directory: "/" + directories: + - "/" + - "/.github/actions/*" schedule: interval: "weekly" labels: diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml deleted file mode 100644 index 734f1898f8a..00000000000 --- a/.github/workflows/android.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: Android CI - -on: - push: - branches: - - main - pull_request: - paths-ignore: - - '.idea/**' - - '.gitattributes' - - '.github/**.json' - - '.gitignore' - - '.gitmodules' - - '**.md' - - 'LICENSE' - - 'NOTICE' - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - timeout-minutes: 90 - - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Copy CI gradle.properties - run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 - with: - distribution: 'temurin' - java-version: '21' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 - - - name: Quality - Spotless - run: ./gradlew spotlessCheck - - - name: Quality - Detekt - run: ./gradlew detekt - - - name: Quality - Lint - run: ./gradlew lint - - - name: Quality - Dependency Guard - run: ./gradlew dependencyGuard - - - name: Build (run full build and tests) - run: ./gradlew build diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml new file mode 100644 index 00000000000..02ab5498421 --- /dev/null +++ b/.github/workflows/build-android.yml @@ -0,0 +1,72 @@ +name: Android CI + +on: + push: + branches: + - main + pull_request: + paths-ignore: + - '.idea/**' + - '.gitattributes' + - '.github/**.json' + - '.gitignore' + - '.gitmodules' + - '**.md' + - 'LICENSE' + - 'NOTICE' + +permissions: + contents: read + +concurrency: + group: android-ci-${{ github.ref }}-${{ github.event.pull_request.number || 'no-pr' }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +jobs: + build-android: + name: Build Android application + runs-on: ubuntu-latest + timeout-minutes: 90 + + steps: + - name: Checkout the repo + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + fetch-depth: 1 + + - name: Show disk usage + uses: ./.github/actions/disk-usage + + - name: Cleanup disk + uses: ./.github/actions/cleanup-disk + + - name: Setup Gradle environment + uses: ./.github/actions/setup-gradle + with: + cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} + + - name: Show disk usage + uses: ./.github/actions/disk-usage + + - name: Quality - Spotless + run: ./gradlew spotlessCheck + + - name: Quality - Detekt + run: ./gradlew detekt + + - name: Quality - Lint + run: ./gradlew lint + + - name: Show disk usage + uses: ./.github/actions/disk-usage + + - name: Quality - Dependency Guard + run: ./gradlew dependencyGuard + + - name: Build (run full build and tests) + run: ./gradlew build + + - name: Show disk usage + uses: ./.github/actions/disk-usage + + diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index 1c0acd30279..3d33499b7d0 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -22,16 +22,10 @@ jobs: - name: Install mdbook and extensions run: ./docs/install.sh - - name: Copy CI gradle.properties - run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 + - name: Setup Gradle environment + uses: ./.github/actions/setup-gradle with: - distribution: 'temurin' - java-version: '21' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 + cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Quality - Spotless Markdown Check run: ./gradlew spotlessFlexmarkCheck diff --git a/.github/workflows/shippable_builds.yml b/.github/workflows/shippable_builds.yml index 8a40f3c36a8..6b50dfa3467 100644 --- a/.github/workflows/shippable_builds.yml +++ b/.github/workflows/shippable_builds.yml @@ -220,23 +220,13 @@ jobs: fetch-depth: 0 token: ${{ steps.app-token.outputs.token || github.token }} - - name: Copy CI gradle.properties - if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} - shell: bash - run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 - if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} - with: - distribution: 'temurin' - java-version: '21' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 + - name: Setup Gradle environment if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} + uses: ./.github/actions/setup-gradle with: - cache-disabled: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" + run-release: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" add-job-summary: never + cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Get application info id: appinfo @@ -470,20 +460,12 @@ jobs: with: ref: ${{ steps.sha.outputs.app_sha }} - - name: Copy CI gradle.properties - shell: bash - run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - - uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5.0.0 - with: - distribution: 'temurin' - java-version: '21' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@748248ddd2a24f49513d8f472f81c3a07d4d50e1 # v4.4.4 + - name: Setup Gradle environment + uses: ./.github/actions/setup-gradle with: - cache-disabled: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" + run-release: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" add-job-summary: on-failure + cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }} - name: Set Version Code for Daily if: ${{ needs.dump_config.outputs.releaseType == 'daily' }}