4242 include :
4343 - os : ubuntu-latest
4444 arch : x64
45+ - os : ubuntu-24.04-arm
46+ arch : arm64
4547 - os : windows-latest
4648 arch : x64
49+ - os : windows-11-arm
50+ arch : arm64
4751 - os : macos-latest
4852 arch : x64
4953 - os : macos-latest
@@ -67,17 +71,17 @@ jobs:
6771 name : compiled-output
6872 path : out/
6973
70- # ── Flatpak setup (Linux only) ──
74+ # ── Flatpak setup (Linux x64 only) ──
7175 - name : Cache Flatpak SDKs
72- if : matrix .os == 'ubuntu-latest '
76+ if : runner .os == 'Linux' && matrix.arch == 'x64 '
7377 uses : actions/cache@v4
7478 with :
7579 path : ~/.local/share/flatpak
7680 key : flatpak-sdk-23.08-electron2-${{ runner.os }}
7781
7882 - name : Install Flatpak build tools
7983 id : flatpak
80- if : matrix .os == 'ubuntu-latest '
84+ if : runner .os == 'Linux' && matrix.arch == 'x64 '
8185 continue-on-error : true
8286 run : |
8387 sudo apt-get update
@@ -113,12 +117,12 @@ jobs:
113117 # ── Platform packaging ──
114118 - name : Package for Windows
115119 id : win_build
116- if : matrix .os == 'windows-latest '
120+ if : runner .os == 'Windows '
117121 continue-on-error : true
118122 run : npx electron-builder --win --${{ matrix.arch }} --publish never
119123
120124 - name : Package for Windows (unsigned fallback)
121- if : matrix .os == 'windows-latest ' && steps.win_build.outcome == 'failure'
125+ if : runner .os == 'Windows ' && steps.win_build.outcome == 'failure'
122126 env :
123127 WIN_CSC_LINK : ' '
124128 CSC_IDENTITY_AUTO_DISCOVERY : ' false'
@@ -147,9 +151,12 @@ jobs:
147151 npx electron-builder --mac --${{ matrix.arch }} --publish never
148152
149153 - name : Package for Linux
150- if : matrix .os == 'ubuntu-latest '
154+ if : runner .os == 'Linux '
151155 run : |
152- if [ "${{ steps.flatpak.outcome }}" == "success" ]; then
156+ if [ "${{ matrix.arch }}" == "arm64" ]; then
157+ # ARM64: deb + AppImage only (flatpak BaseApp not available for arm64)
158+ npx electron-builder --linux AppImage deb --${{ matrix.arch }} --publish never
159+ elif [ "${{ steps.flatpak.outcome }}" == "success" ]; then
153160 npx electron-builder --linux --${{ matrix.arch }} --publish never
154161 else
155162 echo "Flatpak not available, building without flatpak"
@@ -158,7 +165,7 @@ jobs:
158165
159166 # ── Windows code signing ──
160167 - name : Azure Trusted Signing (Windows Only)
161- if : matrix .os == 'windows-latest '
168+ if : runner .os == 'Windows '
162169 continue-on-error : true
163170 uses : azure/trusted-signing-action@v0.5.1
164171 with :
@@ -239,6 +246,9 @@ jobs:
239246 pattern : ' *-*'
240247 merge-multiple : false
241248
249+ - name : Install js-yaml for manifest merging
250+ run : npm install --no-save js-yaml
251+
242252 - name : Merge macOS latest-mac.yml (x64 + arm64)
243253 run : |
244254 # Each macOS arch build produces its own latest-mac.yml with only
@@ -248,7 +258,6 @@ jobs:
248258
249259 if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
250260 echo "Merging latest-mac.yml from both architectures"
251- npm install --no-save js-yaml
252261 node -e "
253262 const fs = require('fs');
254263 const yaml = require('js-yaml');
@@ -259,13 +268,58 @@ jobs:
259268 fs.writeFileSync('$X64_YML', out);
260269 console.log(out);
261270 "
262- # Remove duplicate so only one latest-mac.yml is uploaded
263271 rm -f "$ARM_YML"
264272 else
265273 echo "Skipping merge — need both $X64_YML and $ARM_YML"
266274 ls -la macos-latest-*/latest-mac.yml 2>/dev/null || true
267275 fi
268276
277+ - name : Merge Linux latest-linux.yml (x64 + arm64)
278+ run : |
279+ X64_YML="ubuntu-latest-x64/latest-linux.yml"
280+ ARM_YML="ubuntu-24.04-arm-arm64/latest-linux.yml"
281+
282+ if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
283+ echo "Merging latest-linux.yml from both architectures"
284+ node -e "
285+ const fs = require('fs');
286+ const yaml = require('js-yaml');
287+ const x64 = yaml.load(fs.readFileSync('$X64_YML', 'utf8'));
288+ const arm = yaml.load(fs.readFileSync('$ARM_YML', 'utf8'));
289+ x64.files = [...(x64.files || []), ...(arm.files || [])];
290+ const out = yaml.dump(x64, { lineWidth: -1 });
291+ fs.writeFileSync('$X64_YML', out);
292+ console.log(out);
293+ "
294+ rm -f "$ARM_YML"
295+ else
296+ echo "Skipping merge — need both $X64_YML and $ARM_YML"
297+ ls -la ubuntu-*-*/latest-linux.yml 2>/dev/null || true
298+ fi
299+
300+ - name : Merge Windows latest.yml (x64 + arm64)
301+ run : |
302+ X64_YML="windows-latest-x64/latest.yml"
303+ ARM_YML="windows-11-arm-arm64/latest.yml"
304+
305+ if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
306+ echo "Merging latest.yml from both architectures"
307+ node -e "
308+ const fs = require('fs');
309+ const yaml = require('js-yaml');
310+ const x64 = yaml.load(fs.readFileSync('$X64_YML', 'utf8'));
311+ const arm = yaml.load(fs.readFileSync('$ARM_YML', 'utf8'));
312+ x64.files = [...(x64.files || []), ...(arm.files || [])];
313+ const out = yaml.dump(x64, { lineWidth: -1 });
314+ fs.writeFileSync('$X64_YML', out);
315+ console.log(out);
316+ "
317+ rm -f "$ARM_YML"
318+ else
319+ echo "Skipping merge — need both $X64_YML and $ARM_YML"
320+ ls -la windows-*-*/latest.yml 2>/dev/null || true
321+ fi
322+
269323 - name : Create Release
270324 uses : softprops/action-gh-release@v2
271325 env :
@@ -277,18 +331,18 @@ jobs:
277331 draft : false
278332 prerelease : false
279333 files : |
280- windows-latest -*/*.exe
281- windows-latest -*/*.blockmap
282- windows-latest -*/latest*.yml
334+ windows-* -*/*.exe
335+ windows-* -*/*.blockmap
336+ windows-* -*/latest*.yml
283337 macos-latest-*/*.dmg
284338 macos-latest-*/*.zip
285339 macos-latest-*/*.pkg
286340 macos-latest-*/*.blockmap
287341 macos-latest-*/latest*.yml
288- ubuntu-latest -*/*.deb
289- ubuntu-latest -*/*.rpm
290- ubuntu-latest -*/*.AppImage
291- ubuntu-latest -*/*.snap
292- ubuntu-latest -*/*.flatpak
293- ubuntu-latest -*/*.tar.gz
294- ubuntu-latest -*/latest*.yml
342+ ubuntu-* -*/*.deb
343+ ubuntu-* -*/*.rpm
344+ ubuntu-* -*/*.AppImage
345+ ubuntu-* -*/*.snap
346+ ubuntu-* -*/*.flatpak
347+ ubuntu-* -*/*.tar.gz
348+ ubuntu-* -*/latest*.yml
0 commit comments