Skip to content

Commit 3bd26cd

Browse files
committed
ci: 修复 e2e 演示脚本数据面 token 化遗漏 + 新 clippy result-large-err lint
e2e job(g1 / gray 在 CI bash -e 下暴露): - g1-policy-demo.sh §3/§4:共享引用改用 shared-ref-rework 后模型 (旧 group 字段 + POST /shared/refs 端点已移除→ 恒 404/422,本地无 -e 时静默假过); 现为:扁平共享项 + 结构 shared:true 标记 + 分支 shared_bindings + 绑定发布, 并补「manual materialize」断言(下次分支发布读到新共享值 60); - gray-demo.sh:snapshot/watch 数据面端点需数据面 token(管理会话不适用), 从启动日志提取 dev token(DP_AUTH)注入 5 处数据面调用; - dev-single-demo.sh watch 段同源问题已于上提交修复,本地 3/3 稳定。 lint job:CI stable clippy(1.98 新增 result-large-err)命中 dsh-raft http_network RPCError 返回类型(体积由 openraft trait 契约固定)→ 显式豁免(装箱改签名波及调用点, 风险高于 lint 门禁)。 本地验证:fmt/clippy(0 errors)/deny/contract 全过;cargo test 35 套件 0 失败; g1/gray/gray-obs/cluster/seed/chaos/dev-single-demo/api-surface 全部通过。
1 parent 5d149dc commit 3bd26cd

3 files changed

Lines changed: 29 additions & 8 deletions

File tree

‎scripts/g1-policy-demo.sh‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,28 @@ assert r.get('warnings'), 'warn 模式应带 warnings: %s' % r
3939
" && echo " warn 放行 + warnings 明细 OK"
4040

4141
echo "== 3. --shared-cascade manual:共享发布不级联引用分支 =="
42-
J -X POST $BASE/api/v1/shared -d '{"group":"lib","key":"timeout","type":"int","value":{"type":"int","int_value":30}}' >/dev/null
42+
# 共享引用(shared-ref-rework 后模型):结构 shared 标记 + 分支 shared_bindings(旧 group/refs 端点已移除)
43+
J -X POST $BASE/api/v1/shared -d '{"key":"timeout","type":"int","description":"全局超时","value":{"type":"int","int_value":30}}' >/dev/null
4344
J -X POST $BASE/api/v1/shared/publish -d '{"comment":"v1","request_id":"sp1"}' >/dev/null
44-
J -X POST $BASE/api/v1/shared/refs -d '{"project":"g1","group":"redis","item_key":"port","shared_group":"lib","shared_key":"timeout"}' >/dev/null
45+
J -X PUT $BASE/api/v1/projects/g1/structure-draft -d '{"base_version":2,"groups":[{"name":"redis","items":[{"key":"host","type":"string","required":true},{"key":"port","type":"int","shared":true}]}]}' >/dev/null
46+
J -X POST $BASE/api/v1/projects/g1/structure-draft/publish -d '{"comment":"shared ref","request_id":"sr1"}' >/dev/null
47+
J -X PUT $BASE/api/v1/projects/g1/branches/dev/draft -d '{"updates":[{"group":"redis","key":"host","value":{"type":"string","str_value":"10.0.0.1"}}],"shared_bindings":[{"group":"redis","key":"port","shared_key":"timeout"}]}' >/dev/null
48+
J -X POST $BASE/api/v1/projects/g1/branches/dev/publish -d '{"comment":"bind","request_id":"pb1"}' >/dev/null
4549
BEFORE=$(J $BASE/api/v1/projects/g1/branches/dev | python3 -c "import json,sys; print(json.load(sys.stdin)['active_version'])")
46-
J -X POST $BASE/api/v1/shared -d '{"group":"lib","key":"timeout","type":"int","value":{"type":"int","int_value":60}}' >/dev/null
50+
J -X POST $BASE/api/v1/shared -d '{"key":"timeout","type":"int","description":"全局超时","value":{"type":"int","int_value":60}}' >/dev/null
4751
J -X POST $BASE/api/v1/shared/publish -d '{"comment":"v2","request_id":"sp2"}' >/dev/null
4852
AFTER=$(J $BASE/api/v1/projects/g1/branches/dev | python3 -c "import json,sys; print(json.load(sys.stdin)['active_version'])")
4953
[ "$BEFORE" = "$AFTER" ] && echo " manual: shared publish does NOT cascade (branch stays v$AFTER) OK" || { echo " FAIL: branch was cascaded"; exit 1; }
5054

