修正 Mac 发布文档口径:自动触发与描述原文

- 运维文档原写「不设置 trigger;不接入现有每小时版本调度」,与现状矛盾:调度 Job 会先发号再把 SOURCE_BRANCH/COMMIT_HASH/AGC_UPDATE_CHANNEL/AGC_RELEASE_VERSION/SKIP_IF_SUPERSEDED 透传给 Mac Job,正常发布不需要手工点构建
- 把 Jenkins Job 描述与节点描述的当前原文(arm64 单架构 + 由调度器自动触发 + dry-run 默认关)写进文档,并要求每次改口径同步 Jenkins 侧描述,避免描述停留在 universal/手动触发的旧口径
This commit is contained in:
2026-09-21 12:43:36 +08:00
parent 1cb91f9444
commit 8d0c021126
@@ -728,7 +728,7 @@ Pingora current release 自审脚本 `scripts/ops/pingora-current-release-audit.
### AGC macOS 手动构建节点
Mac 单架构(arm64)构建脚本位于 `jenkins/Jenkinsfile.ai-game-creator-shell-macos-build`,只对专用 `genarrative-agc-macos` 标签运行。节点按 EXCLUSIVE、单 executor 配置,Job 禁止并发且不设置 trigger;不接入现有每小时版本调度,不改 Windows 发布职责。它使它只在专用 Agent 目录下构建:默认按约定匹配 `$HOME/Library/Jenkins/agents/<node>/workspace/`(不写死节点名,节点改名后仍成立),也可用 `AGC_AGENT_ROOT` 显式覆盖;禁止指向开发 checkout 或共享其可写 target/node_modules。
Mac 单架构(arm64)构建脚本位于 `jenkins/Jenkinsfile.ai-game-creator-shell-macos-build`,只对专用 `genarrative-agc-macos` 标签运行。节点按 EXCLUSIVE、单 executor 配置,Job 禁止并发、自身不设 cron(定时只来自调度 Job);它已接入每小时版本调度:`Genarrative-Scheduled-Revision-Trigger` 先调发号 Job 拿同一个总号,再把 `SOURCE_BRANCH`、固定 `COMMIT_HASH``AGC_UPDATE_CHANNEL=dev``AGC_RELEASE_VERSION=<总号>``SKIP_IF_SUPERSEDED=true` 透传给本 Job,**因此正常发布不需要(也不应该)手工点构建**;手工触发只是排障手段。它不改 Windows 发布职责。它使它只在专用 Agent 目录下构建:默认按约定匹配 `$HOME/Library/Jenkins/agents/<node>/workspace/`(不写死节点名,节点改名后仍成立),也可用 `AGC_AGENT_ROOT` 显式覆盖;禁止指向开发 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``CARGO_BUILD_JOBS`。渠道参数是基础名(不含系统,默认 `dev`),脚本不接受 `dev-mac` 这类系统后缀,写入分区固定推导为 `<channel>-mac`:这与 Windows Job 的 `<channel>-win` 对称,也延续已发布客户端的端点。
@@ -738,7 +738,16 @@ Job 名为 `Genarrative-Agc-MacOS-Build`SCM 直接读取仓库内上述 Jenki
产物边界:macOS 代码签名与公证暂缺,构建通过剥离 `APPLE_*` 凭据让 Tauri 跳过 Apple 签名,**不得使用 `--no-sign`**——该标志会连带跳过 updater 的 minisign 签名,产物缺少 `.sig` 会直接卡在验签门禁(首次实跑即命中该坑)。构建清单按 `codesign -dv` 实测记录 `appleSigned` / `appleSignatureKind`(如 `adhoc`),并固定记录 `notarized=false`。用户首次安装需要在 Gatekeeper 中手动放行;更新包校验本身只依赖 minisign 签名,因此未签名不阻断自动更新的校验环节,但「安装 → 重启接管新版本」的实机闭环仍未验证,不得以构建成功替代。
Job 描述与节点描述是 Jenkins 侧元数据,**不随仓库同步**:Jenkinsfile 只回写参数定义,描述必须手工维护,否则会停留在建 Job 时的口径(2026-09-20 就出现过描述还写着「只构建归档、不签名不上传」,而实际已经是含签名、分区清单、验签与 OSS 上传的发布管线)。当前口径:Job 描述说明「构建 arm64 单架构 → arm64 smoke → DMG → `<channel>-mac` 分区清单(只登记 `darwin-aarch64`)→ 更新包验签 → 按 dry-run 决定上传,未做 Apple 签名与公证」;节点描述说明「`genarrative-agc-macos`、EXCLUSIVE 单 executor、仅手动触发、独立 workspace、sccache 在 HOME」。维护手法:该 Job 上 `POST job/<name>/config.xml` 会返回 500,节点侧同接口正常;因此改 Job 描述用脚本接口原地更新(保留构建历史),不要为了改描述删 Job 重建。
Job 描述与节点描述是 Jenkins 侧元数据,**不随仓库同步**:Jenkinsfile 只回写参数定义,描述必须手工维护,否则会停留在建 Job 时的口径(2026-09-20 就出现过描述还写着「只构建归档、不签名不上传」,而实际已经是含签名、分区清单、验签与 OSS 上传的发布管线)。当前口径2026-09-21 起)——Job 描述保持原有写法,只把事实改对(调度器自动触发、dry-run 默认关、arm64 单架构):
```text
AGC macOS 发布管线(每小时由调度器自动触发;AGC_RELEASE_DRY_RUN 默认关闭,即直接发布)。1) 构建 arm64 单架构包(清单只登记 darwin-aarch64Intel 暂不支持);2) arm64 隔离 smokeCodex 资源、SHA-256、执行位、app-server 握手、缺组件拒绝);3) 生成 arm64 DMG4) 生成 channel-mac 分区清单 latest.json;5) 用产物内烘焙公钥复核更新包 minisign 签名,验不过绝不写 OSS;6) dry-run 只打印上传计划,取消勾选才真正上传。
未做 Apple 代码签名与公证:产物为 adhoc 且未公证,首装需在 Gatekeeper 手动放行。专用节点 label genarrative-agc-macosEXCLUSIVE 单 executor)。
```
节点描述照原文改一处即可:把「仅手动触发」换成「构建由调度器每小时自动触发(手点只用于排障)」,其余不动。
维护手法:该 Job 上 `POST job/<name>/config.xml` 会返回 500,节点侧同接口正常;因此改 Job 描述用脚本接口原地更新(保留构建历史),不要为了改描述删 Job 重建;节点描述走节点侧接口。**注意本段文字不随 Jenkinsfile 下发**——每次改口径(例如 2026-09-21 从 universal 切到 arm64 单架构)都必须顺手把 Jenkins 上这两处描述改掉,否则描述会停留在旧口径;仓库只保证这一段是当前真相。
该 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 参数(默认 `8`,吃满节点)。该值不只是并行 crate 数——cargo 会把它作为 jobserver 令牌上限传给 rustc,主 crate 的 codegen 也受它限制,因此写小会直接拖长整条构建;节点只有 24 GB 内存且是日常办公机,若构建期间出现明显换页再临时调低。首次构建 sccache 必然全未命中(实测 0 命中 / 407 未命中),此后的构建才逐步吃到缓存。节点未安装 sccache 时管线打印提示并回退到真实 `rustc`,不阻断构建。单架构发布后依赖 crate 的复用更彻底(此前每次要编 aarch64 与 x86_64 两遍);命中情况由构建末尾的 `sccache --show-stats` 输出,供判断是否需要预热或调整缓存上限。工作区 `target/` 目录跨构建保留(Checkout 只跑 `git clean -fd`,不动 ignored 目录),因此仓库内 path 依赖之外的 crate 只编一次。