From e102d1219849fe979b8545092ae03c21a3cf7c6f Mon Sep 17 00:00:00 2001 From: denis0001-dev Date: Sun, 13 Sep 2026 17:54:39 +0300 Subject: [PATCH] Run ProGuard once on Linux x64, reuse jars for all platform packaging. Co-authored-by: Cursor --- .github/workflows/release.yml | 66 +++++++++++++++++++++++++---------- app/desktop/build.gradle.kts | 52 +++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c08f379..e177a0d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,7 @@ concurrency: env: GRADLE_OPTS: -Dorg.gradle.jvmargs=-Xmx6g -Dkotlin.daemon.jvm.options=-Xmx6g + FROMCHAT_PREBUILT_PROGUARD: "1" jobs: resolve-version: @@ -48,10 +49,35 @@ jobs: echo "version=$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: needs: resolve-version runs-on: windows-latest - timeout-minutes: 45 + timeout-minutes: 30 steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -77,20 +103,10 @@ jobs: key: cargo-windows-${{ runner.os }}-${{ hashFiles('app/desktop/windows-setup/Cargo.lock') }} restore-keys: | cargo-windows-${{ runner.os }}- - - name: Build arch-independent Windows tooling and compile JVM + - name: Build Windows installer Rust tooling shell: bash - run: | - export FROMCHAT_PACKAGING_JDK="$JAVA_HOME" - ./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 + run: ./gradlew :app:desktop:buildWindowsSetupRust --no-daemon --console=plain + - uses: actions/upload-artifact@v4 with: name: windows-rust-tools path: app/desktop/windows-setup/target/release/*.exe @@ -98,7 +114,7 @@ jobs: retention-days: 7 windows-package: - needs: [resolve-version, windows-common] + needs: [resolve-version, desktop-proguard, windows-common] strategy: fail-fast: false matrix: @@ -126,6 +142,10 @@ jobs: - uses: ./.github/actions/set-version with: 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 uses: actions/download-artifact@v4 with: @@ -156,7 +176,7 @@ jobs: if-no-files-found: error macos: - needs: resolve-version + needs: [resolve-version, desktop-proguard] strategy: fail-fast: false matrix: @@ -164,7 +184,7 @@ jobs: - arch: arm64 - arch: x64 runs-on: macos-latest - timeout-minutes: 90 + timeout-minutes: 60 steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -184,6 +204,10 @@ jobs: - uses: ./.github/actions/set-version with: 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 uses: actions/cache@v4 with: @@ -213,7 +237,7 @@ jobs: if-no-files-found: error linux: - needs: resolve-version + needs: [resolve-version, desktop-proguard] strategy: fail-fast: false matrix: @@ -225,7 +249,7 @@ jobs: runner: ubuntu-24.04-arm appimage: appimagetool-aarch64.AppImage runs-on: ${{ matrix.runner }} - timeout-minutes: 75 + timeout-minutes: 45 steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -238,6 +262,10 @@ jobs: - uses: ./.github/actions/set-version with: 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 run: | sudo apt-get update diff --git a/app/desktop/build.gradle.kts b/app/desktop/build.gradle.kts index fcab42a..6ddd2d5 100644 --- a/app/desktop/build.gradle.kts +++ b/app/desktop/build.gradle.kts @@ -744,6 +744,46 @@ val macDmgReleaseOutput = desktopDistDir.map { 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("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("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") { group = "compose desktop" description = "Build release macOS DMG and copy to distributions/release." @@ -1109,6 +1149,18 @@ tasks.register("packageBetaWindows") { } 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 { if (!isWindowsArm64Host()) return@configureEach inputs.property("packagingJdkHome", resolvePackagingJdkHome())