feat(FN-5608): add linux arm64 dual-arch support to desktop release workflo

Adds Linux ARM64 as a target architecture to the desktop release pipeline, including dual-arch release and test-release workflows, electron-builder configuration updates, and corresponding tests and documentation.

Fusion-Task-Id: FN-5608

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5608
This commit is contained in:
gsxdsm
2026-05-27 03:36:50 -07:00
parent 9504c31a85
commit 925a466043
6 changed files with 61 additions and 12 deletions

View File

@@ -357,9 +357,10 @@ Desktop packaging is configured in `electron-builder.yml`.
- Electron-updater feed files are also published per platform: `latest.yml` (Windows), `latest-mac.yml` (macOS), and `latest-linux.yml` (Linux). `setupAutoUpdater` / `triggerUpdateCheck` resolve these feeds from the GitHub Release channel.
- Windows: x64 + arm64 outputs (NSIS + portable), matching `.exe.sha256` sidecars, and `.blockmap` files.
- macOS: `Fusion-<version>-mac-arm64.dmg`, `Fusion-<version>-mac-x64.dmg`, matching `.zip` variants, `.sha256` sidecars, and `.blockmap` files.
- Linux: `Fusion-<version>-linux-x64.AppImage` with `.sha256`, plus best-effort `.deb` and `.tar.gz` outputs (and sidecars) when available on the runner image.
- Linux: `Fusion-<version>-linux-x64.AppImage` and `Fusion-<version>-linux-arm64.AppImage` with matching `.sha256` sidecars, plus best-effort `.deb` and `.tar.gz` outputs per arch (`Fusion-<version>-linux-x64.{deb,tar.gz}` / `Fusion-<version>-linux-arm64.{deb,tar.gz}`) and sidecars when available on the runner image.
- Tag-less release rehearsal workflow (`.github/workflows/test-release.yml`) mirrors that artifact collection path without publishing a real GitHub Release.
- Linux desktop artifacts now include detached GPG signature sidecars: `*.AppImage.asc`, `*.deb.asc`, and `*.tar.gz.asc` when Linux signing secrets are configured in CI.
- Linux ARM64 artifacts are cross-built from the `ubuntu-latest` x64 runner by passing `electron-builder --linux --x64 --arm64`; running/validating arm64 installers still requires an arm64 Linux device or emulator.
- Linux desktop artifacts can include detached GPG signature sidecars (`*.AppImage.asc`, `*.deb.asc`, `*.tar.gz.asc`) when Linux signing secrets are configured in CI; full Linux desktop code-signing rollout remains tracked in FN-5605.
- Linux `.deb` and `.tar.gz` outputs are best-effort and may be absent on some runner images without failing the release.
### Linux signing

View File

@@ -92,5 +92,14 @@ linux:
category: Development
target:
- target: AppImage
arch:
- x64
- arm64
- target: deb
arch:
- x64
- arm64
- target: tar.gz
arch:
- x64
- arm64

View File

@@ -84,6 +84,27 @@ describe("electron-builder desktop config", () => {
(match) => match[1]?.trim(),
);
expect(linuxTargetEntries[0]).toBe("AppImage");
const linuxArchMatches = Array.from(
linuxSection.matchAll(
/-\s*target:\s*(AppImage|deb|tar\.gz)\s*arch:\s*([\s\S]*?)(?=\n\s*-\s*target:|\n\w|$)/g,
),
);
expect(linuxArchMatches).toHaveLength(3);
const linuxArchByTarget = new Map(
linuxArchMatches.map((match) => {
const target = match[1];
const archBlock = match[2] ?? "";
const archValues = Array.from(archBlock.matchAll(/-\s*(x64|arm64)/g), (entry) => entry[1]).sort();
return [target, archValues] as const;
}),
);
expect(linuxArchByTarget.get("AppImage")).toEqual(["arm64", "x64"]);
expect(linuxArchByTarget.get("deb")).toEqual(["arm64", "x64"]);
expect(linuxArchByTarget.get("tar.gz")).toEqual(["arm64", "x64"]);
});
});

View File

@@ -32,6 +32,10 @@ describe("desktop release workflow wiring", () => {
expect(workflow).toContain("build-desktop-linux:");
expect(workflow).toContain("runs-on: ubuntu-latest");
expect(workflow).toMatch(/pnpm --filter @fusion\/desktop dist:linux|electron-builder --linux/);
expect(workflow).toContain("--x64");
expect(workflow).toContain("--arm64");
expect(workflow).toContain("Fusion-*-linux-arm64.AppImage");
expect(workflow).toContain("Fusion-*-linux-x64.AppImage");
expect(workflow).toContain("name: fusion-desktop-linux");
expect(workflow).toContain("packages/desktop/dist-electron/latest-linux.yml");
}