From 6ccee9b336c4eabccf07a9bacbb456b4ca3f09a0 Mon Sep 17 00:00:00 2001 From: LukeGus Date: Fri, 16 Oct 2026 23:42:18 -0500 Subject: [PATCH] feat: build the Windows desktop app for ARM64 (#1615) --- .github/workflows/electron.yml | 37 +++++++++++++++++++++++++++---- CHANGELOG.md | 1 + electron-builder.json | 4 ++-- scripts/generate-release-body.cjs | 2 +- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/.github/workflows/electron.yml b/.github/workflows/electron.yml index 011c7c6bf..4b7544326 100644 --- a/.github/workflows/electron.yml +++ b/.github/workflows/electron.yml @@ -143,12 +143,12 @@ jobs: - name: Build Windows (All Architectures) env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: npm run build && npx electron-builder --win --x64 --ia32 --publish never + run: npm run build && npx electron-builder --win --x64 --ia32 --arm64 --publish never - # The updater only installs the x64 NSIS build; 32-bit installs get a link. - # The combined x64+ia32 installer is never uploaded. + # The updater only installs the x64 NSIS build; 32-bit and ARM installs get a link. + # The combined multi-arch installer is never uploaded. - name: Fix Windows update files - run: node scripts/fix-update-info.cjs --drop ia32 --drop termix_windows_nsis.exe release/latest.yml release/beta.yml + run: node scripts/fix-update-info.cjs --drop ia32 --drop arm64 --drop termix_windows_nsis.exe release/latest.yml release/beta.yml - name: Upload Windows x64 NSIS Installer uses: actions/upload-artifact@v7 @@ -166,6 +166,14 @@ jobs: path: release/termix_windows_ia32_nsis.exe retention-days: 30 + - name: Upload Windows arm64 NSIS Installer + uses: actions/upload-artifact@v7 + if: hashFiles('release/termix_windows_arm64_nsis.exe') != '' && inputs.artifact_destination != 'none' + with: + name: termix_windows_arm64_nsis + path: release/termix_windows_arm64_nsis.exe + retention-days: 30 + - name: Upload Windows x64 MSI Installer uses: actions/upload-artifact@v7 if: hashFiles('release/termix_windows_x64_msi.msi') != '' && inputs.artifact_destination != 'none' @@ -182,6 +190,14 @@ jobs: path: release/termix_windows_ia32_msi.msi retention-days: 30 + - name: Upload Windows arm64 MSI Installer + uses: actions/upload-artifact@v7 + if: hashFiles('release/termix_windows_arm64_msi.msi') != '' && inputs.artifact_destination != 'none' + with: + name: termix_windows_arm64_msi + path: release/termix_windows_arm64_msi.msi + retention-days: 30 + - name: Create Windows x64 Portable zip if: hashFiles('release/win-unpacked/*') != '' run: | @@ -192,6 +208,11 @@ jobs: run: | Compress-Archive -Path "release\win-ia32-unpacked\*" -DestinationPath "termix_windows_ia32_portable.zip" + - name: Create Windows arm64 Portable zip + if: hashFiles('release/win-arm64-unpacked/*') != '' + run: | + Compress-Archive -Path "release\win-arm64-unpacked\*" -DestinationPath "termix_windows_arm64_portable.zip" + - name: Upload Windows update files uses: actions/upload-artifact@v7 if: hashFiles('release/*.yml') != '' && inputs.artifact_destination != 'none' @@ -219,6 +240,14 @@ jobs: path: termix_windows_ia32_portable.zip retention-days: 30 + - name: Upload Windows arm64 Portable + uses: actions/upload-artifact@v7 + if: hashFiles('termix_windows_arm64_portable.zip') != '' && inputs.artifact_destination != 'none' + with: + name: termix_windows_arm64_portable + path: termix_windows_arm64_portable.zip + retention-days: 30 + build-linux: runs-on: blacksmith-8vcpu-ubuntu-2404 if: (inputs.build_type == 'all' || inputs.build_type == 'linux' || inputs.build_type == '') && inputs.artifact_destination != 'submit' diff --git a/CHANGELOG.md b/CHANGELOG.md index 629552b75..e5f44f506 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Hide sidebar after opening, in Customize Sidebar, closes the host list once you open a host - Sort the dashboard's Host Status card by name, IP address or status +- Windows on ARM builds of the desktop app (installer, MSI and portable) ### Changed diff --git a/electron-builder.json b/electron-builder.json index 66bb8128c..1c5bdb623 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -46,11 +46,11 @@ "target": [ { "target": "nsis", - "arch": ["x64", "ia32"] + "arch": ["x64", "ia32", "arm64"] }, { "target": "msi", - "arch": ["x64", "ia32"] + "arch": ["x64", "ia32", "arm64"] } ], "icon": "public/icon.ico", diff --git a/scripts/generate-release-body.cjs b/scripts/generate-release-body.cjs index 98d1fd43b..370680420 100644 --- a/scripts/generate-release-body.cjs +++ b/scripts/generate-release-body.cjs @@ -38,7 +38,7 @@ function buildTable(version, mobileVersion, mobileTag) { `| Architecture | Windows | Linux | Mac | Android | iOS |`, `|------------------|------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|---------------------------------------------|-----------------------------------|`, `| **x86-64 (64-bit)** | [EXE](${win("termix_windows_x64_nsis.exe")}) · [MSI](${win("termix_windows_x64_msi.msi")}) · [Portable](${win("termix_windows_x64_portable.zip")}) | [AppImage](${linux("termix_linux_x64_appimage.AppImage")}) · [DEB](${linux("termix_linux_x64_deb.deb")}) · [Portable](${linux("termix_linux_x64_portable.tar.gz")}) | [DMG](${mac("termix_macos_x64_dmg.dmg")}) | - | - |`, - `| **AArch64 (ARM64)** | - | [AppImage](${linux("termix_linux_arm64_appimage.AppImage")}) · [DEB](${linux("termix_linux_arm64_deb.deb")}) · [Portable](${linux("termix_linux_arm64_portable.tar.gz")}) | [DMG](${mac("termix_macos_arm64_dmg.dmg")}) | [APK (${mobileVersion})](${mobileBase}/termix_android.apk) | [IPA (${mobileVersion})](${mobileBase}/termix_ios.ipa) |`, + `| **AArch64 (ARM64)** | [EXE](${win("termix_windows_arm64_nsis.exe")}) · [MSI](${win("termix_windows_arm64_msi.msi")}) · [Portable](${win("termix_windows_arm64_portable.zip")}) | [AppImage](${linux("termix_linux_arm64_appimage.AppImage")}) · [DEB](${linux("termix_linux_arm64_deb.deb")}) · [Portable](${linux("termix_linux_arm64_portable.tar.gz")}) | [DMG](${mac("termix_macos_arm64_dmg.dmg")}) | [APK (${mobileVersion})](${mobileBase}/termix_android.apk) | [IPA (${mobileVersion})](${mobileBase}/termix_ios.ipa) |`, `| **ARMv7 (32-bit)** | - | [AppImage](${linux("termix_linux_armv7l_appimage.AppImage")}) · [DEB](${linux("termix_linux_armv7l_deb.deb")}) · [Portable](${linux("termix_linux_armv7l_portable.tar.gz")}) | - | - | - |`, `| **x86-32 (32-bit)** | [EXE](${win("termix_windows_ia32_nsis.exe")}) · [MSI](${win("termix_windows_ia32_msi.msi")}) · [Portable](${win("termix_windows_ia32_portable.zip")}) | - | - | - | - |`, `| **Universal** | [Chocolatey](https://docs.termix.site/install/apps/windows) | [Flatpak](https://docs.termix.site/install/apps/linux) | [DMG](${mac("termix_macos_universal_dmg.dmg")}) · [App Store](https://apps.apple.com/us/app/termix-ssh-companion/id6752672071) · [Homebrew](https://docs.termix.site/install/apps/macos) | - | - |`,