From 91f1554ac7b40e5d1e89b3fa7d1e3a2b348534e2 Mon Sep 17 00:00:00 2001 From: suzmii Date: Mon, 21 Sep 2026 11:58:22 +0800 Subject: [PATCH] =?UTF-8?q?macOS=20universal=20=E7=AE=A1=E7=BA=BF=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E5=8F=8C=E6=9E=B6=E6=9E=84=20Node=20=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E5=89=8D=E7=BD=AE=20-=20Jenkinsfile.ai-game-?= =?UTF-8?q?creator-shell-macos-build=20=E5=A2=9E=E5=8A=A0=20AGC=5FNODE=5FR?= =?UTF-8?q?UNTIME=5FDARWIN=5FX64=5FHOME=EF=BC=8C=E5=B9=B6=E5=9C=A8=20Toolc?= =?UTF-8?q?hain=20=E9=98=B6=E6=AE=B5=E7=BC=96=E8=AF=91=E5=89=8D=E6=A0=B8?= =?UTF-8?q?=E5=AF=B9=20x86=5F64=20=E5=8F=91=E8=A1=8C=E7=89=88=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E4=B8=94=E4=B8=8E=E6=9E=84=E5=BB=BA=20Node=20?= =?UTF-8?q?=E5=90=8C=E7=89=88=E6=9C=AC=20-=20Package=20=E9=98=B6=E6=AE=B5?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=20AGC=5FNODE=5FRUNTIME=5FDARWIN=5FX64=5FPATH?= =?UTF-8?q?=20/=20=5FLICENSE=5FPATH=EF=BC=8C=E4=BE=9B=20universal=20stagin?= =?UTF-8?q?g=20=E5=8F=96=E5=8F=A6=E4=B8=80=E6=9E=B6=E6=9E=84=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=20-=20=E5=BC=80=E5=8F=91=E8=BF=90=E7=BB=B4=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E8=AE=B0=E5=BD=95=E8=8A=82=E7=82=B9=E5=89=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=9A=E5=AE=98=E6=96=B9=20darwin-x64=20=E5=8F=91=E8=A1=8C?= =?UTF-8?q?=E7=89=88=E5=AE=89=E8=A3=85=E4=B8=8E=E6=A0=A1=E9=AA=8C=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E3=80=81=E5=90=8C=E7=89=88=E6=9C=AC=E8=A6=81=E6=B1=82?= =?UTF-8?q?=E3=80=81=E6=8C=89=E6=9E=B6=E6=9E=84=E5=B9=B6=E5=88=97=E7=9A=84?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=B8=83=E5=B1=80=E3=80=81Rust=20=E4=BE=A7?= =?UTF-8?q?=E6=8C=89=E8=BF=90=E8=A1=8C=E6=9E=B6=E6=9E=84=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E3=80=81=E7=BA=A6=20260=20MB=20=E8=A7=A3=E5=8C=85=E4=BD=93?= =?UTF-8?q?=E7=A7=AF=E4=BB=A3=E4=BB=B7=EF=BC=8C=E4=BB=A5=E5=8F=8A=E6=9C=AC?= =?UTF-8?q?=E6=9C=BA=E8=B7=A8=E6=9E=B6=E6=9E=84=E8=AF=8A=E6=96=AD=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E7=9A=84=E5=8F=96=E5=80=BC=E6=96=B9=E5=BC=8F=20-=20?= =?UTF-8?q?=E5=AE=9E=E6=96=BD=E8=AE=A1=E5=88=92=E4=B8=8E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=96=B9=E6=A1=88=E6=96=87=E6=A1=A3=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=20universal=20=E6=90=BA=E5=B8=A6=E4=B8=A4=E5=A5=97?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E8=BF=90=E8=A1=8C=E6=97=B6=E7=9A=84=E5=A5=91?= =?UTF-8?q?=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...œ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md | 2 +- ...¹æ¡ˆã€‘AI游æˆåˆ›ä½œæ™ºèƒ½ä½“App实施计划-2026-06-24.md | 2 +- ...å‘è¿ç»´ã€‘本地开å‘验è¯ä¸Žç”Ÿäº§è¿ç»´-2026-05-15.md | 17 +++++++++++ ...kinsfile.ai-game-creator-shell-macos-build | 28 +++++++++++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md b/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md index 8fa50c4f1..f07d93a6e 100644 --- a/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md +++ b/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AGC客户端更新检查与下载-2026-08-31.md @@ -102,7 +102,7 @@ - 对象布局:清å•å›ºå®šå†™æˆ `agc/-win|mac/latest.json`;安装包与签å写æˆåŒä¸€åˆ†åŒºçš„ `/` 与 `.sig`。 - macOS æ­£å¼äº¤ä»˜ä½¿ç”¨ universal 主程åºï¼šä¸¤ä¸ªå¹³å°é”®æŒ‡å‘åŒä¸€ä¸ª `.app.tar.gz` 与签åï¼Œä¸€ä»½äº§ç‰©åŒæ—¶æœåŠ¡ Apple Silicon 与 Intelã€‚å•æž¶æž„目标(`aarch64-apple-darwin` / `x86_64-apple-darwin`)åªç”¨äºŽæœ¬æœºè¯Šæ–­ï¼Œä¸ç™»è®°æ­£å¼åˆ†åŒºæ¸…å•â€”â€”å•æž¶æž„构建ä¸å¯è½®æµè¦†ç›–åŒä¸€ä¸ª `latest.json` å¹¶å®£ç§°åŒæž¶æž„å‡å¯æ›´æ–°ã€‚ -- universal 主程åºåŒæ—¶æºå¸¦åˆ†ç›®å½•çš„ arm64/x64 原生 Codex 组件:æ¯ä¸ªç»„ä»¶ä¿æŒä¸Šæ¸¸å•架构布局与独立 SHA-256 清å•,è¿è¡Œä¸­çš„主程åºåˆ‡ç‰‡åªé€‰æ‹©åŒæž¶æž„目录,ä¸å¾—æŠŠä¸¤å¥—åŽŸç”ŸåŒ…çš„å…ƒæ•°æ®æˆ–è¾…åŠ©ç¨‹åºæ··è£…。 +- universal 主程åºåŒæ—¶æºå¸¦åˆ†ç›®å½•çš„ arm64/x64 原生 Codex 组件:æ¯ä¸ªç»„ä»¶ä¿æŒä¸Šæ¸¸å•架构布局与独立 SHA-256 清å•,è¿è¡Œä¸­çš„主程åºåˆ‡ç‰‡åªé€‰æ‹©åŒæž¶æž„目录,ä¸å¾—æŠŠä¸¤å¥—åŽŸç”ŸåŒ…çš„å…ƒæ•°æ®æˆ–è¾…åŠ©ç¨‹åºæ··è£…。éšåŒ… Node è¿è¡Œæ—¶åŒæ ·æŒ‰æž¶æž„分目录(`game-runtime/node/darwin-arm64/`ã€`darwin-x64/`,å„带 `agc-node-runtime.v1` 清å•):两套都æ¥è‡ªèŠ‚ç‚¹ä¸ŠåŒç‰ˆæœ¬çš„官方å‘行版,构建时缺一份或版本ä¸ä¸€è‡´å³åœ¨å†™å‡ºèµ„æºå‰å¤±è´¥ï¼Œè¿è¡Œåˆ‡ç‰‡åªé‡‡ç”¨ä¸Žå½“剿ž¶æž„匹é…çš„é‚£ä¸€ä»½ï¼Œå•æž¶æž„æž„å»ºä¿æŒæ‰å¹³ç›®å½•ä¸å˜ã€‚ - æž„å»ºæœŸè¦æ±‚:打开 `bundle.createUpdaterArtifacts` ä»¥ç”Ÿæˆ `.sig`;构建环境æä¾›ç­¾åç§é’¥ä¸Žå¯†ç ï¼ˆç§é’¥å†…容ä¸å¾—入库);公钥写入客户端é…置。公钥在首个带更新能力的版本å‘布åŽä¸å¯æ›´æ¢ï¼Œæ›´æ¢ç­‰äºŽæ”¾å¼ƒè‡ªåŠ¨æ›´æ–°ï¼ˆåªèƒ½æ‰‹åЍé‡è£…)。 - 版本递增按渠é“åŠç³»ç»Ÿåˆ†åŒºç‹¬ç«‹è¿›è¡Œï¼šå‘布脚本读å–该分区远端 `latest.json` çš„ `version`,与本地版本å–较高者递增 patchï¼›ä¸åŒåˆ†åŒºçš„远端版本互ä¸å½±å“。 - 版本高水ä½ï¼šä»… dev çš„ Windows 分区在è¿ç§»çª—å£å†…å–「分区清å•版本ã€ä¸Žã€Œæ—§åè®®è¿ç§»æŒ‡é’ˆç‰ˆæœ¬ã€è¾ƒå¤§å€¼å†é€’增,é¿å…å·²å‘布旧客户端版本倒退。è¿ç§»çª—å£ç»“æŸï¼ˆæ—§æŒ‡é’ˆ 404)åŽåªè¯»åˆ†åŒºæ¸…å•ï¼›releaseã€è‡ªå®šä¹‰æ¸ é“与所有 Mac 分区å‡ä¸å‚与旧指针比较。 diff --git a/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AI游æˆåˆ›ä½œæ™ºèƒ½ä½“App实施计划-2026-06-24.md b/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AI游æˆåˆ›ä½œæ™ºèƒ½ä½“App实施计划-2026-06-24.md index 0657da9a2..bb044b152 100644 --- a/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AI游æˆåˆ›ä½œæ™ºèƒ½ä½“App实施计划-2026-06-24.md +++ b/docs/technical/ã€æŠ€æœ¯æ–¹æ¡ˆã€‘AI游æˆåˆ›ä½œæ™ºèƒ½ä½“App实施计划-2026-06-24.md @@ -71,7 +71,7 @@ ### çŽ¯å¢ƒä¸Žå·¥ä½œæµ -- 客户端交付é…套 Node/npmï¼›å‘布包从本机已安装且与目标平å°/æž¶æž„ä¸€è‡´çš„å·¥å…·é“¾åˆ¶ä½œå—æ ¡éªŒèµ„æºï¼Œä¿ç•™è®¸å¯å¹¶æ ¡éªŒå†…容摘è¦ã€‚安装æ€ä¸ä¾èµ–系统 PATH çš„ Nodeï¼›å¼€å‘æ€å¯ä½¿ç”¨å·²éªŒè¯çš„宿主è¿è¡Œæ—¶ã€‚ä¸å¾—从项目或相对 PATH 加载伪造è¿è¡Œæ—¶ã€‚ +- 客户端交付é…套 Node/npmï¼›å‘布包从本机已安装且与目标平å°/æž¶æž„ä¸€è‡´çš„å·¥å…·é“¾åˆ¶ä½œå—æ ¡éªŒèµ„æºï¼Œä¿ç•™è®¸å¯å¹¶æ ¡éªŒå†…容摘è¦ã€‚安装æ€ä¸ä¾èµ–系统 PATH çš„ Nodeï¼›å¼€å‘æ€å¯ä½¿ç”¨å·²éªŒè¯çš„宿主è¿è¡Œæ—¶ã€‚ä¸å¾—从项目或相对 PATH 加载伪造è¿è¡Œæ—¶ã€‚universal 包æºå¸¦**两套**æž¶æž„è¿è¡Œæ—¶å¹¶æŒ‰æž¶æž„并列存放(`game-runtime/node/-/`,å„自一份清å•),è¿è¡Œåˆ‡ç‰‡åªé‡‡ç”¨ä¸Žå½“剿ž¶æž„一致的那一份;两套必须æ¥è‡ªåŒä¸€ Node 版本,缺一份或版本ä¸ä¸€è‡´æ—¶æž„建在写出任何资æºä¹‹å‰å¤±è´¥ï¼Œä¸èƒ½ç”¨ã€Œå°‘å¸¦ä¸€ä»½ã€æˆ–退回系统 Node 充数。 - 新建 Web 游æˆåœ¨ç”Ÿå›¾å’Œå¤§é‡å®žçް剿‰§è¡Œå®¢æˆ·ç«¯çŽ¯å¢ƒé¢„æ£€ï¼Œæ£€æŸ¥ Node/npm çš„å®žé™…ç‰ˆæœ¬ã€æµè§ˆå™¨å¯åŠ¨å’Œ CDP å¯ç”¨æ€§ã€‚报告åªåŒ…å«å®‰å…¨çжæ€ã€ç‰ˆæœ¬ã€è€—时和错误ç ã€‚缺失或异常必须尽早返回阻塞,ä¸èƒ½æŒ‡ç¤ºæ¨¡åž‹æ”¹å®¿ä¸»çŽ¯å¢ƒã€å…¨ç›˜æœç´¢æˆ–自行下载一套è¿è¡Œæ—¶ã€‚编辑器工程ä¸å¼ºåˆ¶ Web 工具链。 - 预检ä¸å®‰è£…ä¾èµ–ã€ä¸ä¿®æ”¹é¡¹ç›® revisionã€ä¸è¯·æ±‚å¹³å°ç”Ÿæˆï¼›æž„å»ºä»æ‰§è¡Œé¡¹ç›®è‡ªå·±çš„ npm 脚本。Codex 隔离 HOME 与平å°å‡­æ®è¾¹ç•Œä¿æŒä¸å˜ï¼Œå®¢æˆ·ç«¯æŠŠå·²éªŒè¯çš„è¿è¡Œæ—¶åŠ å…¥æ‰§è¡Œ PATH,ä¸èƒ½æŠŠå®¿ä¸»å‡­æ®ç›®å½•交给模型。 - 第一轮先明确本次必需玩法ã€ç´ æå’ŒéªŒæ”¶é¡¹ã€‚åŒæ‰¹ç‹¬ç«‹è¯»å–å°½é‡åˆå¹¶ï¼Œå¿…需图片一次规划;已有且å¯ç”¨çš„资产å¤ç”¨ã€‚已有目标全部通过åŽç»™å‡ºäº¤ä»˜ç»“果,éžé˜»å¡žçš„æ–°ç‚¹å­åˆ—为åŽç»­å·¥ä½œï¼Œä¸åœ¨æ”¶å°¾æ—¶ä¸»åЍ开坿–°çš„生产链。 diff --git a/docs/ã€å¼€å‘è¿ç»´ã€‘本地开å‘验è¯ä¸Žç”Ÿäº§è¿ç»´-2026-05-15.md b/docs/ã€å¼€å‘è¿ç»´ã€‘本地开å‘验è¯ä¸Žç”Ÿäº§è¿ç»´-2026-05-15.md index 0596085fc..f72e3be9c 100644 --- a/docs/ã€å¼€å‘è¿ç»´ã€‘本地开å‘验è¯ä¸Žç”Ÿäº§è¿ç»´-2026-05-15.md +++ b/docs/ã€å¼€å‘è¿ç»´ã€‘本地开å‘验è¯ä¸Žç”Ÿäº§è¿ç»´-2026-05-15.md @@ -736,6 +736,23 @@ Job å为 `Genarrative-Agc-MacOS-Build`,SCM 直接读å–仓库内上述 Jenki å‘布凭æ®å…¨éƒ¨èµ° Jenkins 全局凭æ®ï¼Œå¹¶åœ¨ `withCredentials` 内注入当å‰è¿›ç¨‹ï¼š`AgcUpdaterSigningKey`(与 `AgcUpdaterSigningKeyPassword`)映射为 `TAURI_SIGNING_PRIVATE_KEY` / `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`,`AliyunAccessKeyId` / `AliyunaccessKeySecret` 映射为 `AGC_OSS_ACCESS_KEY_ID` / `AGC_OSS_ACCESS_KEY_SECRET`ï¼›ç§é’¥ä¸Žå‡­æ®ä¸å†™å…¥ workspaceã€æ—¥å¿—或归档产物。上传顺åºä¸ºæ›´æ–°åŒ…ã€ç­¾åã€é¦–装包,三者全部æˆåŠŸåŽæ‰è¦†ç›– `agc/-mac/latest.json` 指针;`AGC_RELEASE_DRY_RUN` 与 Windows 渠é“对称:默认关闭å³çœŸå‘å¸ƒï¼Œå‹¾é€‰åŽæ‰é€€åŒ–ä¸ºæ¼”ç»ƒï¼ˆåªæ‰“å°å°†ä¸Šä¼ çš„对象ã€ä¸å†™ä»»ä½• OSS 对象)。本 Job 是正å¼å‘布入å£ï¼Œè°ƒåº¦å™¨åœ¨å‘å·åŽä¸Ž Windows 一起触å‘它,并é¢å¤–ä¼  `SKIP_IF_SUPERSEDED=true`——Mac 节点是日常办公机,离线期间排队的旧构建在节点回æ¥åŽè‹¥å·²è¢«æºç åˆ†æ”¯æŽ¨è¿›ï¼Œç›´æŽ¥è·³è¿‡è€Œä¸å‘布过期版本。Mac èŠ‚ç‚¹éœ€è¦ `ossutil`(实测 1.7.19 原生 arm64 å¯ç”¨ï¼Œè£…在 `~/.local/bin`,已在 Job çš„ PATH 内),å¯ç”¨ `OSSUTIL_BIN` æŒ‡å®šå‘½ä»¤åæˆ–ç»å¯¹è·¯å¾„。首次å‘å¸ƒå»ºè®®æ˜¾å¼æŒ‡å®š `AGC_RELEASE_VERSION`,é¿å…按渠é“高水ä½é€’增时出现版本链回退。 +éšåŒ… Node è¿è¡Œæ—¶ä¹Ÿæ˜¯èŠ‚ç‚¹å‰ç½®ï¼Œä¸” universal 需è¦**两套架构å„一份**:客户端å‘布包内嵌 Node + npm ä½œä¸ºå—æ ¡éªŒèµ„æºï¼ˆ`agc-node-runtime.v1` æ¸…å• + 逿–‡ä»¶ SHA-256),构建时åªä»Ž**本机已安装ã€ä¸”与目标平å°/架构一致**çš„å·¥å…·é“¾å–æï¼Œç¼ºæ–‡ä»¶ã€ç‰ˆæœ¬ä¸ç¬¦æˆ–目标ä¸åŒ¹é…ç«‹å³å¤±è´¥ï¼Œç¦æ­¢å›žé€€ç³»ç»Ÿ Nodeã€ä¹Ÿä¸å…许从项目或相对 PATH 里借用è¿è¡Œæ—¶ã€‚å®¿ä¸»æž¶æž„é‚£ä¸€ä»½ç›´æŽ¥å–æž„建 Node(Mac 节点为 arm64ï¼Œå³ PATH 上的 `node`);å¦ä¸€æž¶æž„å¿…é¡»ç”±èŠ‚ç‚¹æ˜¾å¼æä¾›ï¼šé¢„è£…å®˜æ–¹ darwin-x64 å‘行版到 `~/Library/Jenkins/node/darwin-x64`(ä½ç½®å¯ç”¨ `AGC_NODE_RUNTIME_DARWIN_X64_HOME` 覆盖),ä¿ç•™ `LICENSE` 与 `lib/node_modules/npm`,Job 会把它们导出为 `AGC_NODE_RUNTIME_DARWIN_X64_PATH` / `AGC_NODE_RUNTIME_DARWIN_X64_LICENSE_PATH`。两套必须**åŒç‰ˆæœ¬**(首次接入时å‡ä¸º `v22.23.2`ï¼‰ï¼šç¼ºä¸€ä»½ã€æž¶æž„ä¸ç¬¦æˆ–版本ä¸ä¸€è‡´ï¼Œstaging 都会在写出任何è¿è¡Œæ—¶ç›®å½•之å‰å¤±è´¥å…³é—­ï¼Œä¸ä¼šç”ŸæˆåŠå¥—资æºçš„æ›´æ–°åŒ…ï¼›ç‰ˆæœ¬æ ¸å¯¹åŒæ—¶æ˜¯ Job 的编译å‰é¢„检。预装与核对命令(官方 dist,校验 `SHASUMS256.txt`,å†ç¡®è®¤æž¶æž„与版本): + +```sh +version=22.23.2 +curl -fsSLO "https://nodejs.org/dist/v${version}/node-v${version}-darwin-x64.tar.gz" +curl -fsSLO "https://nodejs.org/dist/v${version}/SHASUMS256.txt" +grep " node-v${version}-darwin-x64.tar.gz\$" SHASUMS256.txt | shasum -a 256 -c - +mkdir -p "$HOME/Library/Jenkins/node/darwin-x64" +tar -xzf "node-v${version}-darwin-x64.tar.gz" -C "$HOME/Library/Jenkins/node/darwin-x64" --strip-components=1 +/usr/bin/lipo -archs "$HOME/Library/Jenkins/node/darwin-x64/bin/node" # 期望 x86_64 +/usr/bin/arch -x86_64 "$HOME/Library/Jenkins/node/darwin-x64/bin/node" --version # 期望与构建 Node ç›¸åŒ +``` + +universal 包的éšåŒ… Node 按架构并列存放:`Contents/Resources/game-runtime/node/darwin-arm64/` 与 `darwin-x64/`,å„自带独立 `manifest.json`ï¼›Rust 侧按当å‰è¿è¡Œæž¶æž„选择对应目录(两个候选都è¦è¿‡æ¸…å•的平å°/架构校验,存在但æŸå则失败关闭,ç»ä¸é€€å›žç³»ç»Ÿ Node),架构校验脚本对两份都åšå®Œæ•´æ€§æ ¸å¯¹ä¸Ž `lipo -archs` æž¶æž„æ ¸å¯¹ï¼Œåªæ‰§è¡Œä¸Žæœ¬æ¬¡ smoke 架构一致的那一份,å¦ä¸€ä»½ç”±å¦ä¸€æ¬¡æž¶æž„çš„ smoke è¦†ç›–ã€‚å•æž¶æž„目标ä»å†™æ‰å¹³ç›®å½• `game-runtime/node/`,行为ä¸å˜ã€‚体积代价:官方 Node + npm 解包åŽçº¦ 130 MB/份(实测 arm64 `node` 112.9 MB + npm 16.3 MB,x64 `node` 115.4 MB + npm 15.6 MB),universal 两份åˆè®¡çº¦ 260 MB,DMG 压缩åŽå¢žé‡é¢„计在 50 MB é‡çº§â€”â€”è¿™æ˜¯åŒæž¶æž„必须付的代价,ä¸é€šè¿‡ã€ŒMac 跳过éšåŒ… Nodeã€æ¥çœã€‚ + +åŒä¸€æ¡è§„则适用于本机跨架构诊断构建:宿主架构以外的目标(例如 Apple Silicon 上打 `x86_64-apple-darwin`)必须用 `AGC_NODE_RUNTIME___PATH` æŒ‡å®šæ¥æºï¼Œç¼ºå¤±æ—¶æŠ¥ã€Œç¼ºå°‘ / çš„ Node è¿è¡Œæ—¶ã€å¹¶ç»™å‡ºè¯¥å˜é‡å,ä¸å†é€€åŒ–æˆå«ä¹‰æ¨¡ç³Šçš„「平å°/æž¶æž„ä¸ä¸€è‡´ã€ã€‚ + 产物边界:macOS 代ç ç­¾åä¸Žå…¬è¯æš‚缺,构建通过剥离 `APPLE_*` 凭æ®è®© Tauri 跳过 Apple ç­¾å,**ä¸å¾—使用 `--no-sign`**——该标志会连带跳过 updater çš„ minisign ç­¾å,产物缺少 `.sig` 会直接å¡åœ¨éªŒç­¾é—¨ç¦ï¼ˆé¦–次实跑å³å‘½ä¸­è¯¥å‘ï¼‰ã€‚æž„å»ºæ¸…å•æŒ‰ `codesign -dv` 实测记录 `appleSigned` / `appleSignatureKind`(如 `adhoc`),并固定记录 `notarized=false`。用户首次安装需è¦åœ¨ Gatekeeper 中手动放行;更新包校验本身åªä¾èµ– minisign ç­¾å,因此未签åä¸é˜»æ–­è‡ªåŠ¨æ›´æ–°çš„æ ¡éªŒçŽ¯èŠ‚ï¼Œä½†ã€Œå®‰è£… → é‡å¯æŽ¥ç®¡æ–°ç‰ˆæœ¬ã€çš„å®žæœºé—­çŽ¯ä»æœªéªŒè¯ï¼Œä¸å¾—以构建æˆåŠŸæ›¿ä»£ã€‚ Job æè¿°ä¸ŽèŠ‚ç‚¹æè¿°æ˜¯ Jenkins 侧元数æ®ï¼Œ**ä¸éšä»“åº“åŒæ­¥**:Jenkinsfile åªå›žå†™å‚数定义,æè¿°å¿…须手工维护,å¦åˆ™ä¼šåœç•™åœ¨å»º Job æ—¶çš„å£å¾„(2026-09-20 就出现过æè¿°è¿˜å†™ç€ã€Œåªæž„建归档ã€ä¸ç­¾åä¸ä¸Šä¼ ã€ï¼Œè€Œå®žé™…å·²ç»æ˜¯å«ç­¾åã€åˆ†åŒºæ¸…å•ã€éªŒç­¾ä¸Ž OSS 上传的å‘布管线)。当å‰å£å¾„:Job æè¿°è¯´æ˜Žã€Œæž„建 universal → åŒæž¶æž„ smoke → DMG → `-mac` åˆ†åŒºæ¸…å• â†’ 更新包验签 → 按 dry-run å†³å®šä¸Šä¼ ï¼Œæœªåš Apple ç­¾å与公è¯ã€ï¼›èŠ‚ç‚¹æè¿°è¯´æ˜Žã€Œ`genarrative-agc-macos`ã€EXCLUSIVE å• executorã€ä»…手动触å‘ã€ç‹¬ç«‹ workspaceã€sccache 在 HOMEã€ã€‚维护手法:该 Job 上 `POST job//config.xml` 会返回 500ï¼ŒèŠ‚ç‚¹ä¾§åŒæŽ¥å£æ­£å¸¸ï¼›å› æ­¤æ”¹ Job æè¿°ç”¨è„šæœ¬æŽ¥å£åŽŸåœ°æ›´æ–°ï¼ˆä¿ç•™æž„建历å²ï¼‰ï¼Œä¸è¦ä¸ºäº†æ”¹æè¿°åˆ  Job é‡å»ºã€‚ diff --git a/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build b/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build index 91bcfdc97..511c0bd42 100644 --- a/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build +++ b/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build @@ -34,6 +34,10 @@ pipeline { CARGO_INCREMENTAL = '0' // ä¸æŠŠèŠ‚ç‚¹ç”¨æˆ·å写进仓库:PATH 在下é¢çš„ shell 步骤里按 $HOME 展开。 AGC_EXTRA_PATH = '/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin' + // universal 需è¦ä¸¤ä»½**åŒç‰ˆæœ¬**的架构è¿è¡Œæ—¶ï¼šå®¿ä¸»ï¼ˆarm64)å–自 PATH 里的构建 Node, + // x86_64 由节点预装的官方å‘行版æä¾›ã€‚åªå†™ç›¸å¯¹ HOME 的目录,ç»å¯¹è·¯å¾„在 shell 步骤里拼。 + // 节点没有它时构建å‰å³å¤±è´¥ï¼Œç»ä¸é™é»˜è·³è¿‡æˆ–让更新包缺一份è¿è¡Œæ—¶ã€‚ + AGC_NODE_RUNTIME_DARWIN_X64_HOME = 'Library/Jenkins/node/darwin-x64' } stages { stage('Checkout') { @@ -116,6 +120,24 @@ pipeline { arch -x86_64 /usr/bin/uname -m if command -v sccache >/dev/null 2>&1; then sccache --version; else echo '[agc-macos] 未找到 sccache;本次回退到 rustc 直接构建。'; fi rustup target add aarch64-apple-darwin x86_64-apple-darwin + # éšåŒ… Node 的两套架构è¿è¡Œæ—¶ï¼šå®¿ä¸»é‚£ä¸€ä»½å°±æ˜¯ PATH 里的构建 Node, + # x86_64 那一份必须是节点上预装的官方å‘è¡Œç‰ˆï¼ˆå« LICENSE 与 lib/node_modules/npm)。 + # 两份版本必须一致,å¦åˆ™ staging 会在写出任何资æºå‰å¤±è´¥å…³é—­ï¼›è¿™é‡Œæå‰åˆ°ç¼–è¯‘å‰æš´éœ²ã€‚ + x64_root="${AGC_NODE_RUNTIME_DARWIN_X64_HOME:-Library/Jenkins/node/darwin-x64}" + case "$x64_root" in /*) ;; *) x64_root="${HOME:?HOME ä¸èƒ½ä¸ºç©º}/$x64_root" ;; esac + if [ ! -x "${x64_root}/bin/node" ]; then + echo "[agc-macos] 缺少 x86_64 Node è¿è¡Œæ—¶ï¼š${x64_root}/bin/node" + echo '[agc-macos] 安装官方 darwin-x64 å‘行版到该目录(ä¿ç•™ LICENSE 与 lib/node_modules/npm)åŽé‡è¯•;也å¯ä»¥è¦†ç›– AGC_NODE_RUNTIME_DARWIN_X64_HOME' + exit 1 + fi + host_node_version="$(node --version)" + x64_node_version="$(/usr/bin/arch -x86_64 "${x64_root}/bin/node" --version)" + if [ "$host_node_version" != "$x64_node_version" ]; then + echo "[agc-macos] 两套 Node è¿è¡Œæ—¶ç‰ˆæœ¬ä¸ä¸€è‡´ï¼šarm64=${host_node_version} x86_64=${x64_node_version}" + echo '[agc-macos] universal æ›´æ–°åŒ…åªæŽ¥å—åŒç‰ˆæœ¬çš„两套è¿è¡Œæ—¶ï¼Œè¯·æŠŠèŠ‚ç‚¹ä¸Šçš„ x86_64 å‘行版å‡åˆ°ä¸Žæž„建 Node 相åŒç‰ˆæœ¬' + exit 1 + fi + echo "[agc-macos] éšåŒ… Node è¿è¡Œæ—¶ï¼šarm64=${host_node_version} x86_64=${x64_node_version}ï¼ˆæ¥æº ${x64_root})" npm ci --no-audit --no-fund node apps/ai-game-creator-shell/scripts/prepare-macos-codex.mjs ''' @@ -143,6 +165,12 @@ pipeline { sh ''' set -eu export PATH="$HOME/.local/bin:$HOME/.cargo/bin:${AGC_EXTRA_PATH}" + # universal staging 需è¦å¦ä¸€æž¶æž„çš„ Node æ¥æºï¼›è·¯å¾„与 Toolchain 阶段åŒä¸€å£å¾„, + # 缺失/版本ä¸ä¸€è‡´ç”± staging 在任何è½ç›˜å‰å†æ¬¡å¤±è´¥å…³é—­ã€‚ + x64_root="${AGC_NODE_RUNTIME_DARWIN_X64_HOME:-Library/Jenkins/node/darwin-x64}" + case "$x64_root" in /*) ;; *) x64_root="${HOME:?HOME ä¸èƒ½ä¸ºç©º}/$x64_root" ;; esac + export AGC_NODE_RUNTIME_DARWIN_X64_PATH="${x64_root}/bin/node" + export AGC_NODE_RUNTIME_DARWIN_X64_LICENSE_PATH="${x64_root}/LICENSE" echo "[agc-macos] 渠é“=${AGC_UPDATE_CHANNEL} 分区=${AGC_UPDATE_CHANNEL}-mac 目标=universal-apple-darwin dry-run=${AGC_RELEASE_DRY_RUN}" ossutil_bin="${OSSUTIL_BIN:-ossutil}" if command -v "${ossutil_bin}" >/dev/null 2>&1; then