Run ProGuard once on Linux x64, reuse jars for all platform packaging.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-13 17:54:39 +03:00
Unverified
parent 3e2b4eef2f
commit e102d12198
2 changed files with 99 additions and 19 deletions
+47 -19
View File
@@ -25,6 +25,7 @@ concurrency:
env: env:
GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g
FROMCHAT_PREBUILT_PROGUARD: "1"
jobs: jobs:
resolve-version: resolve-version:
@@ -48,10 +49,35 @@ jobs:
echo "version=$V" >> "$GITHUB_OUTPUT" echo "version=$V" >> "$GITHUB_OUTPUT"
echo "tag=v$V" >> "$GITHUB_OUTPUT" echo "tag=v$V" >> "$GITHUB_OUTPUT"
desktop-proguard:
needs: resolve-version
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: gradle/actions/setup-gradle@v4
with:
gradle-version: wrapper
- uses: ./.github/actions/set-version
with:
version: ${{ needs.resolve-version.outputs.version }}
- name: Compile and ProGuard release desktop jars
run: ./gradlew :app:desktop:exportReleaseProguardForCi --no-daemon --console=plain
- uses: actions/upload-artifact@v4
with:
name: desktop-proguard
path: app/desktop/build/ci/proguard/
if-no-files-found: error
retention-days: 7
windows-common: windows-common:
needs: resolve-version needs: resolve-version
runs-on: windows-latest runs-on: windows-latest
timeout-minutes: 45 timeout-minutes: 30
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-java@v4 - uses: actions/setup-java@v4
@@ -77,20 +103,10 @@ jobs:
key: cargo-windows-${{ runner.os }}-${{ hashFiles('app/desktop/windows-setup/Cargo.lock') }} key: cargo-windows-${{ runner.os }}-${{ hashFiles('app/desktop/windows-setup/Cargo.lock') }}
restore-keys: | restore-keys: |
cargo-windows-${{ runner.os }}- cargo-windows-${{ runner.os }}-
- name: Build arch-independent Windows tooling and compile JVM - name: Build Windows installer Rust tooling
shell: bash shell: bash
run: | run: ./gradlew :app:desktop:buildWindowsSetupRust --no-daemon --console=plain
export FROMCHAT_PACKAGING_JDK="$JAVA_HOME" - uses: actions/upload-artifact@v4
./gradlew \
:app:desktop:buildWindowsSetupRust \
:app:shared:compileKotlinJvm \
:utils:shared:compileKotlinJvm \
:app:desktop:compileKotlin \
:app:desktop:jar \
--no-daemon \
--console=plain
- name: Upload Windows Rust installer tools
uses: actions/upload-artifact@v4
with: with:
name: windows-rust-tools name: windows-rust-tools
path: app/desktop/windows-setup/target/release/*.exe path: app/desktop/windows-setup/target/release/*.exe
@@ -98,7 +114,7 @@ jobs:
retention-days: 7 retention-days: 7
windows-package: windows-package:
needs: [resolve-version, windows-common] needs: [resolve-version, desktop-proguard, windows-common]
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -126,6 +142,10 @@ jobs:
- 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: actions/download-artifact@v4
with:
name: desktop-proguard
path: app/desktop/build/prebuilt/main-release/proguard
- name: Restore Windows Rust installer tools - name: Restore Windows Rust installer tools
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
@@ -156,7 +176,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
macos: macos:
needs: resolve-version needs: [resolve-version, desktop-proguard]
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -164,7 +184,7 @@ jobs:
- arch: arm64 - arch: arm64
- arch: x64 - arch: x64
runs-on: macos-latest runs-on: macos-latest
timeout-minutes: 90 timeout-minutes: 60
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-java@v4 - uses: actions/setup-java@v4
@@ -184,6 +204,10 @@ jobs:
- 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: actions/download-artifact@v4
with:
name: desktop-proguard
path: app/desktop/build/prebuilt/main-release/proguard
- name: Cache DMG background tooling - name: Cache DMG background tooling
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
@@ -213,7 +237,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
linux: linux:
needs: resolve-version needs: [resolve-version, desktop-proguard]
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -225,7 +249,7 @@ jobs:
runner: ubuntu-24.04-arm runner: ubuntu-24.04-arm
appimage: appimagetool-aarch64.AppImage appimage: appimagetool-aarch64.AppImage
runs-on: ${{ matrix.runner }} runs-on: ${{ matrix.runner }}
timeout-minutes: 75 timeout-minutes: 45
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-java@v4 - uses: actions/setup-java@v4
@@ -238,6 +262,10 @@ jobs:
- 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: actions/download-artifact@v4
with:
name: desktop-proguard
path: app/desktop/build/prebuilt/main-release/proguard
- name: Install Linux packaging tools - name: Install Linux packaging tools
run: | run: |
sudo apt-get update sudo apt-get update
+52
View File
@@ -744,6 +744,46 @@ val macDmgReleaseOutput = desktopDistDir.map {
it.file("FromChat-$desktopVersionName-macOS-${desktopReleaseArchLabel()}.dmg") it.file("FromChat-$desktopVersionName-macOS-${desktopReleaseArchLabel()}.dmg")
} }
val releaseProguardOutputDir = layout.buildDirectory.dir("compose/tmp/main-release/proguard")
val ciPrebuiltProguardDir = layout.buildDirectory.dir("prebuilt/main-release/proguard")
val ciProguardExportDir = layout.buildDirectory.dir("ci/proguard")
fun useCiPrebuiltProguard(): Boolean =
System.getenv("FROMCHAT_PREBUILT_PROGUARD") == "1"
tasks.register<Copy>("exportReleaseProguardForCi") {
group = "compose desktop"
description = "Compile, ProGuard, and export release jars for CI (run once on Linux x64)."
dependsOn("proguardReleaseJars")
from(releaseProguardOutputDir)
into(ciProguardExportDir)
}
tasks.register<Copy>("stageCiPrebuiltProguard") {
group = "compose desktop"
description = "Stage downloaded CI ProGuard jars into compose release tmp before packaging."
onlyIf { useCiPrebuiltProguard() }
from(ciPrebuiltProguardDir)
into(releaseProguardOutputDir)
doFirst {
check(ciPrebuiltProguardDir.get().asFile.isDirectory) {
"Missing prebuilt ProGuard at ${ciPrebuiltProguardDir.get().asFile}"
}
}
}
tasks.register("packageReleaseFromPrebuiltProguard") {
group = "compose desktop"
description = "Package release desktop for the current OS using CI prebuilt ProGuard jars."
dependsOn("stageCiPrebuiltProguard")
when {
runningOnMacOs -> dependsOn("packageReleaseMac")
runningOnLinux -> dependsOn("packageReleaseLinux")
runningOnWindows -> dependsOn("packageReleaseWindows")
else -> doFirst { error("Unsupported OS for packageReleaseFromPrebuiltProguard") }
}
}
tasks.register("packageReleaseMac") { tasks.register("packageReleaseMac") {
group = "compose desktop" group = "compose desktop"
description = "Build release macOS DMG and copy to distributions/release." description = "Build release macOS DMG and copy to distributions/release."
@@ -1109,6 +1149,18 @@ tasks.register<Exec>("packageBetaWindows") {
} }
afterEvaluate { afterEvaluate {
tasks.matching { it.name == "proguardReleaseJars" }.configureEach {
onlyIf {
!useCiPrebuiltProguard() || !ciPrebuiltProguardDir.get().asFile.isDirectory
}
}
tasks.matching {
it.name == "createReleaseDistributable" || it.name == "createReleaseDistributableImpl"
}.configureEach {
if (useCiPrebuiltProguard()) {
dependsOn("stageCiPrebuiltProguard")
}
}
tasks.matching { it.name == "createRuntimeImage" || it.name == "createReleaseRuntimeImage" }.configureEach { tasks.matching { it.name == "createRuntimeImage" || it.name == "createReleaseRuntimeImage" }.configureEach {
if (!isWindowsArm64Host()) return@configureEach if (!isWindowsArm64Host()) return@configureEach
inputs.property("packagingJdkHome", resolvePackagingJdkHome()) inputs.property("packagingJdkHome", resolvePackagingJdkHome())