Skip to content

Commit 6eb18b0

Browse files
committed
fix: re-sign macOS DMG with adhoc deep codesign to fix Gatekeeper damaged error
1 parent abaa3c4 commit 6eb18b0

1 file changed

Lines changed: 70 additions & 0 deletions

File tree

.github/workflows/release.yml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,73 @@ jobs:
122122
releaseDraft: true
123123
prerelease: false
124124
args: --target ${{ matrix.target }}
125+
126+
# macOS: 对构建产物重新进行 adhoc 深度签名,修复 Gatekeeper "文件已损坏" 问题
127+
# 并将重签名后的 DMG 重新上传到 GitHub Release,替换 tauri-action 上传的旧版本
128+
- name: Re-sign and repackage DMG (macOS only)
129+
if: matrix.platform == 'macos-latest'
130+
env:
131+
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
132+
shell: bash
133+
run: |
134+
set -euo pipefail
135+
136+
# 找到 tauri 输出目录中的 DMG 文件
137+
DMG_PATH=$(find src-tauri/target/${{ matrix.target }}/release/bundle/dmg -name "*.dmg" | head -1)
138+
if [ -z "$DMG_PATH" ]; then
139+
echo "No DMG found, skipping re-sign step"
140+
exit 0
141+
fi
142+
143+
echo "Found DMG: $DMG_PATH"
144+
DMG_NAME=$(basename "$DMG_PATH")
145+
WORK_DIR=$(mktemp -d)
146+
147+
# 挂载原始 DMG
148+
MOUNT_POINT="$WORK_DIR/mount"
149+
mkdir -p "$MOUNT_POINT"
150+
hdiutil attach "$DMG_PATH" -mountpoint "$MOUNT_POINT" -nobrowse -quiet
151+
152+
# 找到 .app
153+
APP_PATH=$(find "$MOUNT_POINT" -name "*.app" -maxdepth 1 | head -1)
154+
echo "Found app: $APP_PATH"
155+
156+
# 复制 .app 到临时目录
157+
APP_COPY="$WORK_DIR/$(basename "$APP_PATH")"
158+
cp -R "$APP_PATH" "$APP_COPY"
159+
160+
# 卸载原始 DMG
161+
hdiutil detach "$MOUNT_POINT" -quiet
162+
163+
# 移除隔离属性和旧签名,进行深度 adhoc 重签名
164+
xattr -cr "$APP_COPY"
165+
codesign --deep --force --sign - "$APP_COPY"
166+
167+
echo "Re-signed app:"
168+
codesign -dv "$APP_COPY" 2>&1 || true
169+
170+
# 重新打包为 DMG
171+
NEW_DMG="$WORK_DIR/$DMG_NAME"
172+
hdiutil create -volname "WeCut" -srcfolder "$APP_COPY" \
173+
-ov -format UDZO "$NEW_DMG"
174+
175+
echo "New DMG created: $NEW_DMG"
176+
177+
# 删除 Release 中旧的同名 DMG 资产,再上传新的
178+
TAG="${{ github.ref_name }}"
179+
ASSET_ID=$(gh release view "$TAG" --repo ${{ github.repository }} --json assets \
180+
--jq ".assets[] | select(.name == \"$DMG_NAME\") | .id" 2>/dev/null || echo "")
181+
182+
if [ -n "$ASSET_ID" ]; then
183+
echo "Deleting old release asset: $ASSET_ID"
184+
gh release delete-asset "$TAG" "$DMG_NAME" --repo ${{ github.repository }} --yes 2>/dev/null || true
185+
fi
186+
187+
echo "Uploading re-signed DMG to release: $TAG"
188+
gh release upload "$TAG" "$NEW_DMG#$DMG_NAME" \
189+
--repo ${{ github.repository }} --clobber
190+
191+
echo "Done: $DMG_NAME uploaded successfully"
192+
193+
# 清理
194+
rm -rf "$WORK_DIR"

0 commit comments

Comments
 (0)