Files
ISEP/scripts/test-release-check.sh
T
Claude 49dedbbb15 補上運送鏈缺的兩站:建 release + 回頭覆核(inkstone/ISEP#67)
工單的斷點是「沒有任何東西會建 release」——v0.22.0 tag 早推了,
Gitea Releases 頁卻停在 v0.18.0,對 leo 等於這一版不存在。

新增兩支獨立的站(不改任何既有閘,只補送貨鏈缺的那兩段):

- scripts/release-ship(= arcrun-rag 的 release-record 站)
  把「已推的 tag」變成「leo 看得到的 release」。三個前置條件「必須在場」才放行:
  ①版本一致(重用 check-version-consistency.sh,不另立判準)②tag 真的在 Gitea
  ③release note 有內容(沒給就從 git log 自動生事實清單)。冪等;建完回頭跑
  release-check 拿收貨端覆核——送的人說成功不算。

- scripts/release-check(= release-check 站)
  回頭問每一段「到了嗎」,而且**問的是收貨端**(Gitea tags/releases、這個 session
  載到的 plugin.json),不聽送的人說。現行版本缺 tag 或缺 release ⇒ exit 2 並指名
  缺哪一站+怎麼補(工單驗收 4)。判準是結構(定版 commit / tag / release 在不在),
  不是關鍵字黑名單。

- 兩支離線測試(RELEASE_*_FIXTURE,不打 Gitea):release-check 9 項、release-ship 7 項全過。

實跑證據:release-ship v0.22.0 已在 Gitea 建起
https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.22.0
release-check 覆核 v0.22.0 tag+release 都在(收貨端事實)。

版本:新增的是 scripts/(非自動載入),本身不需升版;待總管定版隨下一版一起送出。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012656SLtw96aCxTgScH5bbK
2026-09-05 21:01:29 +00:00

99 lines
3.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"
}
run() { RELEASE_CHECK_FIXTURE="$TMP/$1" python3 "$TOOL" 2>&1; }
# t <期望exit> <說明> <必須出現的字串> <fixture檔>
t() {
want="$1"; desc="$2"; must="$3"; fx="$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,14p' | sed 's/^/ /'; FAIL=$((FAIL+1))
fi
}
echo "── A 群:該擋(現行版本送貨端斷了,要說出缺哪一站)──"
# A1:這就是 2026-09-05 的真實狀態——v0.22.0 有 tag、沒 release
mkfx a1.json <<'JSON'
{"current":"0.22.0",
"dingban":["0.22.0","0.21.0","0.20.0","0.19.0","0.18.0"],
"tags":["v0.22.0","v0.18.0"],
"releases":["v0.18.0"],
"loaded":"0.22.0"}
JSON
t 2 "現行 v0.22.0 有 tag 沒 release → 擋,且指名缺 release 站" "releaseGitea" a1.json
t 2 "缺 release 時給得出補法(release-ship" "release-ship" a1.json
# A2:連 tag 都沒有(v0.19-0.21 的真實狀態搬成現行來測)
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 站" "tagGitea" a2.json
t 2 "缺 tag 時給得出補法(push tag" "git push origin" a2.json
echo "── B 群:該過(現行版本 tagrelease 都在)──"
# 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 "現行版本 tagrelease 都在 → 放行" "送貨端完成" b1.json
# B2:現行版本送到了,但更舊的 定版 版本缺件 → 仍放行,只黃字
mkfx b2.json <<'JSON'
{"current":"0.22.0",
"dingban":["0.22.0","0.21.0","0.20.0","0.19.0","0.18.0"],
"tags":["v0.22.0","v0.18.0"],
"releases":["v0.22.0","v0.18.0"],
"loaded":"0.22.0"}
JSON
t 0 "現行送到、舊版缺件 → 放行(不 over-block" "送貨端完成" b2.json
t 0 "舊版缺件會被黃字提醒出來" "更舊的定版版本也缺件" 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
echo ""
echo "──────────────────────────────"
printf '共 %d 項:✅ %d ❌ %d\n' "$N" "$PASS" "$FAIL"
[ "$FAIL" -eq 0 ]