5155
echo "== 4. manual materialize: next publish reads new shared value 60 =="
56+
# 共享发布不自动级联,但分支下次显式发布会物化新共享值
57+
J -X PUT $BASE/api/v1/projects/g1/branches/dev/draft -d '{"updates":[{"group":"redis","key":"host","value":{"type":"string","str_value":"10.0.0.2"}}]}' >/dev/null
58+
J -X POST $BASE/api/v1/projects/g1/branches/dev/publish -d '{"comment":"next","request_id":"pb2"}' >/dev/null
59+
curl -sf -H "$AUTH" "$BASE/v1/projects/g1/branches/dev/config?format=json" | python3 -c "
60+
import json,sys
61+
d=json.load(sys.stdin)
62+
assert d['redis']['port']==60, d['redis']
63+
" && echo " manual materialize OK(下次发布读到 port=60)"
5264
echo "== 5. --read-mode linear:读正常(dev-single 恒满足)=="
5365
curl -sf $BASE/v1/projects/g1/branches/dev/snapshot >/dev/null && echo " linear 读 OK"
5466
J "$BASE/api/v1/projects/g1/diff?branch_a=dev&branch_b=test" >/dev/null && echo " diff 读 OK"

‎scripts/gray-demo.sh‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ done
1919
curl -sf $BASE/healthz >/dev/null && echo " healthz OK" || { echo " healthz FAIL"; cat /tmp/dsh-gray.log; exit 1; }
2020
TOKEN=$(curl -sf -X POST $BASE/api/v1/login -H 'Content-Type: application/json' -d '{"password":"admin123"}' | python3 -c "import json,sys; print(json.load(sys.stdin)['token'])")
2121
AUTH="Authorization: Bearer $TOKEN"
22+
# 数据面端点(/v1/...,含 snapshot/watch)需数据面 token(数据面 token 化后,管理会话不适用)
23+
DEV_TOKEN=$(sed -n 's/.*开发数据面 token = \([a-f0-9]*\).*/\1/p' /tmp/dsh-gray.log)
24+
[ -n "$DEV_TOKEN" ] || { echo " dev token 未打印"; cat /tmp/dsh-gray.log; exit 1; }
25+
DP_AUTH="Authorization: Bearer $DEV_TOKEN"
2226
echo " admin login ok"
2327

2428
echo "== 1. 创建项目 + 结构(redis.host 必填)=="
@@ -49,27 +53,27 @@ curl -sf -H "$AUTH" $BASE/api/v1/projects/order-service/branches/dev/gray-status
4953

5054
echo "== 4. 数据面三路解析(HTTP snapshot 带身份头)=="
5155
echo "--- 华北(X-Dsh-Labels: zone=cn-north-1)→ 应返回 gray-host + gray=true:"
52-
curl -sf $BASE/v1/projects/order-service/branches/dev/snapshot \
56+
curl -sf -H "$DP_AUTH" $BASE/v1/projects/order-service/branches/dev/snapshot \
5357
-H 'X-Dsh-Instance: web-1' -H 'X-Dsh-Labels: zone=cn-north-1,svc=checkout' | tee /tmp/gray-north.json
5458
echo
5559
grep -q '"gray-host"' /tmp/gray-north.json && grep -q '"gray":true' /tmp/gray-north.json \
5660
&& echo " 华北命中灰度 ✅" || { echo " FAIL: 华北应读灰度"; exit 1; }
5761

