Mac Jenkins节点接入sccache编译缓存
原因: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 后再次构建命中缓存不再编译。
This commit is contained in:
@@ -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 = [
|
||||
|
||||
@@ -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 核)
|
||||
|
||||
@@ -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
|
||||
'''
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user