From 436b8501770e73bf69f252a73648f96ee3736857 Mon Sep 17 00:00:00 2001 From: kalifun Date: Fri, 20 Mar 2026 10:23:30 +0800 Subject: [PATCH 1/5] feat: add macOS x86_64 (Intel) build support - Add matrix build for both aarch64 (macos-14) and x86_64 (macos-13) - Update dmg filename to use TARGET_ARCH variable - Add darwin-x86_64 platform to latest.json - Upload artifacts per-architecture and merge in release job --- .github/workflows/release.yml | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 856e0a9a6..636d8c624 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,8 @@ permissions: jobs: build_macos: - runs-on: macos-latest + name: macOS bundles (${{ matrix.arch }}) + runs-on: ${{ matrix.runner }} environment: release env: CODESIGN_IDENTITY: ${{ vars.CODESIGN_IDENTITY }} @@ -17,6 +18,15 @@ jobs: APPLE_TEAM_ID: ${{ vars.APPLE_TEAM_ID }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} TAURI_SIGNING_PRIVATE_KEY_B64: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_B64 }} + TARGET_ARCH: ${{ matrix.arch }} + strategy: + fail-fast: false + matrix: + include: + - runner: macos-latest + arch: aarch64 + - runner: macos-15 + arch: x86_64 steps: - name: Checkout uses: actions/checkout@v4 @@ -140,7 +150,7 @@ jobs: hdiutil create -volname "Codex Monitor" \ -srcfolder release-artifacts/dmg-root \ -ov -format UDZO \ - release-artifacts/CodexMonitor_${VERSION}_aarch64.dmg + release-artifacts/CodexMonitor_${VERSION}_${TARGET_ARCH}.dmg COPYFILE_DISABLE=1 tar -czf \ "src-tauri/target/release/bundle/macos/Codex Monitor.app.tar.gz" \ @@ -159,10 +169,10 @@ jobs: - name: Upload macOS artifacts uses: actions/upload-artifact@v4 with: - name: macos-artifacts + name: macos-artifacts-${{ matrix.arch }} path: | release-artifacts/CodexMonitor.zip - release-artifacts/CodexMonitor_*_aarch64.dmg + release-artifacts/CodexMonitor_*_${{ matrix.arch }}.dmg release-artifacts/CodexMonitor.app.tar.gz release-artifacts/CodexMonitor.app.tar.gz.sig @@ -323,8 +333,9 @@ jobs: - name: Download macOS artifacts uses: actions/download-artifact@v4 with: - name: macos-artifacts + pattern: macos-artifacts-* path: release-artifacts + merge-multiple: true - name: Download Linux bundles uses: actions/download-artifact@v4 @@ -450,7 +461,11 @@ jobs: "darwin-aarch64": { "url": release_url("CodexMonitor.app.tar.gz"), "signature": "${SIGNATURE}", - } + }, + "darwin-x86_64": { + "url": release_url("CodexMonitor.app.tar.gz"), + "signature": "${SIGNATURE}", + }, } appimages = list(artifacts_dir.rglob("*.AppImage.tar.gz")) @@ -565,6 +580,7 @@ jobs: shopt -s nullglob globstar appimages=(release-artifacts/**/*.AppImage*) + dmgs=(release-artifacts/**/*.dmg) mapfile -t rpms < <(find release-artifacts -type f -name '*.rpm' | sort) mapfile -t windows_exes < <(find release-artifacts -type f -name '*.exe*' | sort) mapfile -t windows_msis < <(find release-artifacts -type f -name '*.msi*' | sort) @@ -589,7 +605,7 @@ jobs: --notes-file release-artifacts/release-notes.md \ --target "$GITHUB_SHA" \ release-artifacts/CodexMonitor.zip \ - release-artifacts/CodexMonitor_*_aarch64.dmg \ + "${dmgs[@]}" \ release-artifacts/CodexMonitor.app.tar.gz \ release-artifacts/CodexMonitor.app.tar.gz.sig \ "${appimages[@]}" \ From e8aabdf86b34c9d1a2d1fa81979d41f147ef94d6 Mon Sep 17 00:00:00 2001 From: kalifun Date: Fri, 20 Mar 2026 12:10:47 +0800 Subject: [PATCH 2/5] test: add test-build workflow for verifying macOS builds --- .github/workflows/test-build.yml | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/test-build.yml diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml new file mode 100644 index 000000000..6d9bc4c48 --- /dev/null +++ b/.github/workflows/test-build.yml @@ -0,0 +1,49 @@ +name: Test Build + +on: + workflow_dispatch: + push: + branches: + - feat/add-macos-x86_64-build + paths: + - '.github/workflows/test-build.yml' + - 'src-tauri/**' + - 'src/**' + +jobs: + test_macos_build: + name: Test macOS build (${{ matrix.arch }}) + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - runner: macos-latest + arch: aarch64 + - runner: macos-15 + arch: x86_64 + steps: + - uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install CMake + run: brew install cmake + + - name: Install dependencies + run: npm ci + + - name: Tauri build (no bundle, no sign) + run: npm run tauri -- build --debug --no-bundle + + - name: Build daemon binaries + run: | + cd src-tauri + cargo build --release --bin codex_monitor_daemon --bin codex_monitor_daemonctl From e800104687e31a576f25b7d88885ce6269e91bda Mon Sep 17 00:00:00 2001 From: kalifun Date: Fri, 20 Mar 2026 13:07:17 +0800 Subject: [PATCH 3/5] chore: remove test-build workflow (no longer needed) --- .github/workflows/test-build.yml | 49 -------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 .github/workflows/test-build.yml diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml deleted file mode 100644 index 6d9bc4c48..000000000 --- a/.github/workflows/test-build.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Test Build - -on: - workflow_dispatch: - push: - branches: - - feat/add-macos-x86_64-build - paths: - - '.github/workflows/test-build.yml' - - 'src-tauri/**' - - 'src/**' - -jobs: - test_macos_build: - name: Test macOS build (${{ matrix.arch }}) - runs-on: ${{ matrix.runner }} - strategy: - fail-fast: false - matrix: - include: - - runner: macos-latest - arch: aarch64 - - runner: macos-15 - arch: x86_64 - steps: - - uses: actions/checkout@v4 - - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: npm - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable - - - name: Install CMake - run: brew install cmake - - - name: Install dependencies - run: npm ci - - - name: Tauri build (no bundle, no sign) - run: npm run tauri -- build --debug --no-bundle - - - name: Build daemon binaries - run: | - cd src-tauri - cargo build --release --bin codex_monitor_daemon --bin codex_monitor_daemonctl From 61509a9893e79fc48b3d6c72258fa9036014705b Mon Sep 17 00:00:00 2001 From: kalifun Date: Fri, 20 Mar 2026 13:47:46 +0800 Subject: [PATCH 4/5] fix: address reviewer feedback - Use macos-15-intel for x86_64 builds (true Intel runner) - Add architecture suffix to macOS updater bundles (tar.gz/sig) - Dynamically resolve per-architecture bundles in latest.json - Upload all tar.gz variants to release --- .github/workflows/release.yml | 45 ++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 636d8c624..625e1686b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: include: - runner: macos-latest arch: aarch64 - - runner: macos-15 + - runner: macos-15-intel arch: x86_64 steps: - name: Checkout @@ -162,9 +162,9 @@ jobs: "src-tauri/target/release/bundle/macos/Codex Monitor.app.tar.gz" cp "src-tauri/target/release/bundle/macos/Codex Monitor.app.tar.gz" \ - release-artifacts/CodexMonitor.app.tar.gz + release-artifacts/CodexMonitor_${TARGET_ARCH}.app.tar.gz cp "src-tauri/target/release/bundle/macos/Codex Monitor.app.tar.gz.sig" \ - release-artifacts/CodexMonitor.app.tar.gz.sig + release-artifacts/CodexMonitor_${TARGET_ARCH}.app.tar.gz.sig - name: Upload macOS artifacts uses: actions/upload-artifact@v4 @@ -173,8 +173,8 @@ jobs: path: | release-artifacts/CodexMonitor.zip release-artifacts/CodexMonitor_*_${{ matrix.arch }}.dmg - release-artifacts/CodexMonitor.app.tar.gz - release-artifacts/CodexMonitor.app.tar.gz.sig + release-artifacts/CodexMonitor_${{ matrix.arch }}.app.tar.gz + release-artifacts/CodexMonitor_${{ matrix.arch }}.app.tar.gz.sig build_linux: name: linux bundles (${{ matrix.arch }}) @@ -457,16 +457,27 @@ jobs: def release_url(filename): return f"https://github.com/Dimillian/CodexMonitor/releases/download/v${VERSION}/{quote(filename)}" - platforms = { - "darwin-aarch64": { - "url": release_url("CodexMonitor.app.tar.gz"), - "signature": "${SIGNATURE}", - }, - "darwin-x86_64": { - "url": release_url("CodexMonitor.app.tar.gz"), - "signature": "${SIGNATURE}", - }, - } + platforms = {} + + # Find macOS updater bundles for each architecture + macos_tarballs = list(artifacts_dir.glob("CodexMonitor_*_*.app.tar.gz")) + for tarball in macos_tarballs: + if "aarch64" in tarball.name: + sig_path = tarball.with_suffix(tarball.suffix + ".sig") + if not sig_path.exists(): + raise SystemExit(f"Missing signature for {tarball.name}") + platforms["darwin-aarch64"] = { + "url": release_url(tarball.name), + "signature": sig_path.read_text().strip(), + } + elif "x86_64" in tarball.name: + sig_path = tarball.with_suffix(tarball.suffix + ".sig") + if not sig_path.exists(): + raise SystemExit(f"Missing signature for {tarball.name}") + platforms["darwin-x86_64"] = { + "url": release_url(tarball.name), + "signature": sig_path.read_text().strip(), + } appimages = list(artifacts_dir.rglob("*.AppImage.tar.gz")) if not appimages: @@ -581,6 +592,7 @@ jobs: shopt -s nullglob globstar appimages=(release-artifacts/**/*.AppImage*) dmgs=(release-artifacts/**/*.dmg) + tarballs=(release-artifacts/**/*.app.tar.gz) mapfile -t rpms < <(find release-artifacts -type f -name '*.rpm' | sort) mapfile -t windows_exes < <(find release-artifacts -type f -name '*.exe*' | sort) mapfile -t windows_msis < <(find release-artifacts -type f -name '*.msi*' | sort) @@ -606,8 +618,7 @@ jobs: --target "$GITHUB_SHA" \ release-artifacts/CodexMonitor.zip \ "${dmgs[@]}" \ - release-artifacts/CodexMonitor.app.tar.gz \ - release-artifacts/CodexMonitor.app.tar.gz.sig \ + "${tarballs[@]}" \ "${appimages[@]}" \ "${rpms[@]}" \ "${windows_exes[@]}" \ From 42beb1416b545ff7878ca0f6f2b3bf83c19cea88 Mon Sep 17 00:00:00 2001 From: kalifun Date: Fri, 20 Mar 2026 14:08:02 +0800 Subject: [PATCH 5/5] fix: address remaining reviewer feedback - Fix glob pattern to match all macOS tarballs (remove extra underscore) - Add architecture suffix to zip files to avoid merge conflicts - Remove obsolete SIGNATURE variable - Add zips array for release upload --- .github/workflows/release.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 625e1686b..df3740c89 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -145,7 +145,7 @@ jobs: ditto -c -k --keepParent \ "src-tauri/target/release/bundle/macos/Codex Monitor.app" \ - release-artifacts/CodexMonitor.zip + release-artifacts/CodexMonitor_${TARGET_ARCH}.zip hdiutil create -volname "Codex Monitor" \ -srcfolder release-artifacts/dmg-root \ @@ -171,7 +171,7 @@ jobs: with: name: macos-artifacts-${{ matrix.arch }} path: | - release-artifacts/CodexMonitor.zip + release-artifacts/CodexMonitor_${{ matrix.arch }}.zip release-artifacts/CodexMonitor_*_${{ matrix.arch }}.dmg release-artifacts/CodexMonitor_${{ matrix.arch }}.app.tar.gz release-artifacts/CodexMonitor_${{ matrix.arch }}.app.tar.gz.sig @@ -397,7 +397,6 @@ jobs: PY ) - SIGNATURE=$(cat release-artifacts/CodexMonitor.app.tar.gz.sig) LAST_TAG=$(git tag --sort=-version:refname \ | grep -v "^v${VERSION}$" \ | head -n 1 || true) @@ -460,7 +459,7 @@ jobs: platforms = {} # Find macOS updater bundles for each architecture - macos_tarballs = list(artifacts_dir.glob("CodexMonitor_*_*.app.tar.gz")) + macos_tarballs = list(artifacts_dir.glob("CodexMonitor_*.app.tar.gz")) for tarball in macos_tarballs: if "aarch64" in tarball.name: sig_path = tarball.with_suffix(tarball.suffix + ".sig") @@ -593,6 +592,7 @@ jobs: appimages=(release-artifacts/**/*.AppImage*) dmgs=(release-artifacts/**/*.dmg) tarballs=(release-artifacts/**/*.app.tar.gz) + zips=(release-artifacts/CodexMonitor_*.zip) mapfile -t rpms < <(find release-artifacts -type f -name '*.rpm' | sort) mapfile -t windows_exes < <(find release-artifacts -type f -name '*.exe*' | sort) mapfile -t windows_msis < <(find release-artifacts -type f -name '*.msi*' | sort) @@ -616,7 +616,7 @@ jobs: --title "v${VERSION}" \ --notes-file release-artifacts/release-notes.md \ --target "$GITHUB_SHA" \ - release-artifacts/CodexMonitor.zip \ + "${zips[@]}" \ "${dmgs[@]}" \ "${tarballs[@]}" \ "${appimages[@]}" \