Merge pull request 'Deliver RDM audit export in the controlled integration window' (#488) from feature/rdm-audit-export-entry into main
This commit was merged in pull request #488.
This commit is contained in:
File diff suppressed because one or more lines are too long
+1
-1
Submodule modules/frontend updated: eb2d6d32f9...5313cfad4e
+46
-16
@@ -16,6 +16,7 @@
|
||||
# RDM_REPO RDM 仓路径(默认 <本仓上级>/Agent-System-RDM)
|
||||
# E2E_API_PORT/E2E_UI_PORT 服务端口(默认 18791/4173)
|
||||
# E2E_OWNER/E2E_PASSWORD 登录账号(默认 e2e-auditor/E2eAudit#2026)
|
||||
# E2E_PASSWORD2 首次登录后的设密结果(默认 E2eAudit#2026b;种子命令用它)
|
||||
# E2E_PROJECT_MAIN/E2E_PROJECT_ISOLATED 项目名(默认 审计演示项目/隔离检查项目)
|
||||
# E2E_OUT 工件目录(默认 .tmp/e2e/<ts>;.gitignore 已覆盖 .tmp)
|
||||
# 依赖:go、node/npm、curl;首次运行会 npx playwright install chromium。
|
||||
@@ -32,6 +33,7 @@ API_PORT=${E2E_API_PORT:-18791}
|
||||
UI_PORT=${E2E_UI_PORT:-4173}
|
||||
OWNER=${E2E_OWNER:-e2e-auditor}
|
||||
PASSWORD=${E2E_PASSWORD:-E2eAudit#2026}
|
||||
PASSWORD2=${E2E_PASSWORD2:-E2eAudit#2026b}
|
||||
PROJ_MAIN=${E2E_PROJECT_MAIN:-审计演示项目}
|
||||
PROJ_ISO=${E2E_PROJECT_ISOLATED:-隔离检查项目}
|
||||
API_BASE="http://127.0.0.1:$API_PORT"
|
||||
@@ -46,7 +48,8 @@ die() { printf '\033[31m[e2e][FAIL]\033[0m %s\n' "$*" >&2; exit 1; }
|
||||
command -v go >/dev/null || die "go not found"
|
||||
command -v node >/dev/null || die "node not found"
|
||||
command -v curl >/dev/null || die "curl not found"
|
||||
[ -d "$RDM_REPO/.git" ] || die "RDM repo not found at $RDM_REPO (set RDM_REPO)"
|
||||
[ "$(git -C "$RDM_REPO" rev-parse --is-inside-work-tree 2>/dev/null)" = true ] \
|
||||
|| die "RDM repo not found at $RDM_REPO (set RDM_REPO)"
|
||||
|
||||
for p in "$API_PORT" "$UI_PORT"; do
|
||||
if timeout 2 bash -c "echo > /dev/tcp/127.0.0.1/$p" 2>/dev/null; then
|
||||
@@ -73,12 +76,12 @@ PIN_SHA_WANT=$(git -C "$RDM_REPO" ls-tree "$RDM_SHA" pins/agent-system-backend |
|
||||
mkdir -p "$RDM_WT/pins"
|
||||
tar -C "$RDM_REPO/pins" --exclude=.git -cf - agent-system-backend | tar -C "$RDM_WT/pins" -xf -
|
||||
cleanup() {
|
||||
[ -n "${API_PID:-}" ] && kill "$API_PID" 2>/dev/null || true
|
||||
# npx→node 的进程树用单 PID 杀不净:按命令行匹配兜底(本脚本专用端口)。
|
||||
[ -n "${UI_PID:-}" ] && kill "$UI_PID" 2>/dev/null || true
|
||||
pkill -f "vite preview --port $UI_PORT" 2>/dev/null || true
|
||||
pkill -f "agent-system-rdm -data.*e2e" 2>/dev/null || true
|
||||
pkill -f "agent-system serve .*$API_PORT" 2>/dev/null || true
|
||||
[ -n "${API_PID:-}" ] && { kill "$API_PID" 2>/dev/null || true; wait "$API_PID" 2>/dev/null || true; }
|
||||
# Preview runs directly as one owned Vite process. Verify its command before
|
||||
# signaling: a recycled PID must never stop another worktree's process.
|
||||
if [ -n "${UI_PID:-}" ] && ps -p "$UI_PID" -o args= 2>/dev/null | rg -Fq -- "vite preview --port $UI_PORT"; then
|
||||
kill "$UI_PID" 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
(cd "$RDM_WT" && go build -o "$OUT/agent-system-rdm" .) || die "rdm build failed"
|
||||
@@ -122,9 +125,25 @@ stop_serve() {
|
||||
[ -n "${API_PID:-}" ] && { kill "$API_PID" 2>/dev/null || true; wait "$API_PID" 2>/dev/null || true; API_PID=""; }
|
||||
}
|
||||
login() {
|
||||
curl -sf -c "$JAR" -X POST "$API_BASE/api/auth/login" \
|
||||
local i
|
||||
for i in $(seq 1 20); do
|
||||
if curl -sf -c "$JAR" -X POST "$API_BASE/api/auth/login" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d "{\"owner\":\"$OWNER\",\"password\":\"$PASSWORD\"}" >/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
sleep 0.25
|
||||
done
|
||||
die "login failed"
|
||||
}
|
||||
# CLI 建号留下 must_change_password。会话在改密前不能调用业务命令。
|
||||
# 强制设密会作废当前会话,所以设密后用新密码再登录。
|
||||
finish_password_gate() {
|
||||
curl -sf -b "$JAR" -c "$JAR" -X POST "$API_BASE/api/auth/password" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d "{\"owner\":\"$OWNER\",\"password\":\"$PASSWORD\"}" >/dev/null || die "login failed"
|
||||
-d "{\"next\":\"$PASSWORD2\"}" >/dev/null || die "password setup failed"
|
||||
PASSWORD=$PASSWORD2
|
||||
login
|
||||
}
|
||||
|
||||
cmd() { # cmd <id> <params-json> → payload(失败即死,种子步骤不容忍部分成功)
|
||||
@@ -139,11 +158,19 @@ cmd() { # cmd <id> <params-json> → payload(失败即死,种子步骤不容
|
||||
start_serve
|
||||
JAR="$OUT/cookies.txt"
|
||||
login
|
||||
finish_password_gate
|
||||
log "seed: create projects"
|
||||
PID_MAIN=$(cmd rdm.project.create "{\"name\":\"$PROJ_MAIN\"}" | python3 -c 'import json,sys; print(json.load(sys.stdin)["projectId"])')
|
||||
PID_ISO=$(cmd rdm.project.create "{\"name\":\"$PROJ_ISO\"}" | python3 -c 'import json,sys; print(json.load(sys.stdin)["projectId"])')
|
||||
log "seed: projects main=$PID_MAIN iso=$PID_ISO"
|
||||
|
||||
# I1 requires a current business grant even for a project creator or system
|
||||
# administrator. Both projects are ordinary test fixtures in this private data root.
|
||||
log "seed: grant explicit audit.read for the fixture owner"
|
||||
cmd rdm.perm.cap '{"action":"audit.read","allow":true}' >/dev/null
|
||||
cmd rdm.perm.set "{\"projectId\":\"$PID_MAIN\",\"member\":\"$OWNER\",\"action\":\"audit.read\",\"allow\":true}" >/dev/null
|
||||
cmd rdm.perm.set "{\"projectId\":\"$PID_ISO\",\"member\":\"$OWNER\",\"action\":\"audit.read\",\"allow\":true}" >/dev/null
|
||||
|
||||
log "seed: import requirement ledger into $PID_MAIN"
|
||||
cmd rdm.reqs.import "{\"projectId\":\"$PID_MAIN\",\"items\":$(
|
||||
python3 - <<'PY'
|
||||
@@ -196,11 +223,12 @@ if [ "$SEED_ONLY" = 1 ]; then
|
||||
fi
|
||||
|
||||
log "start vite preview at http://127.0.0.1:$UI_PORT"
|
||||
(cd "$DEV_ROOT/modules/frontend" && \
|
||||
PLAYWRIGHT_API_TARGET="$API_BASE" npx vite preview --port "$UI_PORT" --strictPort \
|
||||
>"$OUT/preview.log" 2>&1 &
|
||||
echo $! > "$OUT/preview.pid")
|
||||
UI_PID=$(cat "$OUT/preview.pid")
|
||||
(
|
||||
cd "$DEV_ROOT/modules/frontend"
|
||||
export PLAYWRIGHT_API_TARGET="$API_BASE"
|
||||
exec ./node_modules/.bin/vite preview --port "$UI_PORT" --strictPort
|
||||
) >"$OUT/preview.log" 2>&1 &
|
||||
UI_PID=$!
|
||||
for i in $(seq 1 40); do
|
||||
curl -sf -o /dev/null "http://127.0.0.1:$UI_PORT/" && break
|
||||
sleep 0.25
|
||||
@@ -212,10 +240,12 @@ log "playwright (install chromium if missing)"
|
||||
|
||||
log "run specs"
|
||||
cd "$DEV_ROOT/modules/frontend"
|
||||
export PLAYWRIGHT_BASE_URL="http://127.0.0.1:$UI_PORT" E2E_OWNER="$OWNER" E2E_PASSWORD="$PASSWORD" \
|
||||
export PLAYWRIGHT_BASE_URL="http://127.0.0.1:$UI_PORT" E2E_OWNER="$OWNER" \
|
||||
E2E_PASSWORD="${E2E_PASSWORD:-E2eAudit#2026}" E2E_PASSWORD2="$PASSWORD2" \
|
||||
E2E_PROJECT_MAIN="$PROJ_MAIN" E2E_PROJECT_ISOLATED="$PROJ_ISO"
|
||||
set +e
|
||||
npx playwright test --reporter=list >"$OUT/playwright.log" 2>&1
|
||||
# 本脚本的种子只覆盖审计工作区。u7 现场验收用例依赖另一套入口,不在这里跑。
|
||||
npx playwright test e2e/rdm-audit.playwright.ts --reporter=list >"$OUT/playwright.log" 2>&1
|
||||
PW_EXIT=$?
|
||||
set -e
|
||||
cat "$OUT/playwright.log"
|
||||
|
||||
Reference in New Issue
Block a user