diff --git a/.github/workflows/build-and-upload.yml b/.github/workflows/build-and-upload.yml index 8ddc9daa..17e8d705 100644 --- a/.github/workflows/build-and-upload.yml +++ b/.github/workflows/build-and-upload.yml @@ -72,6 +72,78 @@ jobs: - name: Build macOS binaries (Electron) run: npm run build:mac --workspace @neuralnomads/codenomad-electron-app + - name: Repackage Electron macOS zips (ditto) + shell: bash + run: | + set -euo pipefail + + # Prefer the workflow-provided version; fall back to package.json. + VERSION_TO_USE="${VERSION:-}" + if [ -z "$VERSION_TO_USE" ]; then + VERSION_TO_USE=$(node -p "require('./packages/electron-app/package.json').version") + fi + + release_root="packages/electron-app/release" + shopt -s nullglob globstar + + apps=("$release_root"/**/CodeNomad.app) + if [ "${#apps[@]}" -eq 0 ]; then + echo "No CodeNomad.app found under $release_root" >&2 + exit 1 + fi + + for app in "${apps[@]}"; do + bundle_dir=$(basename "$(dirname "$app")") + arch="x64" + if [[ "$bundle_dir" == *"arm64"* ]]; then + arch="arm64" + fi + + out_zip="$release_root/CodeNomad-${VERSION_TO_USE}-mac-${arch}.zip" + rm -f "$out_zip" + echo "ditto -ck: $app -> $out_zip" + ditto -ck --sequesterRsrc --keepParent "$app" "$out_zip" + done + + - name: Validate Electron macOS codesign (unzipped) + shell: bash + run: | + set -euo pipefail + shopt -s nullglob + + tmp_dir=$(mktemp -d) + trap 'rm -rf "$tmp_dir"' EXIT + + zips=(packages/electron-app/release/CodeNomad-*-mac-*.zip) + if [ "${#zips[@]}" -eq 0 ]; then + echo "No Electron macOS zip artifacts found to validate" >&2 + exit 1 + fi + + for zip in "${zips[@]}"; do + echo "Validating codesign for: $zip" + extract_dir="$tmp_dir/$(basename "$zip" .zip)" + mkdir -p "$extract_dir" + + # Use ditto for extraction as well to preserve bundle metadata. + ditto -x -k "$zip" "$extract_dir" + + app_path="" + for candidate in "$extract_dir"/*.app "$extract_dir"/*/*.app; do + if [ -d "$candidate" ]; then + app_path="$candidate" + break + fi + done + + if [ -z "$app_path" ]; then + echo "No .app found after extracting $zip" >&2 + exit 1 + fi + + codesign --verify --deep --strict --verbose=2 "$app_path" + done + - name: Upload release assets if: ${{ inputs.upload && inputs.tag != '' }} run: |