Mac构建并行度改为可调参数并记录首次缓存表现
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 18s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 18s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 19s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 19s
Project CI / AI game creator shell Rust smoke (pull_request) Failing after 18s
Project CI / AI game creator shell Rust crates (pull_request) Failing after 19s
Project CI / Backend tests (pull_request) Failing after 18s
Project CI / Native shell tests (pull_request) Failing after 18s
Project CI / Frontend tests (pull_request) Failing after 7s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / AI game creator shell web tests (pull_request) Failing after 11s

CARGO_BUILD_JOBS从写死4改为Job参数默认6,适配8核共用机器
补充并行度与sccache首次全未命中的运维口径
增加Jenkinsfile并行度参数的回归断言
This commit is contained in:
2026-09-20 18:51:36 +08:00
parent bb1df3c6da
commit bdf6d0f556
3 changed files with 7 additions and 3 deletions
@@ -76,6 +76,9 @@ test('CI pipeline is manual, publishes the macOS partition and never reuses a de
"string(credentialsId: 'AliyunaccessKeySecret'",
'AGC_RELEASE_VERSION',
'OSSUTIL_BIN',
// 并行度必须可调:节点是共用机器,写死容易把整机压满或反过来浪费一半核心。
"string(name: 'CARGO_BUILD_JOBS'",
'CARGO_BUILD_JOBS=${params.CARGO_BUILD_JOBS}',
]) {
assert.ok(pipeline.includes(required), required);
}
@@ -730,7 +730,7 @@ Pingora current release 自审脚本 `scripts/ops/pingora-current-release-audit.
Mac universal 构建脚本位于 `jenkins/Jenkinsfile.ai-game-creator-shell-macos-build`,只对专用 `genarrative-agc-macos` 标签运行。节点按 EXCLUSIVE、单 executor 配置,Job 禁止并发且不设置 trigger;不接入现有每小时版本调度,不改 Windows 发布职责。它使用独立 Jenkins workspace,禁止指向开发 checkout 或共享其可写 target/node_modules。
Job 名为 `Genarrative-Agc-MacOS-Build`,SCM 直接读取仓库内上述 Jenkinsfile,参数为 `SOURCE_BRANCH``COMMIT_HASH``AGC_UPDATE_CHANNEL``AGC_RELEASE_VERSION``AGC_RELEASE_DRY_RUN``AGC_UPDATE_RELEASE_NOTES``OSSUTIL_BIN`。渠道参数是基础名(不含系统,默认 `dev`),脚本不接受 `dev-mac` 这类系统后缀,写入分区固定推导为 `<channel>-mac`:这与 Windows Job 的 `<channel>-win` 对称,也延续已发布客户端的端点。
Job 名为 `Genarrative-Agc-MacOS-Build`,SCM 直接读取仓库内上述 Jenkinsfile,参数为 `SOURCE_BRANCH``COMMIT_HASH``AGC_UPDATE_CHANNEL``AGC_RELEASE_VERSION``AGC_RELEASE_DRY_RUN``AGC_UPDATE_RELEASE_NOTES``OSSUTIL_BIN``CARGO_BUILD_JOBS`。渠道参数是基础名(不含系统,默认 `dev`),脚本不接受 `dev-mac` 这类系统后缀,写入分区固定推导为 `<channel>-mac`:这与 Windows Job 的 `<channel>-win` 对称,也延续已发布客户端的端点。
该 Job 的职责是构建并发布 `<channel>-mac` 分区更新:执行 `npm ci` 后使用锁文件校验并补齐两种 macOS Codex 原生依赖,再调用 `scripts/build-macos-ci.mjs`(AGC 应用目录下)生成 universal app、arm64/x86_64 隔离 smoke、universal DMG 与分区清单 `latest.json`,用产物内烘焙的公钥复核更新包签名(`verify-updater-signature.mjs`),最后按 `AGC_RELEASE_DRY_RUN` 决定是否上传 OSS。归档限 `artifacts/` 下的 DMG、SHA-256、`latest.json`、更新包签名、更新摘要、非敏感构建清单和源码 commit;不归档用户 HOME、Jenkins secret、原始工作目录或全量日志。
@@ -738,7 +738,7 @@ Job 名为 `Genarrative-Agc-MacOS-Build`SCM 直接读取仓库内上述 Jenki
产物边界:macOS 代码签名与公证暂缺,构建保持 `--no-sign`,构建清单显式记录 `appleSigned=false` / `notarized=false`。用户首次安装需要在 Gatekeeper 中手动放行;更新包校验本身只依赖 minisign 签名,因此未签名不阻断自动更新的校验环节,但「安装 → 重启接管新版本」的实机闭环仍未验证,不得以构建成功替代。
该 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` 输出,供判断是否需要预热或调整缓存上限。
该 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` 输出,供判断是否需要预热或调整缓存上限。
当前用户的 LaunchAgent 受登录、休眠与局域网连通性影响,不能视为长期无人值守构建机。该用户进程也不是权限沙箱,只能承接受信任仓库和 Job;不能把匹配标签当作隔离恶意构建的措施。节点注册、上线和首个 Job 的成功必须以控制器实时状态确认,脚本入库不代表管线已经接通。
@@ -15,6 +15,7 @@ pipeline {
booleanParam(name: 'AGC_RELEASE_DRY_RUN', defaultValue: true, description: '勾选后只构建、验签并打印将上传的对象,不写 OSS;取消勾选才真正发布到 dev-mac 渠道')
string(name: 'AGC_UPDATE_RELEASE_NOTES', defaultValue: '', description: '可选单行更新摘要;留空则由发布脚本按提交自动汇总')
string(name: 'OSSUTIL_BIN', defaultValue: 'ossutil', description: 'ossutil 命令名或绝对路径(Mac 节点默认装在 ~/.local/bin/ossutil')
string(name: 'CARGO_BUILD_JOBS', defaultValue: '6', description: '并行 rustc 任务数:节点 8 核(4P+4E)且需留余量给日常使用,6 是经实测的折中值;只影响本次构建')
}
environment {
GIT_REMOTE_URL = 'ssh://git@192.168.35.82:2222/GenarrativeAI/Genarrative.git'
@@ -28,7 +29,6 @@ pipeline {
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'
}
stages {
@@ -96,6 +96,7 @@ pipeline {
]) {
withEnv([
"OSSUTIL_BIN=${params.OSSUTIL_BIN}",
"CARGO_BUILD_JOBS=${params.CARGO_BUILD_JOBS}",
"AGC_UPDATE_CHANNEL=${params.AGC_UPDATE_CHANNEL}",
"AGC_RELEASE_VERSION=${params.AGC_RELEASE_VERSION}",
"AGC_RELEASE_DRY_RUN=${params.AGC_RELEASE_DRY_RUN ? '1' : '0'}",