From 65b7ae0e2bb76c2d153c5211c0540ff99ef80b90 Mon Sep 17 00:00:00 2001 From: suzmii Date: Mon, 21 Sep 2026 00:48:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3Mac=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E7=9A=84=E4=B8=AA=E4=BA=BA=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E3=80=81=E8=B6=85=E6=97=B6=E4=BD=99=E9=87=8F=E4=B8=8E=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=96=87=E6=A1=A3=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jenkinsfile的PATH改为按$HOME展开,移除写死的节点用户名 构建超时90分钟提高到150分钟并补失败/中断诊断,避免冷构建被中断在链接阶段 同步更新检查技术方案里dry-run默认值与调度接入的过期描述 新增回归断言:禁止个人Home路径、锁定超时余量与诊断文案 --- .../scripts/prepare-macos-codex.test.mjs | 17 ++++++++++++++++ ...方案】AGC客户端更新检查与下载-2026-08-31.md | 4 ++-- ...kinsfile.ai-game-creator-shell-macos-build | 20 +++++++++++++++---- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs b/apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs index a0e46875b..4caae3656 100644 --- a/apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs +++ b/apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs @@ -101,6 +101,23 @@ test('CI pipeline is manual, publishes the macOS partition and never reuses a de pipeline, /booleanParam\(name: 'SKIP_IF_SUPERSEDED', defaultValue: false/u, ); + // 仓库文件不得出现节点用户名/个人 Home 路径:换机或改名后必须仍然可用。 + assert.ok( + !pipeline.includes('/Users/'), + 'Jenkinsfile 不得写死个人 Home 路径,工具链位置应按 $HOME 展开', + ); + assert.ok( + pipeline.includes('export PATH="$HOME/'), + 'PATH 必须在 shell 步骤里按 $HOME 展开', + ); + // 超时必须高于实测最慢(78 分钟冷构建 + 共用机器),否则会被中断在链接阶段。 + assert.ok( + pipeline.includes('timeout(time: 150'), + '构建超时上限必须留出冷构建余量', + ); + for (const diagnostic of ['macOS 发布失败', '被中断']) { + assert.ok(pipeline.includes(diagnostic), diagnostic); + } assert.ok( pipeline.includes('.jenkins-superseded-by'), '必须记录被推进的标记供后续阶段判定', diff --git a/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md b/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md index 6ec06d077..058cc2371 100644 --- a/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md +++ b/docs/technical/【技术方案】AGC客户端更新检查与下载-2026-08-31.md @@ -171,11 +171,11 @@ - macOS 采用 universal 包,两个平台键对应同一更新产物;主程序用 lipo 检查两种架构,Codex 资源分别做原生身份/摘要与启动验证。Rosetta 结果不代替 Intel 真机验收。 - 旧客户端迁移桥:保留一个版本周期。渠道清单上线后,发布管线同时把旧的 `agc/latest.json`(sha256 格式)指向 `dev-win` 最新安装包,让已发布客户端自动升级到新协议;下个周期整条删除。 - 签名密钥:由本仓库维护者生成并保管,私钥保存在仓库外(`%USERPROFILE%\.tauri\genarrative-agc-updater.key`),只有公钥进入客户端配置;Jenkins 用受保护凭据 `AgcUpdaterSigningKey` 与 `AgcUpdaterSigningKeyPassword` 注入为 Tauri 打包器读取的 `TAURI_SIGNING_PRIVATE_KEY` 与 `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`,本机可用 `TAURI_SIGNING_PRIVATE_KEY_PATH` 指向同一私钥。当前密钥不带密码;首次发布前仍可重新生成,首次发布后不可更换。 -- macOS 发布方式:已接入专用 macOS Jenkins 节点(label `genarrative-agc-macos`,EXCLUSIVE 单 executor),由 `Jenkinsfile.ai-game-creator-shell-macos-build` 执行 `scripts/build-macos-ci.mjs` 完成 universal 构建、双架构隔离 smoke、universal DMG、分区清单生成、更新包验签与 OSS 上传。`AGC_RELEASE_DRY_RUN` 默认为开,只有显式关闭才会写入 OSS。 +- macOS 发布方式:已接入专用 macOS Jenkins 节点(label `genarrative-agc-macos`,EXCLUSIVE 单 executor),由 `Jenkinsfile.ai-game-creator-shell-macos-build` 执行 `scripts/build-macos-ci.mjs` 完成 universal 构建、双架构隔离 smoke、universal DMG、分区清单生成、更新包验签与 OSS 上传。`AGC_RELEASE_DRY_RUN` 默认为关(与 Windows 渠道对称,即直接发布),只有勾选后才退化为「只打印上传计划、不写 OSS」的演练。 - macOS 代码签名与公证暂缺:产物为未签名 + 未公证,构建入口剥离 `APPLE_*` 凭据跳过 Apple 签名,不传 `--no-sign`(它还会跳过 updater 的 minisign 签名,产物将没有 `.sig`);构建清单实测记录 `appleSigned` 与签名类型,`latest.json` 侧固定记录 `notarized=false`,首装需用户在 Gatekeeper 中手动放行。该限制作为已知未验证项记录,不静默通过;「安装 → 重启接管新版本」的自动更新闭环仍需实机验收。 - 更新包验签门禁:构建完成、上传 OSS 之前,用产物内烘焙的 `plugins.updater.pubkey` 复核 `<更新包>.sig`(Tauri 使用 minisign 的 `ED` 预哈希模式)。keyId 不一致或校验失败立即失败关闭,禁止上传——客户端校验失败会直接拒绝安装,且公钥发布后不可更换。 待办: -- macOS 分区(`-mac`)已落地构建与发布能力:Mac Jenkins 节点、release 入口(更新包 + 签名 + 首装包 + 分区清单)、验签门禁与 dry-run 默认开启均已就绪。 +- macOS 分区(`-mac`)已落地构建与发布能力:Mac Jenkins 节点、release 入口(更新包 + 签名 + 首装包 + 分区清单)、验签门禁与调度接入均已就绪,默认直接发布。 - 剩余待办:Apple 代码签名与公证凭据(未就绪期间以未验证项记录)、macOS 安装后重启接管新版本的实机验证、Intel 真机 smoke(当前 x86_64 侧为 Rosetta)。 diff --git a/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build b/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build index 4744d0d64..91bcfdc97 100644 --- a/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build +++ b/jenkins/Jenkinsfile.ai-game-creator-shell-macos-build @@ -3,7 +3,9 @@ pipeline { options { disableConcurrentBuilds() skipDefaultCheckout(true) - timeout(time: 90, unit: 'MINUTES') + // 实测参考:合并主线后的双架构构建 68.5 分钟、更早一次 78 分钟;节点是共用办公机, + // 冷 sccache + 机器被占用时会更慢,因此上限放到 150 分钟而不是贴着观测值。 + timeout(time: 150, unit: 'MINUTES') buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '3')) timestamps() } @@ -30,7 +32,8 @@ pipeline { RUSTC_WRAPPER = 'sccache' SCCACHE_CACHE_SIZE = '20G' CARGO_INCREMENTAL = '0' - PATH = '/Users/suzmii/.local/bin:/Users/suzmii/.cargo/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin' + // 不把节点用户名写进仓库:PATH 在下面的 shell 步骤里按 $HOME 展开。 + AGC_EXTRA_PATH = '/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin' } stages { stage('Checkout') { @@ -102,6 +105,8 @@ pipeline { steps { sh ''' set -eu + # LaunchAgent 只给最小 PATH:按 $HOME 展开工具链位置,不把节点用户名写进仓库。 + export PATH="$HOME/.local/bin:$HOME/.cargo/bin:${AGC_EXTRA_PATH}" test "$(uname -m)" = arm64 node --version npm --version @@ -136,8 +141,9 @@ pipeline { "AGC_UPDATE_RELEASE_NOTES=${params.AGC_UPDATE_RELEASE_NOTES}", ]) { sh ''' - set -eu - echo "[agc-macos] 渠道=${AGC_UPDATE_CHANNEL} 分区=${AGC_UPDATE_CHANNEL}-mac 目标=universal-apple-darwin dry-run=${AGC_RELEASE_DRY_RUN}" + set -eu + export PATH="$HOME/.local/bin:$HOME/.cargo/bin:${AGC_EXTRA_PATH}" + echo "[agc-macos] 渠道=${AGC_UPDATE_CHANNEL} 分区=${AGC_UPDATE_CHANNEL}-mac 目标=universal-apple-darwin dry-run=${AGC_RELEASE_DRY_RUN}" ossutil_bin="${OSSUTIL_BIN:-ossutil}" if command -v "${ossutil_bin}" >/dev/null 2>&1; then "${ossutil_bin}" --version | head -1 @@ -180,6 +186,12 @@ pipeline { } } post { + failure { + echo 'macOS 发布失败:先看本构建控制台末尾。常见原因——更新包缺 .sig(误传 --no-sign 或签名私钥未注入)、DMG 幂等失败(workspace 残留同名产物)、可用空间低于 8 GiB、以及被 SKIP_IF_SUPERSEDED 之外的提交校验拒绝。' + } + aborted { + echo 'macOS 发布被中断(超时或人工中止):构建未走到归档阶段时不会有任何产物,也不会写 OSS。' + } success { echo params.AGC_RELEASE_DRY_RUN ? 'macOS universal 渠道演练完成:已构建、验签并生成清单,未写入 OSS;Apple 签名与公证暂缺。'