From f947807fbaf4d9135f683604b0621e0c06583ec4 Mon Sep 17 00:00:00 2001 From: kdletters Date: Mon, 21 Sep 2026 08:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=8B=E5=8A=A8=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E7=9A=84=E5=8F=91=E5=8F=B7=20Job=20Copy=20Artifact=20?= =?UTF-8?q?=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发号 Job 的 copyArtifactPermission 补齐手动发布消费者,用户触发的构建不再报 Unable to find project for artifact copy - 同步总版本号技术方案与共享记忆排障记录,写明 SYSTEM 定时构建短路、用户触发按认证用户判权的差异与回写 Job property 的步骤 --- docs/project-memory/shared-memory/pitfalls.md | 4 ++++ .../【技术方案】AGC总版本号与发号-2026-09-20.md | 1 + jenkins/Jenkinsfile.agc-global-version-issue | 14 ++++++++------ scripts/check-production-ops-guardrails.mjs | 8 +++++++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index 4136d4b7b..65f1c62e0 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,9 @@ # 踩坑与排障记录 +## copyArtifacts 报「Unable to find project for artifact copy」的用户触发构建差异 + +Copy Artifact 插件在**非 SYSTEM 认证**下按「认证用户」判权:只有当被复制 Job 的 `CopyArtifactPermissionProperty`(仓库里由 Declarative 的 `copyArtifactPermission(...)` 维护)显式列出当前消费者,或者该 Job 对认证用户开放 Item.Read 时才放行;`ACL.SYSTEM2` 的定时构建会短路通过。因此会出现「定时调度一路成功、手动发布必挂」的现象(2026-09-21 手动发布 #6/#7 与同期的用户触发探测全部命中,定时调度 #104+ 正常)。`Genarrative-Agc-Global-Version-Issue` 生产权限模式的授权名单必须同时包含 `Genarrative-Scheduled-Revision-Trigger` 与 `Genarrative-Manual-Build-And-Deploy`;改完 `copyArtifactPermission` 后要先跑一次发号 Job 把 Job property 写回 Jenkins,只改仓库文件不生效。 + ## Jenkins Windows 节点的 PATH 白名单决定 Godot 原生扩展能否构建 `Genarrative-Agc-Windows-Build` 在阶段里用 `AGC_WINDOWS_PATH` 整体替换 PATH、不继承节点机器的 PATH,所以 Godot C++ 引导需要的 CMake 与 Python 必须显式写进这份白名单,装在机器 PATH 上并不生效。2026-09-21 的 #97–#99 连续失败都停在 `Get-Command cmake.exe`(#93–#96 是更早的手写 C ABI 在 MSVC C 模式下的对齐问题):节点只有 Visual Studio Build Tools(`C:\BuildTools`)自带的 CMake 3.31,缺 Python 3。修复后白名单包含 `C:\BuildTools\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin`、`C:\Python312`、`C:\Python312\Scripts`,preflight 校验 CMake ≥3.25、Python 3 和 Visual Studio 17 2022 生成器;把 `cmake.exe` 单独复制到别的目录会丢掉 `share/cmake-*/Modules`,不能替代加入安装目录。新节点的 Python 用 `python-3.12.10-amd64.exe /quiet InstallAllUsers=1 TargetDir=C:\Python312 PrependPath=1 Include_launcher=1 InstallLauncherAllUsers=1` 静默安装即可,CMake 不必另装。 diff --git a/docs/technical/【技术方案】AGC总版本号与发号-2026-09-20.md b/docs/technical/【技术方案】AGC总版本号与发号-2026-09-20.md index 00afd641a..fad9d5cef 100644 --- a/docs/technical/【技术方案】AGC总版本号与发号-2026-09-20.md +++ b/docs/technical/【技术方案】AGC总版本号与发号-2026-09-20.md @@ -40,6 +40,7 @@ AGC 客户端此前按「渠道各自比高水位自增」发号:`dev-win` 与 - 发号入口:`apps/ai-game-creator-shell/scripts/issue-global-version.mjs`(CI 与本地共用,输出固定为 `AGC_GLOBAL_VERSION=`)。 - 构建侧:`build-release.mjs` 的 `prepareReleaseVersion()` 优先采用传入总号,未传入时现场发号;`resolveRemoteHighWaterVersion()` 降级为断言来源,只用于「请求号低于本渠道清单版本即失败关闭」。 - CI:`jenkins/Jenkinsfile.agc-global-version-issue` + `jenkins/agc-global-version-issue-job-config.xml`;调度管线 `jenkins/Jenkinsfile.scheduled-revision-trigger` 与手动管线先调发号 Job,再把号透传给 AGC Build。 +- 发号 Job 的 Copy Artifact 采用生产权限模式,`options` 里的 `copyArtifactPermission(...)` 必须显式列出**全部**消费者:定时调度 `Genarrative-Scheduled-Revision-Trigger` 与手动发布 `Genarrative-Manual-Build-And-Deploy`。用户触发的构建按「认证用户」判权(SYSTEM 定时构建短路放行),漏列时手动发布会报 `Unable to find project for artifact copy: Genarrative-Agc-Global-Version-Issue`,且失败点在发号之后。改完该 `options` 后必须先单独跑一次发号 Job,让 Declarative Pipeline 把 Job property 写回 Jenkins。 ## 不改的东西 diff --git a/jenkins/Jenkinsfile.agc-global-version-issue b/jenkins/Jenkinsfile.agc-global-version-issue index b36fa6d19..824394f7c 100644 --- a/jenkins/Jenkinsfile.agc-global-version-issue +++ b/jenkins/Jenkinsfile.agc-global-version-issue @@ -16,12 +16,14 @@ pipeline { skipDefaultCheckout(true) buildDiscarder(logRotator(numToKeepStr: '100', artifactNumToKeepStr: '20')) // Copy Artifact 保持 Production 权限模式:生产者必须显式授权消费者。 - // 调度管线要 copy 本 Job 的 agc-global-version.txt 才能把总号透传给渠道构建; - // 缺这条授权时 copyArtifacts 会报「Unable to find project for artifact copy」, - // 整轮调度失败,且失败点在发号之后 —— 号已烧、Windows 也没被触发 - // (2026-09-20 首次统一发号 #103 即命中)。改完本文件后必须先单独跑一次本 Job, - // 让 Declarative Pipeline 把 Job property 写回 Jenkins,再重跑调度。 - copyArtifactPermission('Genarrative-Scheduled-Revision-Trigger') + // 调度管线与手动发布管线都要 copy 本 Job 的 agc-global-version.txt 才能把总号 + // 透传给渠道构建;缺授权时 copyArtifacts 会报「Unable to find project for + // artifact copy」(用户触发的构建按「认证用户」判权,SYSTEM 定时构建会短路放行, + // 所以定时调度能过、手动发布必挂;2026-09-20 #103 与 2026-09-21 手动发布 + // #6/#7 均命中)。这里必须同时列出两条消费者:Genarrative-Scheduled-Revision-Trigger + // 与 Genarrative-Manual-Build-And-Deploy。改完本文件后必须先单独跑一次本 Job, + // 让 Declarative Pipeline 把 Job property 写回 Jenkins,再重跑调度或手动发布。 + copyArtifactPermission('Genarrative-Scheduled-Revision-Trigger,Genarrative-Manual-Build-And-Deploy') } environment { diff --git a/scripts/check-production-ops-guardrails.mjs b/scripts/check-production-ops-guardrails.mjs index 442768df5..25efdcf94 100644 --- a/scripts/check-production-ops-guardrails.mjs +++ b/scripts/check-production-ops-guardrails.mjs @@ -45,10 +45,16 @@ const checks = [ { file: 'jenkins/Jenkinsfile.agc-global-version-issue', includes: - "copyArtifactPermission('Genarrative-Scheduled-Revision-Trigger')", + "copyArtifactPermission('Genarrative-Scheduled-Revision-Trigger,", reason: 'Copy Artifact Production 模式下,AGC 发号 Job 必须显式授权调度管线读取 agc-global-version.txt,否则整轮调度会在 copyArtifacts 处失败。', }, + { + file: 'jenkins/Jenkinsfile.agc-global-version-issue', + includes: "Genarrative-Manual-Build-And-Deploy')", + reason: + 'Copy Artifact Production 模式下,AGC 发号 Job 还必须授权手动发布管线读取总号,否则用户触发的手动发布会停在 copyArtifacts(SYSTEM 定时构建不受影响)。', + }, { file: 'jenkins/Jenkinsfile.production-stdb-module-build', includes: 'npm run check:rustfmt',