@@ -109,8 +109,14 @@ jobs:
109109 ## Meet Scribe ${{ steps.get_version.outputs.version }}
110110
111111 ### Downloads
112- - **Windows**: `meet-scribe_${{ steps.get_version.outputs.version }}_x64_en-US.msi`
113- - **Linux**: `meet-scribe_${{ steps.get_version.outputs.version }}_amd64.deb` or `meet-scribe_${{ steps.get_version.outputs.version }}_amd64.AppImage`
112+
113+ **Windows:**
114+ - x64: `meet-scribe_${{ steps.get_version.outputs.version }}_x64_en-US.msi`
115+ - ARM64: `meet-scribe_${{ steps.get_version.outputs.version }}_arm64_en-US.msi`
116+
117+ **Linux:**
118+ - x64: `meet-scribe_${{ steps.get_version.outputs.version }}_amd64.deb` or `meet-scribe_${{ steps.get_version.outputs.version }}_amd64.AppImage`
119+ - ARM64: `meet-scribe_${{ steps.get_version.outputs.version }}_arm64.deb` or `meet-scribe_${{ steps.get_version.outputs.version }}_arm64.AppImage`
114120
115121 ### Installation
116122
@@ -239,6 +245,85 @@ jobs:
239245 asset_name : meet-scribe_${{ needs.prepare-release.outputs.version }}_x64_en-US.msi
240246 asset_content_type : application/x-msi
241247
248+ # Build for Windows ARM64
249+ build-windows-arm64 :
250+ needs : prepare-release
251+ runs-on : windows-latest
252+ steps :
253+ - name : Checkout code
254+ uses : actions/checkout@v4
255+ with :
256+ ref : ${{ needs.prepare-release.outputs.tag || github.ref }}
257+
258+ - name : Setup Node.js
259+ uses : actions/setup-node@v4
260+ with :
261+ node-version : ' 20'
262+ cache : ' npm'
263+ cache-dependency-path : apps/desktop/package-lock.json
264+
265+ - name : Setup Rust
266+ uses : dtolnay/rust-toolchain@stable
267+ with :
268+ targets : aarch64-pc-windows-msvc
269+
270+ - name : Rust cache
271+ uses : Swatinem/rust-cache@v2
272+ with :
273+ workspaces : apps/desktop/src-tauri
274+ key : arm64
275+
276+ - name : Install dependencies
277+ run : |
278+ cd apps/desktop
279+ npm ci
280+
281+ - name : Build frontend
282+ run : |
283+ cd apps/desktop
284+ npm run build
285+
286+ - name : Build Tauri app (ARM64)
287+ env :
288+ TAURI_SIGNING_PRIVATE_KEY : ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
289+ TAURI_SIGNING_PRIVATE_KEY_PASSWORD : ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
290+ run : |
291+ cd apps/desktop
292+ npm run tauri build -- --target aarch64-pc-windows-msvc
293+
294+ - name : List build artifacts
295+ run : |
296+ Get-ChildItem -Path apps/desktop/src-tauri/target/aarch64-pc-windows-msvc/release/bundle -Recurse | Select-Object FullName
297+
298+ - name : Upload Windows ARM64 MSI
299+ uses : actions/upload-release-asset@v1
300+ env :
301+ GITHUB_TOKEN : ${{ secrets.PAT_TOKEN }}
302+ with :
303+ upload_url : ${{ needs.prepare-release.outputs.upload_url }}
304+ asset_path : apps/desktop/src-tauri/target/aarch64-pc-windows-msvc/release/bundle/msi/meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64_en-US.msi
305+ asset_name : meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64_en-US.msi
306+ asset_content_type : application/x-msi
307+
308+ - name : Upload Windows ARM64 MSI Signature
309+ continue-on-error : true
310+ uses : actions/upload-release-asset@v1
311+ env :
312+ GITHUB_TOKEN : ${{ secrets.PAT_TOKEN }}
313+ with :
314+ upload_url : ${{ needs.prepare-release.outputs.upload_url }}
315+ asset_path : apps/desktop/src-tauri/target/aarch64-pc-windows-msvc/release/bundle/msi/meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64_en-US.msi.sig
316+ asset_name : meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64_en-US.msi.sig
317+ asset_content_type : text/plain
318+
319+ - name : Save Windows ARM64 signature as artifact
320+ continue-on-error : true
321+ uses : actions/upload-artifact@v4
322+ with :
323+ name : windows-arm64-sig
324+ path : apps/desktop/src-tauri/target/aarch64-pc-windows-msvc/release/bundle/msi/meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64_en-US.msi.sig
325+ retention-days : 1
326+
242327 # Build for Linux
243328 build-linux :
244329 needs : prepare-release
@@ -363,9 +448,137 @@ jobs:
363448 path : apps/desktop/src-tauri/target/release/bundle/appimage/meet-scribe_${{ needs.prepare-release.outputs.version }}_amd64.AppImage.sig
364449 retention-days : 1
365450
451+ # Build for Linux ARM64
452+ build-linux-arm64 :
453+ needs : prepare-release
454+ runs-on : ubuntu-latest
455+ steps :
456+ - name : Checkout code
457+ uses : actions/checkout@v4
458+ with :
459+ ref : ${{ needs.prepare-release.outputs.tag || github.ref }}
460+
461+ - name : Setup Node.js
462+ uses : actions/setup-node@v4
463+ with :
464+ node-version : ' 20'
465+ cache : ' npm'
466+ cache-dependency-path : apps/desktop/package-lock.json
467+
468+ - name : Setup Rust
469+ uses : dtolnay/rust-toolchain@stable
470+ with :
471+ targets : aarch64-unknown-linux-gnu
472+
473+ - name : Rust cache
474+ uses : Swatinem/rust-cache@v2
475+ with :
476+ workspaces : apps/desktop/src-tauri
477+ key : arm64
478+
479+ - name : Install cross-compilation tools
480+ run : |
481+ sudo apt-get update
482+ sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
483+
484+ - name : Install ARM64 system dependencies
485+ run : |
486+ sudo dpkg --add-architecture arm64
487+ sudo bash -c 'cat > /etc/apt/sources.list.d/arm64.list <<EOF
488+ deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ $(lsb_release -sc) main restricted universe multiverse
489+ deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ $(lsb_release -sc)-updates main restricted universe multiverse
490+ deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ $(lsb_release -sc)-security main restricted universe multiverse
491+ EOF'
492+ sudo apt-get update || true
493+ sudo apt-get install -y \
494+ libwebkit2gtk-4.1-dev:arm64 \
495+ libssl-dev:arm64 \
496+ libgtk-3-dev:arm64 \
497+ libayatana-appindicator3-dev:arm64 \
498+ librsvg2-dev:arm64 \
499+ libpulse-dev:arm64 || echo "Some ARM64 packages may not be available"
500+
501+ - name : Configure cross-compilation
502+ run : |
503+ mkdir -p ~/.cargo
504+ cat >> ~/.cargo/config.toml <<EOF
505+ [target.aarch64-unknown-linux-gnu]
506+ linker = "aarch64-linux-gnu-gcc"
507+ EOF
508+
509+ - name : Install dependencies
510+ run : |
511+ cd apps/desktop
512+ npm ci
513+
514+ - name : Build frontend
515+ run : |
516+ cd apps/desktop
517+ npm run build
518+
519+ - name : Build Tauri app (ARM64)
520+ env :
521+ TAURI_SIGNING_PRIVATE_KEY : ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
522+ TAURI_SIGNING_PRIVATE_KEY_PASSWORD : ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
523+ PKG_CONFIG_SYSROOT_DIR : /usr/aarch64-linux-gnu
524+ PKG_CONFIG_PATH : /usr/lib/aarch64-linux-gnu/pkgconfig
525+ run : |
526+ cd apps/desktop
527+ npm run tauri build -- --target aarch64-unknown-linux-gnu
528+
529+ - name : List build artifacts
530+ run : |
531+ echo "Checking ARM64 bundle directory..."
532+ if [ -d "apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle" ]; then
533+ cd apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle
534+ ls -lR
535+ else
536+ echo "ARM64 bundle directory not found!"
537+ ls -lR apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/ || echo "Target directory doesn't exist"
538+ fi
539+
540+ - name : Upload Linux ARM64 DEB
541+ uses : actions/upload-release-asset@v1
542+ env :
543+ GITHUB_TOKEN : ${{ secrets.PAT_TOKEN }}
544+ with :
545+ upload_url : ${{ needs.prepare-release.outputs.upload_url }}
546+ asset_path : apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/deb/meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64.deb
547+ asset_name : meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64.deb
548+ asset_content_type : application/vnd.debian.binary-package
549+
550+ - name : Upload Linux ARM64 AppImage
551+ uses : actions/upload-release-asset@v1
552+ env :
553+ GITHUB_TOKEN : ${{ secrets.PAT_TOKEN }}
554+ with :
555+ upload_url : ${{ needs.prepare-release.outputs.upload_url }}
556+ asset_path : apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/appimage/meet-scribe_${{ needs.prepare-release.outputs.version }}_aarch64.AppImage
557+ asset_name : meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64.AppImage
558+ asset_content_type : application/octet-stream
559+
560+ - name : Upload Linux ARM64 AppImage Signature
561+ continue-on-error : true
562+ uses : actions/upload-release-asset@v1
563+ env :
564+ GITHUB_TOKEN : ${{ secrets.PAT_TOKEN }}
565+ with :
566+ upload_url : ${{ needs.prepare-release.outputs.upload_url }}
567+ asset_path : apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/appimage/meet-scribe_${{ needs.prepare-release.outputs.version }}_aarch64.AppImage.sig
568+ asset_name : meet-scribe_${{ needs.prepare-release.outputs.version }}_arm64.AppImage.sig
569+ asset_content_type : text/plain
570+
571+ - name : Save Linux ARM64 signature as artifact
572+ continue-on-error : true
573+ uses : actions/upload-artifact@v4
574+ with :
575+ name : linux-arm64-sig
576+ path : apps/desktop/src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/appimage/meet-scribe_${{ needs.prepare-release.outputs.version }}_aarch64.AppImage.sig
577+ retention-days : 1
578+
366579 # Generate and upload updater manifest
367580 create-updater-manifest :
368- needs : [prepare-release, build-windows, build-linux]
581+ needs : [prepare-release, build-windows, build-windows-arm64, build- linux, build-linux-arm64 ]
369582 runs-on : ubuntu-latest
370583 permissions :
371584 contents : write
@@ -384,6 +597,20 @@ jobs:
384597 name : linux-sig
385598 path : ./sigs
386599
600+ - name : Download Windows ARM64 signature
601+ uses : actions/download-artifact@v4
602+ continue-on-error : true
603+ with :
604+ name : windows-arm64-sig
605+ path : ./sigs
606+
607+ - name : Download Linux ARM64 signature
608+ uses : actions/download-artifact@v4
609+ continue-on-error : true
610+ with :
611+ name : linux-arm64-sig
612+ path : ./sigs
613+
387614 - name : Generate and upload latest.json
388615 env :
389616 GITHUB_TOKEN : ${{ secrets.PAT_TOKEN }}
@@ -395,19 +622,35 @@ jobs:
395622 # Read signature files if they exist
396623 WINDOWS_SIG=""
397624 LINUX_SIG=""
625+ WINDOWS_ARM64_SIG=""
626+ LINUX_ARM64_SIG=""
398627
399628 if [ -f "./sigs/meet-scribe_${VERSION}_x64_en-US.msi.sig" ]; then
400629 WINDOWS_SIG=$(cat "./sigs/meet-scribe_${VERSION}_x64_en-US.msi.sig")
401- echo "Found Windows signature"
630+ echo "Found Windows x64 signature"
402631 else
403- echo "No Windows signature found (signing may not be configured)"
632+ echo "No Windows x64 signature found (signing may not be configured)"
404633 fi
405634
406635 if [ -f "./sigs/meet-scribe_${VERSION}_amd64.AppImage.sig" ]; then
407636 LINUX_SIG=$(cat "./sigs/meet-scribe_${VERSION}_amd64.AppImage.sig")
408- echo "Found Linux signature"
637+ echo "Found Linux x64 signature"
638+ else
639+ echo "No Linux x64 signature found (signing may not be configured)"
640+ fi
641+
642+ if [ -f "./sigs/meet-scribe_${VERSION}_arm64_en-US.msi.sig" ]; then
643+ WINDOWS_ARM64_SIG=$(cat "./sigs/meet-scribe_${VERSION}_arm64_en-US.msi.sig")
644+ echo "Found Windows ARM64 signature"
409645 else
410- echo "No Linux signature found (signing may not be configured)"
646+ echo "No Windows ARM64 signature found (signing may not be configured)"
647+ fi
648+
649+ if [ -f "./sigs/meet-scribe_${VERSION}_arm64.AppImage.sig" ]; then
650+ LINUX_ARM64_SIG=$(cat "./sigs/meet-scribe_${VERSION}_arm64.AppImage.sig")
651+ echo "Found Linux ARM64 signature"
652+ else
653+ echo "No Linux ARM64 signature found (signing may not be configured)"
411654 fi
412655
413656 # Create the updater manifest JSON
@@ -424,6 +667,14 @@ jobs:
424667 "linux-x86_64": {
425668 "signature": "$LINUX_SIG",
426669 "url": "https://github.com/$REPO/releases/download/$TAG/meet-scribe_${VERSION}_amd64.AppImage"
670+ },
671+ "windows-aarch64": {
672+ "signature": "$WINDOWS_ARM64_SIG",
673+ "url": "https://github.com/$REPO/releases/download/$TAG/meet-scribe_${VERSION}_arm64_en-US.msi"
674+ },
675+ "linux-aarch64": {
676+ "signature": "$LINUX_ARM64_SIG",
677+ "url": "https://github.com/$REPO/releases/download/$TAG/meet-scribe_${VERSION}_arm64.AppImage"
427678 }
428679 }
429680 }
0 commit comments