diff --git a/apps/ai-game-creator-shell/scripts/build-macos-ci.mjs b/apps/ai-game-creator-shell/scripts/build-macos-ci.mjs index acafcc0fd..be57f58a0 100644 --- a/apps/ai-game-creator-shell/scripts/build-macos-ci.mjs +++ b/apps/ai-game-creator-shell/scripts/build-macos-ci.mjs @@ -31,7 +31,9 @@ assert.ok( for (const key of Object.keys(process.env)) { if (/^(TAURI_SIGNING_|APPLE_|AGC_OSS_)/u.test(key)) delete process.env[key]; } -process.env.RUSTC_WRAPPER = ''; +// RUSTC_WRAPPER / SCCACHE_DIR / SCCACHE_CACHE_SIZE / CARGO_INCREMENTAL 由 Jenkinsfile 显式提供: +// 依赖 crate 命中 sccache 对象缓存,避免 universal 双架构每次从零编译; +// 本入口不再清空 wrapper,以免与管线声明冲突。若节点未装 sccache,由管线回退到真实 rustc。 process.env.CARGO_TARGET_DIR = path.join(appRoot, 'src-tauri/target'); const context = resolveReleaseContext(['--target=universal-apple-darwin']); const args = [ diff --git a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md index f20a47532..33268a13a 100644 --- a/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md +++ b/docs/【开发运维】本地开发验证与生产运维-2026-05-15.md @@ -722,6 +722,8 @@ Mac universal 构建脚本位于 `jenkins/Jenkinsfile.ai-game-creator-shell-maco 该 Job 的目标仅为构建并归档:保留源码版本、不读取远端版本、不注入发布私钥/OSS 凭据、不运行 release upload。执行 `npm ci` 后使用锁文件校验并补齐两种 macOS Codex 原生依赖,再调用 `scripts/build-macos-ci.mjs`(AGC 应用目录下)生成 universal app 与 DMG、分别运行 arm64/x86_64 隔离 smoke。归档限 `artifacts/` 下的 DMG、SHA-256、非敏感构建清单和源码 commit;不归档用户 HOME、Jenkins secret、原始工作目录或全量日志。 +该 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 重建后无改动也触发近似冷构建。节点未安装 sccache 时管线打印提示并回退到真实 `rustc`,不阻断构建。universal 双架构各自独立编译,依赖 crate 的复用收益约为单架构的两倍;命中情况由构建末尾的 `sccache --show-stats` 输出,供判断是否需要预热或调整缓存上限。 + 当前用户的 LaunchAgent 受登录、休眠与局域网连通性影响,不能视为长期无人值守构建机。该用户进程也不是权限沙箱,只能承接受信任仓库和 Job;不能把匹配标签当作隔离恶意构建的措施。节点注册、上线和首个 Job 的成功必须以控制器实时状态确认,脚本入库不代表管线已经接通。 ### CI 宿主 CPU 上限(Jenkins 16 核 / Gitea Actions runner 12 核) diff --git a/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build b/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build index bd83cd587..5e02d5872 100644 --- a/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build +++ b/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build @@ -15,7 +15,13 @@ pipeline { GIT_REMOTE_URL = 'ssh://git@192.168.35.82:2222/GenarrativeAI/Genarrative.git' GIT_REMOTE_CREDENTIAL_ID = 'genarrative-local-gitea-ssh' AGC_UPDATE_CHANNEL = 'dev-mac' - RUSTC_WRAPPER = '' + // 与 Linux 生产管线(api-build / stdb-module-build)对齐:Rust 编译走 sccache 对象缓存。 + // 本 Job 是 universal 双架构(aarch64 + x86_64)各自独立编译,缓存收益约为单架构的两倍。 + // 缓存根固定在 HOME 下的稳定目录,避免 WORKSPACE 重建导致近似冷构建;可用下面的变量覆盖。 + GENARRATIVE_AGC_MACOS_CACHE_ROOT = 'caches/genarrative-jenkins/agc-macos' + RUSTC_WRAPPER = 'sccache' + SCCACHE_CACHE_SIZE = '20G' + CARGO_INCREMENTAL = '0' CARGO_BUILD_JOBS = '4' PATH = '/Users/suzmii/.local/bin:/Users/suzmii/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin' } @@ -67,6 +73,7 @@ pipeline { xcrun --find clang xcrun --find lipo 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 npm ci --no-audit --no-fund node apps/ai-game-creator-shell/scripts/prepare-macos-codex.mjs @@ -77,9 +84,23 @@ pipeline { steps { sh ''' set -eu + cache_root="${GENARRATIVE_AGC_MACOS_CACHE_ROOT:-caches/genarrative-jenkins/agc-macos}" + case "${cache_root}" in /*) ;; *) cache_root="${HOME:?HOME 不能为空}/${cache_root}" ;; esac + if command -v sccache >/dev/null 2>&1; then + export SCCACHE_DIR="${cache_root}/sccache" + mkdir -p "${SCCACHE_DIR}" + echo "[agc-macos] sccache 缓存目录: ${SCCACHE_DIR}" + else + echo '[agc-macos] 未找到 sccache,改用 rustc 直接构建。' + unset RUSTC_WRAPPER + fi node --test apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs node --test apps/ai-game-creator-shell/scripts/build-release.test.mjs apps/ai-game-creator-shell/scripts/cargo-features.test.mjs node apps/ai-game-creator-shell/scripts/build-macos-ci.mjs + if command -v sccache >/dev/null 2>&1; then + echo '[agc-macos] sccache 统计(自 server 启动累计):' + sccache --show-stats 2>&1 | sed -n '1,6p' + fi ''' } }