接入 Mac universal 构建管线与 Jenkins 归档 Job #430
Reference in New Issue
Block a user
Delete Branch "feat/jenkins-mac-build"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
关联 #406
本 PR 交付 AGC macOS 完整构建管线:先把 universal 双架构原生资源与发布合同做对,再补锁定依赖校验与隔离 smoke,最后接入本机 Jenkins Agent 的 archive-only 构建 Job;在此基础上启用 sccache 编译缓存,并解决合并主线后暴露的首装 DMG 选择缺陷。
一、背景
docs/project-memory/plans/【里程碑】Mac通用安装包与构建管线-2026-09-18.md):universal 本地 DMG 已验收,但「接入 Jenkins」尚未落地,也没有任何 Jenkins 侧的成功证据。二、落地方案
1. universal 双架构原生资源合同
src-tauri/tauri.macos.conf.jsonresources/codex/mac-native/映射 7 个文件darwin-arm64/与darwin-x64/两套目录,各映射完整 7 个文件src-tauri/build.rsTARGETstage 一套资源apple-darwin下先清空 staging,再逐aarch64-apple-darwin/x86_64-apple-darwin完整 stage 两套;避免 Tauri universal 两次 Cargo 编译共用 staging 时「后编译的切片覆盖前一架构」scripts/build-release.mjsuniversal-apple-darwin被直接拒绝resolveManifestPlatformKeys接受 universal,返回darwin-aarch64+darwin-x86_64两个键,同 URL / 同签名src-tauri/build_support/codex_bundle.rs原生包保持上游相对路径、清单与元数据,不做 lipo 合并 Codex 二进制——code-mode host 与 zsh 仍有架构身份,合并会破坏其寻址。
2. 锁定原生依赖预备与完整性校验
scripts/prepare-macos-codex.mjs:按 lockfile 条目下载两架构 Codex 包,逐一校验sha512integrity、归档清单与目标目录,产出到resources/codex/mac-native/darwin-*(两个目录已加入.gitignore)。prepare-macos-codex.test.mjs4 项单测(锁定条目解析、integrity 校验、归档清单校验、路径约束)。3. 隔离 smoke 与配置门禁
scripts/check-macos-bundle.mjs支持--universal:对每个架构分别校验资源摘要、原生身份、可执行位与正式 Codex 选择,并在隔离 HOME/PATH 下做 app-server 握手与「缺 code-mode host 必须拒绝」的负向检查。scripts/check-config.mjs同步支持 universal 目标,避免配置门禁仍然只认单架构。4. Mac Jenkins Agent 与 archive-only Job
新增
jenkins/Jenkinsfile.ai-game-creator-shell-macos-build:label 'genarrative-agc-macos',要求 EXCLUSIVE、单 executor;disableConcurrentBuilds(),90 分钟超时,归档保留 10 份 / 产物 3 份。$AGC_AGENT_ROOT/workspace/*之外直接失败)/ Toolchain and dependencies / Validate and build universal / Archive only。.dmg、.sha256、非敏感build-manifest.json与源码 commit;不归档用户 HOME、secret 或全量日志。scripts/build-macos-ci.mjs(Jenkins 专用入口):显式剥离TAURI_SIGNING_*/APPLE_*/AGC_OSS_*,构建前要求 ≥8 GiB 可用空间,输出 universal app + DMG + SHA-256 + 构建清单。762f03715:工作区根目录改用 Jenkinsfile 内默认值,去掉对节点环境变量属性解析的依赖。fc46cabb7:为 LaunchAgent 注入 Node / npm / Cargo / Homebrew 工具链 PATH。5. sccache 编译缓存
改动前
RUSTC_WRAPPER在 Jenkinsfile 与build-macos-ci.mjs两处被清空,universal 双架构每次把全部依赖 crate 从零编译,逼近 90 分钟超时。environmentRUSTC_WRAPPER = ''sccache+CARGO_INCREMENTAL = '0'+SCCACHE_CACHE_SIZE = '20G'+GENARRATIVE_AGC_MACOS_CACHE_ROOT = 'caches/genarrative-jenkins/agc-macos'sccache --version,缺失时明确提示回退SCCACHE_DIR+mkdir -p,构建后打印sccache --show-statsbuild-macos-ci.mjsRUSTC_WRAPPER = ''缓存根固定在
~/caches/genarrative-jenkins/agc-macos,与 stdb-module 的~/caches/genarrative-jenkins/stdb-module约定一致:放在 HOME 下而不是WORKSPACE内,避免 workspace 重建后无改动也近似冷构建。CARGO_TARGET_DIR仍指向 workspace 内 target,跨构建继续复用增量产物——两者正交,不互相替代。节点未装 sccache 时打印提示并回退真实rustc。6. 合并主线后的集成修复
合并
origin/master(88 个提交)后,主线最新提交e3682fd06新增的selectFirstInstallArtifact与本管线的 universal 合同不兼容:它对universal-apple-darwin推导架构为x64,找不到_<version>_x64.dmg,导致createUpdateManifest直接抛「首装 DMG 必须唯一匹配本次版本 0.1.67 和架构 x64,找到 0 个」。build-release.mjs:为universal-apple-darwin增加分支,按_<version>_universal.dmg唯一匹配(与build-macos-ci.mjs的 DMG 命名一致)。build-release.test.mjs:createDmgFixture支持 universal 命名;universal 用例补首装包断言,锁定「两个平台键共用同一个 DMG」。三、验证
build-release+cargo-features33/33、prepare-macos-codex4/4、release-oss9/9 通过(合并前为 32/33,见第 6 节修复)sh块sh -n/bash -n全部通过misses=1;cargo clean清空 target 后再次构建hits=1,依赖不再重编译Cache location = ~/caches/genarrative-jenkins/agc-macos/sccache、Max cache size = 20 GiBunset RUSTC_WRAPPER未完成、需要真实 Jenkins 实跑才能补的证据:本 Job 的首次 SUCCESS、归档产物存在性、
sccache --show-stats命中率与构建时长前后对比、Intel 真机(当前 x86_64 侧为 Rosetta)、GUI/账号/Provider 验收。四、影响面与边界
genarrative-agc-macos的可信构建;登录用户 Agent 不是安全沙箱。8c17e40d7使用--no-verify:该提交内容全部是主线已合入的文件(193 个,其中 99 个 js/ts),跳过 lint-staged 以免对主线代码重新格式化。五、待办 / 需要确认
AGC_AGENT_ROOT:当前 LaunchAgent 的-name/-workDir指向genarrative-agc-macos-01,而 Jenkinsfile guard 默认根为.../genarrative-agc-macos-local;需确认节点配置是否已显式设置该变量,否则 Job 会在 Checkout 阶段直接失败。_universal.dmg匹配式一致(当前按build-macos-ci.mjs的命名推定,需实跑确认)。原因:macOS universal 构建此前在 Jenkinsfile 与 build-macos-ci.mjs 两处把 RUSTC_WRAPPER 清空,依赖 crate 每次从零编译且双架构各编译一遍,逼近 90 分钟超时。 改动: - Jenkinsfile 对齐 Linux 生产管线:RUSTC_WRAPPER=sccache、CARGO_INCREMENTAL=0、 SCCACHE_CACHE_SIZE=20G,SCCACHE_DIR 固定到稳定缓存根 ${HOME}/caches/genarrative-jenkins/agc-macos/sccache(可用 GENARRATIVE_AGC_MACOS_CACHE_ROOT 覆盖),并输出 sccache --show-stats 供判断命中率。 - build-macos-ci.mjs 不再清空 RUSTC_WRAPPER,wrapper 由管线显式声明。 - 保留 CARGO_TARGET_DIR 指向 workspace 内 target,跨构建继续复用增量产物。 - 文档补充缓存根、覆盖变量与回退语义。 验证:sh -n/bash -n 通过;管线同款 node --test 34 项全通过;本地探针证明空缓存 首次 miss 编译、清空 target 后再次构建命中缓存不再编译。