From f890e36cbf32bffedd94e076c0031c045d8b50ad Mon Sep 17 00:00:00 2001 From: hizumiaoba <56146205+hizumiaoba@users.noreply.github.com> Date: Sat, 18 Jan 2025 17:07:27 +0900 Subject: [PATCH] Improve CI Actions workflow and build script (#160) * Streamline release workflow and unify artifact upload. Introduce a new `create-release` job to generate release drafts. Consolidate OS-specific artifact uploads into a single `artifact-upload` job with a simplified matrix strategy. Removed redundant steps and improved maintainability of the workflow. * Add OS-specific installer configurations and resources * Add scan plugin * remove scan flag from old enterprise plugin * fix terms of service url * Disable ZipArchiveTest temporarily --- .github/workflows/gradle.yml | 3 +- .github/workflows/release.yaml | 87 ++++++++---------- app/build.gradle.kts | 86 +++++++++++++---- app/src/main/resources/assets/icon.png | Bin 0 -> 2372 bytes .../mctimemachine/fs/ZipArchiveTest.java | 2 + settings.gradle.kts | 8 +- 6 files changed, 117 insertions(+), 69 deletions(-) create mode 100644 app/src/main/resources/assets/icon.png diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 5449263..066f1c5 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -42,9 +42,8 @@ jobs: with: arguments: | check - jpackage + jpackageImage -i - --scan # NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html). # If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version. diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d62e2e0..5b3f47f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -8,6 +8,14 @@ on: - 'v*' jobs: + create-release: + runs-on: ubuntu-latest + steps: + - name: Create new Release with gh release + run: gh release create --draft --generate-notes $TAG_REF --title "Release $TAG_REF" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG_REF: ${{ github.ref }} compile: strategy: @@ -31,15 +39,20 @@ jobs: with: arguments: | build - --scan --refresh-dependencies --no-build-cache --rerun-tasks - win-artifact-upload: + artifact-upload: needs: compile + strategy: + matrix: + os: + - windows-latest + - ubuntu-latest + - macos-latest - runs-on: windows-latest + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 - name: Set up JDK 17 @@ -47,60 +60,34 @@ jobs: with: java-version: '17' distribution: 'temurin' + - name: Set up Gradle + uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 + - name: Grant execution permission for wrapper file + run: chmod +x ./gradlew ./gradlew.bat +# Windows specific steps - name: Install Winget - uses: Cyberboss/install-wihget@v1 + if: ${{ matrix.os == 'windows-latest' }} + uses: Cyberboss/install-winget@v1 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: install 7z - run: winget install --exact --id 7zip.7zip --silent --disable-interactivity --accept-package-agreements --accept-source-agreements --source winget - - name: install WiX Toolset + - name: install WiX Toolset for windows + if: ${{ matrix.os == 'windows-latest' }} run: winget install --exact --id WiXToolset.WiXToolset --silent --disable-interactivity --accept-package-agreements --accept-source-agreements --source winget - - name: Set up Gradle - uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 +# Ubuntu specific steps + - name: Install fakeroot only for ubuntu + if: ${{ matrix.os == 'ubuntu-latest' }} + run: sudo apt-get install -y fakeroot +# MacOS specific steps +# Do nothing since we don't sign up to Apple developer program. +# And we cannot set app icon for macOS app. - name: Gradle build action uses: gradle/gradle-build-action@v2 with: arguments: | jpackage --stacktrace - - name: compress package - run: 7z.exe a -mmt=16 -mx=9 -mm=LZMA -tzip "app\build\jpackage\MinecraftTimeMachine-windows.zip" "app\build\jpackage\MinecraftTimeMachine\runtime\*" - - name: upload artifact to action summary - uses: actions/upload-artifact@v2 - with: - name: MinecraftTimeMachine-windows - path: | - app/build/jpackage/MinecraftTimeMachine-windows.zip - app/build/jpackage/MinecraftTimeMachine-*.exe - app/build/jpackage/MinecraftTimeMachine-*.msi - - osx-artifact-upload: - needs: compile - strategy: - matrix: - os: [ ubuntu-latest, macos-latest ] - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - name: Set up Gradle - uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 - - name: Grant execution permission for wrapper file - run: chmod +x ./gradlew - - name: Gradle build action - uses: gradle/gradle-build-action@v2 - with: - arguments: | - jpackageImage - --stacktrace - - name: compress package - run: zip -r "app/build/jpackage/MinecraftTimeMachine-${{ matrix.os }}.zip" "app/build/jpackage/MinecraftTimeMachine/*" - - name: upload artifact to action summary - uses: actions/upload-artifact@v2 - with: - name: MinecraftTimeMachine-${{ matrix.os }} - path: app/build/jpackage/MinecraftTimeMachine-${{ matrix.os }}.zip + - name: Upload artifact to release draft with gh release + run: gh release upload $TAG_REF build/libs/MinecraftTimeMachine-* + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG_REF: ${{ github.ref }} diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e16744b..2db05b8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -76,22 +76,81 @@ tasks.withType { jlink { imageZip.set(project.file("${buildDir}/distributions/app-${javafx.platform.classifier}.zip")) - options.set(mutableListOf("--strip-debug", "--compress", "2", "--no-header-files", "--no-man-pages")) + options.set( + mutableListOf( + "--strip-debug", + "--compress", + "2", + "--no-header-files", + "--no-man-pages" + ) + ) launcher { name = "MinecraftTimeMachine" } jpackage { appVersion = version.toString() - if(System.getProperty("os.name").lowercase(Locale.getDefault()).contains("windows")) { - imageOptions.addAll(listOf("--icon", "${projectDir}/src/main/resources/assets/icon.ico")) - installerOptions.addAll(listOf( - "--win-per-user-install", - "--win-menu-group", "MinecraftTimeMachine", - "--win-menu", - "--win-upgrade-uuid", "61c4988a-2efe-406c-980c-15ae268d7627", - "--vendor", "Secret Society Braid (@hizumiaoba)", - "--win-shortcut", - "--win-shortcut-prompt")) + if (System.getProperty("os.name").lowercase(Locale.getDefault()).contains("windows")) { + imageOptions.addAll( + listOf( + "--icon", + "${projectDir}/src/main/resources/assets/icon.ico" + ) + ) + installerType = "msi" + installerOptions.addAll( + listOf( + "--win-per-user-install", + "--win-menu-group", + "MinecraftTimeMachine", + "--win-menu", + "--win-upgrade-uuid", + "61c4988a-2efe-406c-980c-15ae268d7627", + "--vendor", + "Secret Society Braid (@hizumiaoba)", + "--win-shortcut", + "--win-shortcut-prompt" + ) + ) + } + if (System.getProperty("os.name").lowercase(Locale.getDefault()).contains("mac")) { + installerType = "pkg" + installerOptions.addAll( + listOf( + "--vendor", + "Secret Society Braid (@hizumiaoba)", + "--mac-package-identifier", + "io.github.hizumiaoba.mctimemachine", + "--mac-package-name", + "MCTM", + ) + ) + } + if (System.getProperty("os.name").lowercase(Locale.getDefault()).contains("linux")) { + imageOptions.addAll( + listOf( + "--icon", + "${projectDir}/src/main/resources/assets/icon.png" + ) + ) + installerType = "deb" + installerOptions.addAll( + listOf( + "--vendor", + "Secret Society Braid (@hizumiaoba)", + "--linux-package-name", + "mctimemachine", + "--linux-menu-group", + "MinecraftTimeMachine", + "--linux-shortcut", + "--linux-shortcut-directory", + "/usr/share/applications", + "--linux-shortcut-name", + "MinecraftTimeMachine", + "--linux-shortcut-icon", + "${projectDir}/src/main/resources/assets/icon.png" + ) + ) } } } @@ -103,8 +162,3 @@ tasks.jlinkZip { kotlin { jvmToolchain(17) } - -extensions.findByName("buildScan")?.withGroovyBuilder { - setProperty("termsOfServiceUrl", "https://gradle.com/terms-of-service") - setProperty("termsOfServiceAgree", "yes") -} diff --git a/app/src/main/resources/assets/icon.png b/app/src/main/resources/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d31cc0cf81ef6fd2c322a6f8f35e0251550fcc7 GIT binary patch literal 2372 zcmV-K3A^@*P)rLE=n{bcvd?A002^gMtpxuDLy24Ry#~KBxOf1b6!1oZ9{QUH*QWf zRE0>7eost3G*dh%RD?-3B^gpuQgu@~jb%n{XFqIgY+*z$VMH!)Q8+9@CVX;6MsYn~ zlTcVtGDk5XQaUGnWI}38G?Z#eM=>Fsd{JMNQgN$bor6`AiByh!PGK}V0001CL@r7+ zB6wCiTS6^!Q8-jPC|p1*PBtYrB^XvcDREFYNHQU2NHJeREKoQlXGtlxj*+IwwLdA6Y&sOn5+SO*DR4JyCx}WkxVYF(GhKI9ER_Kr9?b zF(6ZeM`%ehbW%8oVM1R-E=x5dR)$DQbw55U9xx#lEgljsJ0njxCT~wRV?{4{R60_D zMv`hthF?OGX-IolJd9*TXiGF76ADdwLNQA#NOC=dUO|CeKX+0&Ek!0M8W3YgFf2nR zJSiI}J|j?mL|czec2qe}eM4G|Opj(ps(MshLoFN;3OOelI3^hu4hJtsDLr5_GA$e} zN+n@SJYJJfXkAxIc0WUFIai2EgJ45zN;5D?Dr!wNGcg_|IUqAC8!kpDZf$HkUou&X zOdT*6VV6@~kWXWoRgq^%c2+x6PS1mLm7FIwo zUQ|wHNHIHHGDU7WG)5>YKO|MJbyGQNRY*W*He5_YdSq9zepifWPZT8(IWH(sK{i1_KwCyOa$#0%q+1CS z2Sz(IbzMzpPd;>2KSOCcLPA1SNI*hnIBruxR#sMrWJ`WtNNj0nUYu4)0000(bW%=J z0T1#Xd%JrQ61#hYgCp^Kdx9gugMlUU!;$YLd%^I-yTiM?gB|hlfq{d=!@_Ifx$k@T_db33 z?wmPylx-hwy>HI!<)e>>1_wTP|G`;qU$pFGxlLgywX9t*8)WY0#FQ)lUQ2db92QT& zBlkkKy>~o|=0F#Qq<2?MqbFd&-C|ky%8)HI2fIOf_Z^3=VS^MN| z$Qo?T+|5I};!oKf(Q)JFu>{;2K2kTQ=xFwFu+ptayp|lVw>avK z_Fd{_bv621Vp)fj+7J%9hLvSz#ik6p<`61}FO#G=V4Y&wk|>~eZEmtOTFZ>edYliC3V|-^q$W zzD*IIHPoDhmiqoCk4E3*D6u3YXi$E8gVIku8%6<=m+K|sIekkg^h81Kq!&8x01z_7gx^a1nm%YWrzjKNADaDN)I}6J}h|`o_ERxuDiL7x z0q>-UMw4xPnHZ?tUXUBgOLEH)kR4Qg1OZ2Oc6KnGUwwl*Ah6WD24$Na6kab_QoB47r1V)n1bt6rC`{B-*7#D~kqD8p9@(xE81sEdcyJ0y1?seAAp%qd`qbP|!Oh zQ!yY~7&jpUWQqcWb2vcBjhx;eo!XYmNKFy>$e77*0idK*0a6BpWHGH$SV3Hf2uL`P zAimxMq1q*pN=y&|XQo<%hgxSlpoD;L)tbF!3Sb3V9TgeO<&2DQAv8n~loam3usxB! zZr!3pdBsTD4Arz?499VRi(^$Vm=CFM2?FNlLn-7$p?5|^`dyM!C?d#{$pH{3aUKs? ztzump*CjUExdaPxQ^$~jF!|^be+*`}P~uD#DsyP8002Nv;He_+s940|R2m}kjiV84 z6^yAA7SF{mR01hZ1LN;@?2M=Zr%7taB*bupdQZwAtRJFu( z;71fOmT!^}rU#~ha0OecFnO&Kj|;)Qe~OExCa%FaDmHSc2zGxogf4ZJFRe@01Dksg z>__STg@HFtw$-?}mTgE3QoydY(ju-4QV}LY+N4ebS1r7Cbj{sZ-_4(V zyqA$GNs%P766Wk>?{`xbPb?3-)5v-r@Ir1MSy9r(D*|Vjax0&~$*`M-;*O}1$Cn4* zZAz~Oz%FIjL}F>%DYa?U)Au?;yzrt`8B5~0$rVviadT#7lBMf$t962KabH>yILp(< q(v38q*zjiH|2WUQ@$SMIeE$#J_JytUxUs4L0000