fef35ed03a
- hooks/lib/release_chain.py:問 Gitea 的判準一份三處用(匿名讀,D20) - scripts/release-ship:前置①比「要建的那個 tag 的樹」裡的 plugin.json,不比工作樹/最新 tag (總管 09-07 在 v0.23.0 被擋的情境現在放行);note 從 Gitea compare 生,從 plugin 快取跑也行; 覆核改跑 release-check <那個 tag> - scripts/release-check [vX.Y.Z]:指定版本;v0.19/0.20/0.21 依裁決標「不補」不再黃字;補法印正本絕對路徑 - hooks/lib/beacon_report.py ④:最新 tag 沒 release/main 定版沒打 tag ⇒ 一行缺站+補法;都在安靜; 只快取「都在」6 小時 - 測試:test-release-ship 14、test-release-check 14、信標 26→33;docs:TESTING A37/A38、盤點表、README 60 支腳本、 白名單加 release-ship/release-check 形狀、mistakes 一條 - 沒改 plugin.json 版本號(待總管定版) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
130 lines
5.4 KiB
Bash
Executable File
130 lines
5.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# scripts/release-check 的迴歸測試(inkstone/ISEP#67)
|
||
#
|
||
# 兩個方向都要有證據:
|
||
# A 群「該擋」(exit 2)——現行版本缺 tag 或缺 release,且**說得出缺哪一站+怎麼補**
|
||
# (這就是工單驗收 4:「故意漏一步 → 管線要擋下來並說出缺哪一站」)
|
||
# B 群「該過」(exit 0)——現行版本 tag+release 都在;更舊版本缺件只黃字提醒不擋;
|
||
# 指定版本時看的是那一版;裁定不補的版本不再黃字
|
||
#
|
||
# 🔴 全程離線(RELEASE_CHECK_FIXTURE),不打 Gitea。fixture 直接給收貨端與送貨端的事實。
|
||
set -u
|
||
TOOL="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/release-check}"
|
||
TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
|
||
PASS=0; FAIL=0; N=0
|
||
|
||
mkfx() { # $1=檔名 之後 heredoc
|
||
cat > "$TMP/$1"
|
||
}
|
||
|
||
# t <期望exit> <說明> <必須出現的字串> <fixture檔> [額外參數…]
|
||
t() {
|
||
want="$1"; desc="$2"; must="$3"; fx="$4"; shift 4
|
||
N=$((N+1))
|
||
out=$(RELEASE_CHECK_FIXTURE="$TMP/$fx" python3 "$TOOL" "$@" 2>&1); rc=$?
|
||
ok=1
|
||
[ "$rc" -eq "$want" ] || ok=0
|
||
if [ -n "$must" ] && ! printf '%s' "$out" | grep -qF "$must"; then ok=0; fi
|
||
if [ "$ok" -eq 1 ]; then printf ' ✅ %s\n' "$desc"; PASS=$((PASS+1))
|
||
else
|
||
printf ' ❌ %s —— 期望 exit=%s%s,實得 exit=%s\n' "$desc" "$want" \
|
||
"${must:+ 且輸出含「$must」}" "$rc"
|
||
printf '%s\n' "$out" | sed -n '1,16p' | sed 's/^/ /'; FAIL=$((FAIL+1))
|
||
fi
|
||
}
|
||
# not <說明> <不該出現的字串> <fixture檔> [額外參數…]
|
||
not() {
|
||
desc="$1"; bad="$2"; fx="$3"; shift 3
|
||
N=$((N+1))
|
||
out=$(RELEASE_CHECK_FIXTURE="$TMP/$fx" python3 "$TOOL" "$@" 2>&1)
|
||
if printf '%s' "$out" | grep -qF "$bad"; then
|
||
printf ' ❌ %s —— 不該出現卻出現了:%s\n' "$desc" "$bad"; FAIL=$((FAIL+1))
|
||
else printf ' ✅ %s\n' "$desc"; PASS=$((PASS+1)); fi
|
||
}
|
||
|
||
echo "── A 群:該擋(現行版本送貨端斷了,要說出缺哪一站)──"
|
||
|
||
# A1:這就是 2026-09-07 的真實狀態——v0.24.0 有 tag、沒 release
|
||
mkfx a1.json <<'JSON'
|
||
{"current":"0.24.0",
|
||
"dingban":["0.24.0","0.23.0","0.22.0"],
|
||
"tags":["v0.24.0","v0.23.0","v0.22.0"],
|
||
"releases":["v0.22.0"],
|
||
"loaded":"0.24.0"}
|
||
JSON
|
||
t 2 "現行 v0.24.0 有 tag 沒 release → 擋,且指名缺 release 站" "缺這一站:release(Gitea)" a1.json
|
||
t 2 "缺 release 時給得出補法,而且是正本的絕對路徑(貼了就能跑)" "$(dirname "$TOOL")/release-ship v0.24.0" a1.json
|
||
|
||
# A2:連 tag 都沒有(定版了、tag 沒推)
|
||
mkfx a2.json <<'JSON'
|
||
{"current":"0.20.0",
|
||
"dingban":["0.20.0","0.18.0"],
|
||
"tags":["v0.18.0"],
|
||
"releases":["v0.18.0"],
|
||
"loaded":"0.20.0"}
|
||
JSON
|
||
t 2 "現行版本連 tag 都沒有 → 擋,且指名缺 tag 站" "缺這一站:tag(Gitea)" a2.json
|
||
t 2 "缺 tag 時給得出補法(push tag)" "git push origin v0.20.0" a2.json
|
||
|
||
# A3:指定版本 → 判的是那一版
|
||
mkfx a3.json <<'JSON'
|
||
{"current":"0.24.0",
|
||
"dingban":["0.24.0","0.23.0"],
|
||
"tags":["v0.24.0","v0.23.0"],
|
||
"releases":["v0.24.0"],
|
||
"loaded":"0.24.0"}
|
||
JSON
|
||
t 2 "指定 v0.23.0 而它沒 release → 擋(就算工作樹宣稱的 v0.24.0 是好的)" "現行版本 v0.23.0 的送貨端斷了" a3.json v0.23.0
|
||
t 0 "同一份事實不指定版本 → 看 v0.24.0,放行" "送貨端完成" a3.json
|
||
|
||
echo "── B 群:該過(現行版本 tag+release 都在)──"
|
||
|
||
# B1:全部送到
|
||
mkfx b1.json <<'JSON'
|
||
{"current":"0.18.0",
|
||
"dingban":["0.18.0","0.9.0"],
|
||
"tags":["v0.18.0","v0.9.0"],
|
||
"releases":["v0.18.0","v0.9.0"],
|
||
"loaded":"0.18.0"}
|
||
JSON
|
||
t 0 "現行版本 tag+release 都在 → 放行" "送貨端完成" b1.json
|
||
|
||
# B2:現行版本送到了,但更舊的 定版 版本缺件 → 仍放行,只黃字
|
||
mkfx b2.json <<'JSON'
|
||
{"current":"0.24.0",
|
||
"dingban":["0.24.0","0.23.0","0.22.0"],
|
||
"tags":["v0.24.0","v0.22.0"],
|
||
"releases":["v0.24.0","v0.22.0"],
|
||
"loaded":"0.24.0"}
|
||
JSON
|
||
t 0 "現行送到、舊版缺件 → 放行(不 over-block)" "送貨端完成" b2.json
|
||
t 0 "舊版缺件會被黃字提醒出來" "v0.23.0 缺:tag(Gitea)+release(Gitea)" b2.json
|
||
|
||
# B3:載入端落後(送貨端完成,但這個 session 掛的是舊版)→ 仍 exit 0,但要報出來
|
||
mkfx b3.json <<'JSON'
|
||
{"current":"0.22.0",
|
||
"dingban":["0.22.0","0.18.0"],
|
||
"tags":["v0.22.0","v0.18.0"],
|
||
"releases":["v0.22.0","v0.18.0"],
|
||
"loaded":"0.21.0"}
|
||
JSON
|
||
t 0 "載入端落後 → 送貨端仍算完成(exit 0)" "送貨端完成" b3.json
|
||
t 0 "載入端落後會被明確報出+給 update/重啟的修法" "載入端落後" b3.json
|
||
|
||
# B4:裁定不補的三版(總管 09-07)→ 不再黃字,表上標「裁定不補」
|
||
mkfx b4.json <<'JSON'
|
||
{"current":"0.24.0",
|
||
"dingban":["0.24.0","0.22.0","0.21.0","0.20.0","0.19.0","0.18.0"],
|
||
"tags":["v0.24.0","v0.22.0","v0.18.0"],
|
||
"releases":["v0.24.0","v0.22.0","v0.18.0"],
|
||
"loaded":"0.24.0"}
|
||
JSON
|
||
t 0 "v0.19/0.20/0.21 缺 tag+release 但已裁定不補 → 表上標出裁決出處" "裁定不補(inkstone/ISEP#67 → 6574)" b4.json
|
||
not "裁定不補的版本不再黃字念(天天念會被學會忽略)" "更舊的定版版本也缺件" b4.json
|
||
t 2 "但指定 v0.21.0 來問,它就是現行、照擋(裁決只免黃字,不改事實)" "現行版本 v0.21.0 的送貨端斷了" b4.json v0.21.0
|
||
|
||
echo ""
|
||
echo "──────────────────────────────"
|
||
printf '共 %d 項:✅ %d / ❌ %d\n' "$N" "$PASS" "$FAIL"
|
||
[ "$FAIL" -eq 0 ]
|