Fix release publish artifact download and per-job Gradle cache keys.

download-artifact accepts one glob pattern, not multiline lists; split platform and Android downloads. Scope Gradle build cache keys per job and use read-only setup-gradle on parallel jobs to avoid cache reservation races.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-14 02:00:10 +03:00
Unverified
parent 08e8a9c4eb
commit 49fe4c3aa9
4 changed files with 47 additions and 5 deletions
@@ -1,6 +1,11 @@
name: Restore Gradle build directories name: Restore Gradle build directories
description: Restore module build/ trees for faster CI Gradle jobs description: Restore module build/ trees for faster CI Gradle jobs
inputs:
scope:
description: Unique id for this job (part of the cache key; use restore-keys to reuse other scopes)
required: true
outputs: outputs:
cache-hit: cache-hit:
description: Whether an exact cache key match was restored description: Whether an exact cache key match was restored
@@ -21,6 +26,6 @@ runs:
app/android/build app/android/build
utils/shared/build utils/shared/build
utils/android/build utils/android/build
key: gradle-build-${{ runner.os }}-${{ runner.arch }}-v1-${{ hashFiles('gradle/libs.versions.toml', 'settings.gradle.kts', 'gradle.properties', 'app/desktop/build.gradle.kts', 'app/desktop/proguard-rules.pro', 'app/shared/build.gradle.kts', 'app/android/build.gradle.kts', 'utils/shared/build.gradle.kts', 'utils/android/build.gradle.kts') }} key: gradle-build-${{ runner.os }}-${{ runner.arch }}-v1-${{ inputs.scope }}-${{ hashFiles('gradle/libs.versions.toml', 'settings.gradle.kts', 'gradle.properties', 'app/desktop/build.gradle.kts', 'app/desktop/proguard-rules.pro', 'app/shared/build.gradle.kts', 'app/android/build.gradle.kts', 'utils/shared/build.gradle.kts', 'utils/android/build.gradle.kts') }}
restore-keys: | restore-keys: |
gradle-build-${{ runner.os }}-${{ runner.arch }}-v1- gradle-build-${{ runner.os }}-${{ runner.arch }}-v1-
@@ -1,5 +1,5 @@
name: Save Gradle build directories name: Save Gradle build directories
description: Save module build/ trees after a Gradle build (always runs, even on cache hit) description: Save module build/ trees after a Gradle build
inputs: inputs:
primary-key: primary-key:
@@ -10,6 +10,7 @@ runs:
using: composite using: composite
steps: steps:
- uses: actions/cache/save@v5 - uses: actions/cache/save@v5
continue-on-error: true
with: with:
key: ${{ inputs.primary-key }} key: ${{ inputs.primary-key }}
path: | path: |
+5 -1
View File
@@ -6,6 +6,10 @@ inputs:
description: Optional JDK architecture (x64). Omit for host default. description: Optional JDK architecture (x64). Omit for host default.
required: false required: false
default: "" default: ""
cache-read-only:
description: Restore Gradle User Home only; do not save (avoids parallel cache write races).
required: false
default: "false"
runs: runs:
using: composite using: composite
@@ -19,6 +23,6 @@ runs:
- uses: gradle/actions/setup-gradle@v5 - uses: gradle/actions/setup-gradle@v5
with: with:
gradle-version: wrapper gradle-version: wrapper
cache-read-only: false cache-read-only: ${{ inputs.cache-read-only == 'true' }}
cache-overwrite-existing: true cache-overwrite-existing: true
add-job-summary: on-failure add-job-summary: on-failure
+34 -2
View File
@@ -86,6 +86,8 @@ jobs:
version: ${{ needs.resolve-version.outputs.version }} version: ${{ needs.resolve-version.outputs.version }}
- uses: ./.github/actions/cache-gradle-build - uses: ./.github/actions/cache-gradle-build
id: gradle-build-cache id: gradle-build-cache
with:
scope: build-jar
- name: Compile and ProGuard release desktop jars - name: Compile and ProGuard release desktop jars
run: ./gradlew :app:desktop:exportReleaseProguardForCi --no-daemon --console=plain run: ./gradlew :app:desktop:exportReleaseProguardForCi --no-daemon --console=plain
- uses: ./.github/actions/save-gradle-build-cache - uses: ./.github/actions/save-gradle-build-cache
@@ -112,6 +114,8 @@ jobs:
version: ${{ needs.resolve-version.outputs.version }} version: ${{ needs.resolve-version.outputs.version }}
- uses: ./.github/actions/cache-gradle-build - uses: ./.github/actions/cache-gradle-build
id: gradle-build-cache id: gradle-build-cache
with:
scope: windows-installer
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
with: with:
targets: x86_64-pc-windows-msvc targets: x86_64-pc-windows-msvc
@@ -166,15 +170,21 @@ jobs:
run: call scripts\ensure-windows-arm64-jdk.cmd run: call scripts\ensure-windows-arm64-jdk.cmd
- uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/setup-java-gradle
if: matrix.arch == 'x64' if: matrix.arch == 'x64'
with:
cache-read-only: "true"
- uses: gradle/actions/setup-gradle@v5 - uses: gradle/actions/setup-gradle@v5
if: matrix.arch == 'arm64' if: matrix.arch == 'arm64'
with: with:
gradle-version: wrapper gradle-version: wrapper
cache-read-only: true
add-job-summary: on-failure add-job-summary: on-failure
- uses: ./.github/actions/set-version - uses: ./.github/actions/set-version
with: with:
version: ${{ needs.resolve-version.outputs.version }} version: ${{ needs.resolve-version.outputs.version }}
- uses: ./.github/actions/cache-gradle-build - uses: ./.github/actions/cache-gradle-build
id: gradle-build-cache
with:
scope: windows-package-${{ matrix.arch }}
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v5
with: with:
name: desktop-proguard name: desktop-proguard
@@ -205,6 +215,10 @@ jobs:
name: windows-${{ matrix.arch }} name: windows-${{ matrix.arch }}
path: app/desktop/build/distributions/release/*-windows-${{ matrix.arch }}.exe path: app/desktop/build/distributions/release/*-windows-${{ matrix.arch }}.exe
if-no-files-found: error if-no-files-found: error
- uses: ./.github/actions/save-gradle-build-cache
if: always()
with:
primary-key: ${{ steps.gradle-build-cache.outputs.cache-primary-key }}
macos: macos:
name: macOS (${{ matrix.label }}) name: macOS (${{ matrix.label }})
@@ -227,13 +241,18 @@ jobs:
if: matrix.arch == 'x64' if: matrix.arch == 'x64'
with: with:
java-architecture: x64 java-architecture: x64
cache-read-only: "true"
- uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/setup-java-gradle
if: matrix.arch == 'arm64' if: matrix.arch == 'arm64'
with:
cache-read-only: "true"
- uses: ./.github/actions/set-version - uses: ./.github/actions/set-version
with: with:
version: ${{ needs.resolve-version.outputs.version }} version: ${{ needs.resolve-version.outputs.version }}
- uses: ./.github/actions/cache-gradle-build - uses: ./.github/actions/cache-gradle-build
id: gradle-build-cache id: gradle-build-cache
with:
scope: macos-${{ matrix.arch }}
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v5
with: with:
name: desktop-proguard name: desktop-proguard
@@ -266,7 +285,7 @@ jobs:
path: app/desktop/build/distributions/release/*-macOS-${{ matrix.arch }}.dmg path: app/desktop/build/distributions/release/*-macOS-${{ matrix.arch }}.dmg
if-no-files-found: error if-no-files-found: error
- uses: ./.github/actions/save-gradle-build-cache - uses: ./.github/actions/save-gradle-build-cache
if: always() && matrix.arch == 'arm64' if: always()
with: with:
primary-key: ${{ steps.gradle-build-cache.outputs.cache-primary-key }} primary-key: ${{ steps.gradle-build-cache.outputs.cache-primary-key }}
@@ -292,11 +311,15 @@ jobs:
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/setup-java-gradle
with:
cache-read-only: "true"
- uses: ./.github/actions/set-version - uses: ./.github/actions/set-version
with: with:
version: ${{ needs.resolve-version.outputs.version }} version: ${{ needs.resolve-version.outputs.version }}
- uses: ./.github/actions/cache-gradle-build - uses: ./.github/actions/cache-gradle-build
id: gradle-build-cache id: gradle-build-cache
with:
scope: linux-${{ matrix.arch }}
- uses: actions/download-artifact@v5 - uses: actions/download-artifact@v5
with: with:
name: desktop-proguard name: desktop-proguard
@@ -327,7 +350,7 @@ jobs:
app/desktop/build/distributions/release/*-linux-${{ matrix.arch }}.AppImage app/desktop/build/distributions/release/*-linux-${{ matrix.arch }}.AppImage
if-no-files-found: error if-no-files-found: error
- uses: ./.github/actions/save-gradle-build-cache - uses: ./.github/actions/save-gradle-build-cache
if: always() && matrix.arch == 'arm64' if: always()
with: with:
primary-key: ${{ steps.gradle-build-cache.outputs.cache-primary-key }} primary-key: ${{ steps.gradle-build-cache.outputs.cache-primary-key }}
@@ -339,11 +362,16 @@ jobs:
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- uses: ./.github/actions/setup-java-gradle - uses: ./.github/actions/setup-java-gradle
with:
cache-read-only: "true"
- uses: android-actions/setup-android@v4 - uses: android-actions/setup-android@v4
- uses: ./.github/actions/set-version - uses: ./.github/actions/set-version
with: with:
version: ${{ needs.resolve-version.outputs.version }} version: ${{ needs.resolve-version.outputs.version }}
- uses: ./.github/actions/cache-gradle-build - uses: ./.github/actions/cache-gradle-build
id: gradle-build-cache
with:
scope: android
- name: Cache Android SDK extras - name: Cache Android SDK extras
uses: actions/cache@v5 uses: actions/cache@v5
with: with:
@@ -379,6 +407,10 @@ jobs:
printf '%s' "$GOOGLE_SERVICES_JSON" | base64 -d > app/android/google-services.json printf '%s' "$GOOGLE_SERVICES_JSON" | base64 -d > app/android/google-services.json
- name: Build universal Android APK - name: Build universal Android APK
run: ./gradlew :app:android:assembleRelease --no-daemon --console=plain run: ./gradlew :app:android:assembleRelease --no-daemon --console=plain
- uses: ./.github/actions/save-gradle-build-cache
if: always()
with:
primary-key: ${{ steps.gradle-build-cache.outputs.cache-primary-key }}
- name: Stage APK - name: Stage APK
run: | run: |
mkdir -p release-staging mkdir -p release-staging