合并 master(bba4f0eb2):DirectProject 聊天三态与快照文档并入运行页入口收口
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled

- 只冲突两份共享记忆的尾部追加(pitfalls / decision-log):保留双方新增条目,直接合并非取舍
- App.tsx / styles.css 自动合并通过;本分支的运行页入口收口与 onRunNotice 通道未受影响
This commit is contained in:
2026-09-22 17:08:03 +08:00
38 changed files with 1773 additions and 175 deletions
@@ -54,6 +54,17 @@ const checks = [
reason:
'Copy Artifact Production 模式下,AGC 发号 Job 还必须授权手动发布管线读取总号,否则用户触发的手动发布会停在 copyArtifactsSYSTEM 定时构建不受影响)。',
},
{
file: 'jenkins/Jenkinsfile.agc-global-version-issue',
includes: 'Genarrative-Scheduled-Release-Trigger',
reason:
'Copy Artifact Production 模式下,AGC 发号 Job 必须授权每日 release 调度器读取总号。',
},
{
file: 'jenkins/agc-global-version-issue-job-config.xml',
includes: '<string>release-unified</string>',
reason: 'AGC 发号 Job 配置必须保留 release 调度的统一发号用途标签。',
},
{
file: 'jenkins/Jenkinsfile.production-stdb-module-build',
includes: 'npm run check:rustfmt',
@@ -7733,6 +7744,14 @@ const scheduledRevisionTriggerJobConfig = readFileSync(
'jenkins/scheduled-revision-trigger-job-config.xml',
'utf8',
);
const scheduledReleaseTriggerContent = readFileSync(
'jenkins/Jenkinsfile.scheduled-release-trigger',
'utf8',
);
const scheduledReleaseTriggerJobConfig = readFileSync(
'jenkins/scheduled-release-trigger-job-config.xml',
'utf8',
);
// 定时与版本比较统一收敛到调度管线,两个下游流水线不得再自带触发器。
for (const [file, content] of [
@@ -7883,6 +7902,69 @@ if (
'[check:production-ops] scheduled-revision-trigger Job 必须指向调度 Jenkinsfile、使用本机 Git 入口与既有 SSH 凭据,并把定时器留在 Jenkinsfile。',
);
}
for (const [snippet, reason] of [
["cron('0 4 * * *')", 'release 调度器必须在每天 04:00 检查远端版本'],
['disableConcurrentBuilds()', '必须禁止 release 调度器并发触发'],
['skipDefaultCheckout(true)', 'release 调度器不得依赖本地 SCM 工作区'],
['git ls-remote', 'release 调度器必须直接从远端解析分支版本'],
[
"AGC_WINDOWS_BUILD_JOB_NAME = 'Genarrative-Agc-Windows-Build'",
'必须声明 AGC Windows release 构建目标 Job',
],
[
"AGC_MACOS_BUILD_JOB_NAME = 'Genarrative-Agc-MacOS-Build'",
'必须声明 AGC macOS release 构建目标 Job',
],
[
"string(name: 'AGC_CHANNEL', value: 'release-unified')",
'release 调度器必须先通过发号 Job 获取统一总版本号',
],
[
"string(name: 'AGC_UPDATE_CHANNEL', value: 'release')",
'release 调度器必须把 Windows 与 macOS 都发到 release 分区',
],
[
'build job: env.AGC_WINDOWS_BUILD_JOB_NAME, wait: false, propagate: false, parameters: agcParameters',
'release 调度器必须触发 AGC Windows release 构建',
],
[
'build job: env.AGC_MACOS_BUILD_JOB_NAME, wait: false, propagate: false, parameters: agcMacosParameters',
'release 调度器必须触发 AGC macOS release 构建',
],
[
"booleanParam(name: 'SKIP_IF_SUPERSEDED', value: true)",
'release 调度器必须让 macOS 节点恢复后跳过过期排队构建',
],
]) {
if (!scheduledReleaseTriggerContent.includes(snippet)) {
failed = true;
console.error(`[check:production-ops] release 调度管线${reason}`);
}
}
if (scheduledReleaseTriggerContent.includes('FULL_BUILD_JOB_NAME')) {
failed = true;
console.error(
'[check:production-ops] release 调度管线只负责 AGC release 客户端构建,不得触发 Full Build。',
);
}
if (
!scheduledReleaseTriggerJobConfig.includes(
'<scriptPath>jenkins/Jenkinsfile.scheduled-release-trigger</scriptPath>',
) ||
!scheduledReleaseTriggerJobConfig.includes(
'ssh://git@127.0.0.1:2222/GenarrativeAI/Genarrative.git',
) ||
!scheduledReleaseTriggerJobConfig.includes(
'<credentialsId>genarrative-local-gitea-ssh</credentialsId>',
) ||
!scheduledReleaseTriggerJobConfig.includes('<triggers/>')
) {
failed = true;
console.error(
'[check:production-ops] scheduled-release-trigger Job 必须指向 release 调度 Jenkinsfile、使用本机 Git 入口与既有 SSH 凭据,并把定时器留在 Jenkinsfile。',
);
}
if (
!fullPipelineContent.includes(
"string(name: 'COMMIT_HASH', value: env.SOURCE_COMMIT)",