Compare commits

...

4 Commits

Author SHA1 Message Date
wangjia c3b64e8d0f feat(website): 下载页接入 macOS(.zip)按钮
Deploy Site / deploy-site (push) Successful in 1m22s
macOS 自 client-v1.0.59 起由 CI 产出 pangolin-macos-x64.zip 并部署到
/downloads,官网下载页 macOS 卡片从禁用占位改为真实下载直链;iOS 走
TestFlight 无直链、Linux 未接入,保持禁用。astro build 通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
2026-07-07 11:56:21 +08:00
wangjia 7794c73a51 chore(manifest): version.yaml 补 macOS 下载直链(macOS 已随 1.0.59 产出)
build-macos 自 client-v1.0.59 起产出 pangolin-macos-x64.zip 并部署到
pangolin1:/downloads,故 download_urls.macos 填稳定直链,自动更新/下载页可
引导 macOS 用户;ios 走 TestFlight 无直链保持留空。下次 client-v* 发版时
release-client.sh 会把此 manifest 推到线上生效。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
2026-07-07 11:42:14 +08:00
wangjia 6ce67176da fix(ci/macos): 构建后从 WORK 目录 embed 描述文件(xcodebuild 会清 PROF_DIR)
Deploy Client / build-android (push) Successful in 1m39s
Deploy Client / build-windows (push) Successful in 1m53s
Deploy Client / build-macos (push) Successful in 3m43s
Deploy Client / build-ios (push) Successful in 3m5s
Deploy Client / release-deploy (push) Successful in 2m7s
build-macos 失败:flutter build macos 期间 xcodebuild 修剪
~/Library/Developer/Xcode/UserData/Provisioning Profiles,把构建前装进去的
Developer ID 描述文件删掉,构建后 inside-out 重签时从该目录 cp 扑空
(cp: <uuid>.provisionprofile: No such file → exit 1)。改为从 mktemp 的 WORK
目录复制原始 .provisionprofile(xcodebuild 不碰),幂等可靠。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
2026-07-07 11:27:50 +08:00
wangjia 48e7efe92a ci(client): mac/iOS 证书 env 映射到全局通用短名密钥
Deploy Client / build-android (push) Successful in 1m52s
Deploy Client / build-windows (push) Successful in 1m57s
Deploy Client / build-macos (push) Failing after 1m53s
Deploy Client / build-ios (push) Successful in 6m3s
Deploy Client / release-deploy (push) Successful in 1m23s
Apple 证书/公证密钥是账号级、跨项目唯一 → 放全局(用户级)密钥用通用短名
(DEVELOPER_ID_P12/P12_PASSWORD/IOS_DIST_P12/IOS_DIST_PASSWORD/APPSTORE_*),
workflow env 里把脚本期望的长名映射过去,脚本不动。描述文件(与 bundle id 绑定)
仍走项目级。修此前 build-macos/ios 因密钥名对不上取不到证书。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
2026-07-07 08:14:10 +08:00
5 changed files with 25 additions and 13 deletions
+9 -4
View File
@@ -109,8 +109,11 @@ jobs:
- name: Compile (macOS System Extension app)
env:
MACOS_DEVELOPER_ID_CERT_P12_BASE64: ${{ secrets.MACOS_DEVELOPER_ID_CERT_P12_BASE64 }}
MACOS_DEVELOPER_ID_CERT_PASSWORD: ${{ secrets.MACOS_DEVELOPER_ID_CERT_PASSWORD }}
# 左=脚本期望的 env 名(勿改),右=实际密钥名。Apple 证书/公证密钥是
# 账号级、跨项目唯一 → 放【全局(用户级)密钥】用通用短名,pangolin/jiu 各自
# 在此映射到自己脚本的 env。Developer ID Application 证书=站外分发,一张签所有 app。
MACOS_DEVELOPER_ID_CERT_P12_BASE64: ${{ secrets.DEVELOPER_ID_P12 }}
MACOS_DEVELOPER_ID_CERT_PASSWORD: ${{ secrets.P12_PASSWORD }}
MACOS_APP_PROVISION_PROFILE_BASE64: ${{ secrets.MACOS_APP_PROVISION_PROFILE_BASE64 }}
MACOS_SYSEXT_PROVISION_PROFILE_BASE64: ${{ secrets.MACOS_SYSEXT_PROVISION_PROFILE_BASE64 }}
APPSTORE_API_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }}
@@ -137,8 +140,10 @@ jobs:
- name: Compile & upload to TestFlight (iOS)
env:
IOS_DIST_CERT_P12_BASE64: ${{ secrets.IOS_DIST_CERT_P12_BASE64 }}
IOS_DIST_CERT_PASSWORD: ${{ secrets.IOS_DIST_CERT_PASSWORD }}
# 证书=账号级 →【全局】通用短名(Apple Distribution 证书,签 iOS App Store/TestFlight);
# 描述文件=与 bundle id 绑定 →【项目级】pangolin 仓库密钥。
IOS_DIST_CERT_P12_BASE64: ${{ secrets.IOS_DIST_P12 }}
IOS_DIST_CERT_PASSWORD: ${{ secrets.IOS_DIST_PASSWORD }}
IOS_APP_PROVISIONING_PROFILE_BASE64: ${{ secrets.IOS_APP_PROVISIONING_PROFILE_BASE64 }}
IOS_PACKETTUNNEL_PROVISIONING_PROFILE_BASE64: ${{ secrets.IOS_PACKETTUNNEL_PROVISIONING_PROFILE_BASE64 }}
APPSTORE_API_KEY_ID: ${{ secrets.APPSTORE_API_KEY_ID }}
+4 -3
View File
@@ -8,8 +8,9 @@
# 不需要重启/重新部署控制面。
#
# download_urls 目前是固定「仅保留最新一份」的稳定 URL(deploy-client.sh 每次
# 用同名文件覆盖),不是按版本变化的路径,因此这里不需要随发版改写;
# macos / ios 产物尚未产出,先留空字符串。
# 用同名文件覆盖),不是按版本变化的路径,因此这里不需要随发版改写
# macos 自 client-v1.0.59 起由 build-macos 产出 pangolin-macos-x64.zip 并部署到
# /downloads,故填稳定直链;ios 走 TestFlight(无直接下载文件),保持留空。
version: "1.0.48"
build_number: 10048
force_update: false
@@ -17,6 +18,6 @@ release_notes: ""
download_urls:
android: "https://api.yanmeiai.com/downloads/pangolin-android.apk"
windows: "https://api.yanmeiai.com/downloads/pangolin-windows-x64-setup.exe"
macos: ""
macos: "https://api.yanmeiai.com/downloads/pangolin-macos-x64.zip"
ios: ""
changelog: []
+6 -2
View File
@@ -223,8 +223,12 @@ PLIST
echo "==> compile-macos: inside-out codesign (sysext -> frameworks -> app)"
xattr -cr "$APP"
cp "$SYSEXT_PROFILE" "${SE}/Contents/embedded.provisionprofile"
cp "$APP_PROFILE" "${APP}/Contents/embedded.provisionprofile"
# 从 WORK 临时目录复制(不是 PROF_DIR):flutter build macos 期间 xcodebuild 会
# 修剪 ~/Library/Developer/Xcode/UserData/Provisioning Profiles,把[3/7]构建前
# 装进去的 profile 清掉,构建后再从那目录 cp 会扑空(No such file → 本步失败)。
# WORK 是 mktemp 目录、xcodebuild 不碰,里面的原始 .provisionprofile 全程留存。
cp "${WORK}/sysext.provisionprofile" "${SE}/Contents/embedded.provisionprofile"
cp "${WORK}/app.provisionprofile" "${APP}/Contents/embedded.provisionprofile"
# sysext first — libbox is linked (not embedded) into the sysext binary
# itself (see CLAUDE.md), so signing the sysext bundle re-covers its statically
+3 -3
View File
@@ -6,12 +6,12 @@ import { SITE } from '../config/site';
interface Props { t: T }
const { t } = Astro.props;
// href 缺省 = 本轮未接入下载(iOS / macOS / Linux),按钮渲染为禁用态占位。
// Android + Windows 已由客户端 CI 产出真实产物并部署到 /downloads。
// href 缺省 = 本轮未接入下载(iOS 走 TestFlight / Linux),按钮渲染为禁用态占位。
// Android + Windows + macOS 已由客户端 CI 产出真实产物并部署到 /downloads。
const plats: { icon: string; name: string; ver: string; href?: string }[] = [
{ icon: 'smartphone', name: 'iOS', ver: 'iOS 16+' },
{ icon: 'smartphone', name: 'Android', ver: 'Android 9+', href: SITE.downloads.android },
{ icon: 'laptop', name: 'macOS', ver: 'macOS 12+' },
{ icon: 'laptop', name: 'macOS', ver: 'macOS 12+', href: SITE.downloads.macos },
{ icon: 'monitor', name: 'Windows', ver: 'Win 10/11', href: SITE.downloads.windows },
{ icon: 'terminal', name: 'Linux', ver: 'deb / rpm' },
];
+3 -1
View File
@@ -27,10 +27,12 @@ export const SITE = {
* 客户端安装包直链。控制面 pangolin-server 通过 Cloudflare Tunnel 对外暴露
* /downloads/<file>origin = 127.0.0.1:8080),文件由
* scripts/ci/deploy-client.sh 每次构建 scp 覆盖到 pangolin1:/var/lib/pangolin/downloads/
* 每平台固定文件名、只保留最新一份。iOS / macOS / Linux 本轮未接入下载按钮。
* 每平台固定文件名、只保留最新一份。macOS 自 client-v1.0.59 起接入;
* iOS 走 TestFlight(无直接下载文件)、Linux 本轮未接入下载按钮。
*/
downloads: {
android: 'https://api.yanmeiai.com/downloads/pangolin-android.apk',
windows: 'https://api.yanmeiai.com/downloads/pangolin-windows-x64-setup.exe',
macos: 'https://api.yanmeiai.com/downloads/pangolin-macos-x64.zip',
},
} as const;