From c4b391cb8489c3881e0097c36baace89b9bad49a Mon Sep 17 00:00:00 2001 From: suzmii Date: Sun, 20 Sep 2026 20:44:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95Mac=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E7=AE=A1=E7=BA=BF=E9=A6=96=E6=AC=A1=E7=AB=AF=E5=88=B0=E7=AB=AF?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 回填build3成功的产物、验签、dry-run与耗时证据 补充--no-sign连带跳过更新包签名、残留产物不幂等两处踩坑 记录主crate重复编译这一剩余耗时优化点 --- ...【里程碑】Mac本机构建节点接入-2026-09-18.md | 18 +++++++++++++++++- docs/project-memory/shared-memory/pitfalls.md | 12 ++++++++++++ ...发运维】本地开发验证与生产运维-2026-05-15.md | 4 ++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/project-memory/plans/【里程碑】Mac本机构建节点接入-2026-09-18.md b/docs/project-memory/plans/【里程碑】Mac本机构建节点接入-2026-09-18.md index 728a3a31d..912ebad75 100644 --- a/docs/project-memory/plans/【里程碑】Mac本机构建节点接入-2026-09-18.md +++ b/docs/project-memory/plans/【里程碑】Mac本机构建节点接入-2026-09-18.md @@ -1,7 +1,7 @@ # Mac 本机构建节点接入 - Version: 1 -- Status: reviewed +- Status: accepted-with-open-items - Date: 2026-09-18 - Parent Spec: `docs/【开发运维】本地开发验证与生产运维-2026-05-15.md` @@ -32,3 +32,19 @@ Jenkinsfile、锁定双架构依赖预备脚本与 archive-only CI 打包入口已在本地准备。定向 Node 测试 37 项通过,类型/配置、编码、文档索引、定向 ESLint 与 diff 检查通过;未执行完整 Jenkins 构建或在线 Groovy 校验。 控制器直连多次超时,经当前代理请求返回 502;Java 21 已存在,无需安装新 JDK。尚未注册节点、创建 Job、保存 Agent secret、安装 LaunchAgent 或触发远端构建。需先恢复内网连接,再按本规范验收真实节点及构建状态;不把本地代码准备描述为已经接入成功。 + +## 验收结果(2026-09-20) + +| 验收项 | 结果 | +| --- | --- | +| 控制器匹配的 agent.jar + 已有 Java 21 | 通过(未安装新 JDK) | +| 节点实际 online、专用标签、EXCLUSIVE 单 executor | 通过(`genarrative-agc-macos-01`) | +| LaunchAgent 可重启/卸载、凭据在仓库外且权限受限 | 通过 | +| 固定 commit、锁文件装依赖、两种 macOS 原生包 integrity | 通过 | +| universal Release + 双架构 smoke + DMG verify | 通过(arm64 原生、x86_64 走 Rosetta) | +| 归档仅含安装包/摘要/非敏感来源信息 | 通过 | +| 真实 Jenkins build SUCCESS 且归档存在 | 通过(build #3,43 分钟) | + +同期修复:Mac 入口误传 `--no-sign` 导致更新包无签名;复用 workspace 的残留产物导致 DMG 重建失败、旧签名可能让验签误通过;并行度由写死 4 改为 Job 参数(默认 6)。 + +仍未验收:Apple 代码签名与公证(当前 `adhoc`,首装需 Gatekeeper 手动放行)、macOS 安装后重启接管新版本的实机闭环、Intel 真机 smoke、真实(非 dry-run)发布与渠道清单上线。 diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 6e76e482c..26c2c312c 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,17 @@ # 踩坑与排障记录 +## Tauri `--no-sign` 会连带跳过 updater 签名 + +AGC macOS 发布入口一度传入 `--no-sign`(目的是绕过没有 Apple 证书的代码签名),结果 Tauri 打印 `Warn Updater signing is skipped due to --no-sign flag.`,产物只有 `*​.app.tar.gz` 而没有 `.sig`,发布入口按设计在「缺少更新包签名」处失败关闭(2026-09-20 首次 Jenkins 实跑命中)。正确做法是不传 `--no-sign`,改为剥离 `APPLE_*` 凭据让 Tauri 跳过 Apple 签名——minisign 更新包签名与 Apple 代码签名这两个开关在 Tauri 里并不独立。Apple 签名状态要按 `codesign -dv` 实测记录,不能硬编码。 + +## 复用 workspace 的构建必须显式清理本次要写的产物 + +Jenkins workspace 跨构建保留:上一轮失败留下的同名 `陶泥儿__universal.dmg` 会让 `hdiutil create` 以「文件已经存在」失败,而上一轮遗留的 `*​.app.tar.gz.sig` 更危险——本轮即使没签出签名,验签门禁也会读到旧签名而误判通过。构建入口必须在构建前删除本次将写出的确切路径(更新包、签名、同版本 DMG 及其校验文件、`latest.json`、`release-notes.txt`),`hdiutil create` 同时用 `-ov`,让「归档里的产物来自本次构建」成为结构性事实而非假设。 + +## AGC macOS 单次构建耗时集中在主 crate 重复编译 + +AGC 主 crate(`genarrative_ai_game_creator_shell`)单架构 codegen 约 15–20 分钟,而每次 Tauri 构建都会重新生成前端 `dist`,`build.rs` 对 `dist` 目录的 `rerun-if-changed` 因此每次都判定变化,导致两个架构各重编一次主 crate。实测:`CARGO_BUILD_JOBS=4` 时首次 Jenkins 构建 78 分钟,提到 6 后为 41–43 分钟且成功;依赖 crate 走 sccache 与 target 缓存,首轮 0 命中属预期。剩余优化空间在「不必要地重建 dist」这一层,需单独设计(例如按内容摘要决定是否重跑前端构建),不要在发布入口里用假缓存换取速度。 + ## Rust 同步回调的测试记录按线程隔离 - `shared-contracts` 的资源 kind reporter 是进程级回调。仅给注册和断言加锁,无法阻止其他并行 manifest 测试触发该回调,导致日志数量和内容断言偶发混入其他测试记录。 diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index f3ca67a69..64c175fe3 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -740,6 +740,10 @@ Job 名为 `Genarrative-Agc-MacOS-Build`,SCM 直接读取仓库内上述 Jenki 该 Job 的 Rust 编译走 sccache 对象缓存,与 `Genarrative-Api-Build`、`Genarrative-Stdb-Module-Build` 一致:`RUSTC_WRAPPER=sccache`、`CARGO_INCREMENTAL=0`、`SCCACHE_CACHE_SIZE=20G`。`SCCACHE_DIR` 默认落在稳定缓存根 `~/caches/genarrative-jenkins/agc-macos/sccache`,可用 `GENARRATIVE_AGC_MACOS_CACHE_ROOT` 覆盖;缓存根固定在 HOME 下而不是 `WORKSPACE` 内,避免 workspace 重建后无改动也触发近似冷构建。节点是 8 逻辑核(4P+4E)的共用机器,`CARGO_BUILD_JOBS` 因此做成 Job 参数(默认 `6`),既不全占也让出余量;首次构建 sccache 必然全未命中(实测 0 命中 / 407 未命中),此后的构建才逐步吃到缓存。节点未安装 sccache 时管线打印提示并回退到真实 `rustc`,不阻断构建。universal 双架构各自独立编译,依赖 crate 的复用收益约为单架构的两倍;命中情况由构建末尾的 `sccache --show-stats` 输出,供判断是否需要预热或调整缓存上限。 +首次端到端验证(2026-09-20,build #3):`SUCCESS`,43 分钟。产出 `陶泥儿_0.1.68_universal.dmg`、`陶泥儿.app.tar.gz` 与 `.sig`、`latest.json`、`build-manifest.json`;两个架构的隔离 smoke(arm64 / Rosetta x86_64)通过,更新包用产物内烘焙公钥复核通过(`alg=ED`,`keyId=cb883447e3e87c4e`),dry-run 只打印 4 个上传对象、未写 OSS。构建清单实测记录 `appleSigned=false`、`appleSignatureKind=adhoc`、`notarized=false`。首次实跑暴露并修掉两个入口缺陷:传 `--no-sign` 会连带跳过 updater 的 minisign 签名(产物无 `.sig`),以及复用 workspace 里残留的同名 DMG 让 `hdiutil create` 直接失败、残留旧 `.sig` 还可能让验签误通过——入口现在会在构建前删除本次将写出的确切产物并要求 `hdiutil -ov`。 + +耗时构成:`CARGO_BUILD_JOBS=4` 时首次构建 78 分钟,提到 6 后 41–43 分钟;剩余时间主要花在主 crate 每个架构各一遍 codegen(每次 Tauri 构建都会重写前端 `dist`,触发 `build.rs` 重跑)。该优化点见 `docs/project-memory/shared-memory/pitfalls.md`,需单独设计。 + 当前用户的 LaunchAgent 受登录、休眠与局域网连通性影响,不能视为长期无人值守构建机。该用户进程也不是权限沙箱,只能承接受信任仓库和 Job;不能把匹配标签当作隔离恶意构建的措施。节点注册、上线和首个 Job 的成功必须以控制器实时状态确认,脚本入库不代表管线已经接通。 ### CI 宿主 CPU 上限(Jenkins 16 核 / Gitea Actions runner 12 核)