5862
echo "--- 华南(zone=cn-south-1)→ 应返回 stable-host + gray=false:"
59-
curl -sf $BASE/v1/projects/order-service/branches/dev/snapshot \
63+
curl -sf -H "$DP_AUTH" $BASE/v1/projects/order-service/branches/dev/snapshot \
6064
-H 'X-Dsh-Instance: web-2' -H 'X-Dsh-Labels: zone=cn-south-1' | tee /tmp/gray-south.json
6165
echo
6266
grep -q '"stable-host"' /tmp/gray-south.json && grep -q '"gray":false' /tmp/gray-south.json \
6367
&& echo " 华南未命中 ✅" || { echo " FAIL: 华南应读稳定"; exit 1; }
6468

6569
echo "--- 无身份(旧客户端)→ 应返回 stable-host + gray=false(Q2):"
66-
curl -sf $BASE/v1/projects/order-service/branches/dev/snapshot | tee /tmp/gray-noid.json
70+
curl -sf -H "$DP_AUTH" $BASE/v1/projects/order-service/branches/dev/snapshot | tee /tmp/gray-noid.json
6771
echo
6872
grep -q '"stable-host"' /tmp/gray-noid.json && grep -q '"gray":false' /tmp/gray-noid.json \
6973
&& echo " 无身份不进灰度 ✅" || { echo " FAIL: 无身份应读稳定"; exit 1; }
7074

7175
echo "== 5. watch:灰度转正补发事件(gray=true,version ≤ 客户端 last 仍投递,Q4)=="
72-
curl -sN $BASE/v1/projects/order-service/branches/dev/watch >/tmp/gray-watch.out 2>/dev/null &
76+
curl -sN -H "$DP_AUTH" $BASE/v1/projects/order-service/branches/dev/watch >/tmp/gray-watch.out 2>/dev/null &
7377
WPID=$!
7478
sleep 0.5
7579
curl -sf -H "$AUTH" -X POST $BASE/api/v1/projects/order-service/branches/dev/gray-promote -H 'Content-Type: application/json' -d '{"comment":"全量","request_id":"pr-1"}' >/dev/null
@@ -80,7 +84,7 @@ grep -q '"gray":true' /tmp/gray-watch.out && echo " promote 补发事件 gray=t
8084

8185
echo "== 6. 转正后全量客户端读新稳定版(gray=false)=="
8286
curl -sf -H "$AUTH" $BASE/api/v1/projects/order-service/branches/dev/gray-status | python3 -m json.tool
83-
curl -sf $BASE/v1/projects/order-service/branches/dev/snapshot -H 'X-Dsh-Instance: web-1' -H 'X-Dsh-Labels: zone=cn-north-1' | tee /tmp/gray-promoted.json
87+
curl -sf -H "$DP_AUTH" $BASE/v1/projects/order-service/branches/dev/snapshot -H 'X-Dsh-Instance: web-1' -H 'X-Dsh-Labels: zone=cn-north-1' | tee /tmp/gray-promoted.json
8488
echo
8589
grep -q '"gray-host"' /tmp/gray-promoted.json && grep -q '"gray":false' /tmp/gray-promoted.json \
8690
&& echo " 转正后全量读到 gray-host(灰度内容成为稳定版)✅" || { echo " FAIL"; exit 1; }

‎server/crates/dsh-raft/src/http_network.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ pub struct HttpNetwork {
2727
}
2828

2929
impl HttpNetwork {
30+
// 返回类型 RPCError<NodeId, NodeInfo, …> 由 openraft RaftNetwork trait 契约固定(体积大);
31+
// 装箱会改签名/波及调用点,显式豁免 result-large-err(CI stable clippy 1.98 新增 lint)。
32+
#[allow(clippy::result_large_err)]
3033
async fn post<T: serde::Serialize, R: DeserializeOwned>(
3134
&self,
3235
path: &str,
@@ -55,6 +58,8 @@ impl HttpNetwork {
5558
/// 占位错误类型(RPCError 的 E 参数;实际错误以 Network 变体返回)。
5659
pub type RaftErrorPlaceholder = openraft::error::RaftError<NodeId>;
5760

61+
// result-large-err:RPCError 体积由 openraft trait 契约决定,豁免(同上)。
62+
#[allow(clippy::result_large_err)]
5863
impl RaftNetwork<TypeConfig> for HttpNetwork {
5964
async fn append_entries(
6065
&mut self,

0 commit comments

Comments
 (0)