合并 master:DirectProject 回合三态与 AGC release 每日调度
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
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

- 合并 origin/master 11 个提交(DirectProject 回合三态与投影 memo、宿主崩掉后的回合收口、权限拒绝后的忙态、策划对话布局修复、AGC release 每日调度)。
- 本次自动合并无冲突;游戏分发发布入口(App 的 requestGamePublish、DirectProjectChatView 透传、聊天头「发布到游戏广场」按钮)在新聊天状态机下保持接线。
- 验证:root / AGC / admin-web 三端 typecheck、全量 vitest、游戏分发 Rust 测试、encoding、doc-index、rustfmt 与 SpacetimeDB schema guard。
This commit is contained in:
2026-09-22 16:49:34 +08:00
31 changed files with 1542 additions and 99 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)",