发布灰度默认关闭:修掉客户端“看得到点不动”与后台看不到 key (#482)
Project CI / AI game creator shell Rust crates (push) Successful in 1m28s
Project CI / AI game creator shell Rust smoke (push) Successful in 2m2s
Project CI / Backend tests (push) Successful in 5m19s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 6m59s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 8m19s
Project CI / Native shell tests (push) Successful in 6m48s
Project CI / Frontend tests (push) Successful in 2m54s
Project CI / Repository checks (push) Successful in 2m58s
Project CI / AI game creator shell web tests (push) Successful in 2m34s
Project CI / AI game creator shell Rust crates (push) Successful in 1m28s
Project CI / AI game creator shell Rust smoke (push) Successful in 2m2s
Project CI / Backend tests (push) Successful in 5m19s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 6m59s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 8m19s
Project CI / Native shell tests (push) Successful in 6m48s
Project CI / Frontend tests (push) Successful in 2m54s
Project CI / Repository checks (push) Successful in 2m58s
Project CI / AI game creator shell web tests (push) Successful in 2m34s
## 解决什么 你反馈的两个现象都是真问题,这个 PR 一次修掉: 1. **没开灰度也能看到发布按钮**:发布开关此前是「无 gate 行 = 默认开放」,所以没配灰度时后端把 `gameDistributionPublishEnabled` 判成 true,客户端就渲染了发布入口。 2. **按钮点了没反应**:发布动作的提示原先只写 `workspaceStatus`,而普通项目走 `DirectProjectChatView` 时并不渲染工作台状态行,于是「先打开一个项目再发布」「构建失败…」这类信息全都看不见。 3. **后台看不到 key**:预设项此前在未合并的另一个 PR 里,而且后台只列「已创建」的 gate 行。 ## 改成什么 - `is_game_distribution_publish_enabled_for_user` 要求 gate 行存在且 `enabled=true`:**灰度默认关闭**,未登录/无行/`enabled=false` 一律不开放;只有白名单 / 灰度比例 / 用户标签命中才开放。作者写入与新版本激活都按这条判据。 - 新增与作者无关的总开关 `is_game_distribution_publish_open`:管理员审核激活新版本只看「灰度是否开启」,不会因为审核员不在作者白名单里而被挡住(这是合入后立刻发现的回归,已修 + 有用例)。 - AGC 新增 `announcePublishMessage`:发布相关提示同时写工作台状态与 DirectProject 对话,点「发布到游戏广场」不会再像没反应。 - 后台「灰度发布配置」新增「可配置开关」列表:`game-distribution:publish` 等预设即使还没创建行也会显示,点「配置」按默认关闭填表,运营开启后填白名单/比例即可放量。 ## 验证 - `npm run check:game-distribution-media-e2e`(真实 Phaser 构建产物)现在覆盖:灰度关闭 → 作者拿不到入口 + 写入口 503 → 开启灰度 → 真实封面/截图直传 → 创建游戏/版本/上传/送审 → 管理员审核通过 → 网关 index.html 与 bundle 200 → nosniff;全流程通过。 - 后端:`cargo test -p api-server game_distribution` 19 passed(含新增 `game_distribution_publish_open_ignores_author_allowlist_for_activation`)、`frontend_runtime_config` 6 passed。 - 前端:admin 灰度页 10 用例(含「未创建的预设开关可见并可一键配置」)、AGC 聊天头 3 用例、网页发布页 15 用例;三端 typecheck、`check:encoding`、`check:doc-index`、`check:rustfmt`、全量 `npm test`(400 文件 / 4441 用例)与 `check:repository-ci -- origin/master HEAD` 全绿。 ## 上线注意 灰度默认关闭是**刻意**的:合入后到运营在后台把 `game-distribution:publish` 配置并开启之前,作者看不到发布入口、写入口 503;已公开游戏、目录、详情、发行网关、安全下架不受影响。 Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/482 Co-authored-by: kdletters <kdletters@qq.com> Co-committed-by: kdletters <kdletters@qq.com>
This commit was merged in pull request #482.
This commit is contained in:
@@ -214,6 +214,78 @@ async function main() {
|
||||
});
|
||||
const another = otherEntry.data.token;
|
||||
|
||||
// 1.1 管理员登录:发布灰度默认关闭,脚本先验证关闭态再为本轮验证开启。
|
||||
const adminLogin = await api('/admin/api/login', {
|
||||
method: 'POST',
|
||||
body: { username: ADMIN_USER, password: ADMIN_PASSWORD },
|
||||
});
|
||||
check(
|
||||
'管理员登录成功',
|
||||
adminLogin.status === 200 &&
|
||||
Boolean(adminLogin.data?.token ?? adminLogin.data?.accessToken),
|
||||
`status=${adminLogin.status}`,
|
||||
);
|
||||
const admin = adminLogin.data?.token ?? adminLogin.data?.accessToken;
|
||||
|
||||
const setPublishGate = (enabled, rolloutPercent) =>
|
||||
api('/admin/api/feature-gates', {
|
||||
method: 'PUT',
|
||||
token: admin,
|
||||
body: {
|
||||
gateKey: 'game-distribution:publish',
|
||||
enabled,
|
||||
rolloutPercent,
|
||||
allowUserIds: [],
|
||||
allowUserTags: [],
|
||||
denyUserIds: [],
|
||||
description: 'E2E 发布灰度',
|
||||
},
|
||||
});
|
||||
|
||||
const gateClosed = await setPublishGate(false, 0);
|
||||
check(
|
||||
'发布灰度可配置为关闭',
|
||||
gateClosed.status === 200,
|
||||
`status=${gateClosed.status}`,
|
||||
);
|
||||
|
||||
const closedAvailability = await api('/api/runtime/frontend-config', {
|
||||
token: author,
|
||||
});
|
||||
check(
|
||||
'灰度关闭时作者拿不到发布入口',
|
||||
closedAvailability.data?.gameDistributionPublishEnabled === false,
|
||||
`value=${closedAvailability.data?.gameDistributionPublishEnabled}`,
|
||||
);
|
||||
|
||||
const closedPublish = await api('/api/game-distribution/games', {
|
||||
method: 'POST',
|
||||
token: author,
|
||||
headers: { 'Idempotency-Key': `e2e-gate-closed-${Date.now()}` },
|
||||
body: gameMetadata({ title: `灰度关闭验证 ${Date.now()}` }),
|
||||
});
|
||||
check(
|
||||
'灰度关闭时写入口 503',
|
||||
closedPublish.status === 503,
|
||||
`status=${closedPublish.status} code=${closedPublish.error?.code ?? ''}`,
|
||||
);
|
||||
|
||||
const gateOpen = await setPublishGate(true, 100);
|
||||
check(
|
||||
'发布灰度可开启并放量',
|
||||
gateOpen.status === 200,
|
||||
`status=${gateOpen.status}`,
|
||||
);
|
||||
|
||||
const openAvailability = await api('/api/runtime/frontend-config', {
|
||||
token: author,
|
||||
});
|
||||
check(
|
||||
'灰度开启后作者拿到发布入口',
|
||||
openAvailability.data?.gameDistributionPublishEnabled === true,
|
||||
`value=${openAvailability.data?.gameDistributionPublishEnabled}`,
|
||||
);
|
||||
|
||||
// 2. 真实素材直传
|
||||
const id = stamp();
|
||||
const cover = await uploadImage(author, 'cover', id);
|
||||
@@ -444,19 +516,7 @@ async function main() {
|
||||
`status=${readBefore.status}`,
|
||||
);
|
||||
|
||||
// 7. 管理员审核通过(本地非生产允许回环 http 入口)
|
||||
const adminLogin = await api('/admin/api/login', {
|
||||
method: 'POST',
|
||||
body: { username: ADMIN_USER, password: ADMIN_PASSWORD },
|
||||
});
|
||||
check(
|
||||
'管理员登录成功',
|
||||
adminLogin.status === 200 &&
|
||||
Boolean(adminLogin.data?.token ?? adminLogin.data?.accessToken),
|
||||
`status=${adminLogin.status}`,
|
||||
);
|
||||
const admin = adminLogin.data?.token ?? adminLogin.data?.accessToken;
|
||||
|
||||
// 7. 管理员审核通过(本地非生产允许回环 http 入口;管理员 token 在步骤 1.1 已取得)
|
||||
const approved = await api(
|
||||
`/admin/api/game-distribution/versions/${versionId}/review`,
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user