CI:补产物存档与结果汇总,明示体积门禁盲区(S3+S14)
This commit is contained in:
+58
-2
@@ -21,6 +21,10 @@
|
||||
1 = 有门禁/单测失败
|
||||
2 = 环境错误(缺 pre-commit / python 模块等)
|
||||
|
||||
汇总行(S3,2026-10-02,对齐 CI 的 ::notice::):
|
||||
[SUMMARY] L0: pre-commit hooks -- passed=N failed=M skipped=K
|
||||
[SUMMARY] L0.5: K runner(s), A/B assertions passed, fail=F
|
||||
|
||||
用法(仓库根目录):
|
||||
& '.venv\\Scripts\\python.exe' scripts/ci_local.py
|
||||
& '.venv\\Scripts\\python.exe' scripts/ci_local.py --l0-only
|
||||
@@ -33,6 +37,7 @@
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
@@ -90,6 +95,27 @@ def _run(cmd, env=None):
|
||||
return cp.returncode
|
||||
|
||||
|
||||
def _run_capture(cmd, env=None):
|
||||
"""跑子进程,输出**既直通终端又捕获**(对齐 CI 的 Tee-Object)。
|
||||
|
||||
返回 (退出码, 全部输出文本)。用于 L0.5 解析各模块汇总行(S3 汇总)。
|
||||
"""
|
||||
print("$ " + " ".join(str(c) for c in cmd))
|
||||
cp = subprocess.run(cmd, cwd=str(REPO_ROOT), env=env,
|
||||
capture_output=True)
|
||||
try:
|
||||
text = cp.stdout.decode("utf-8")
|
||||
except UnicodeDecodeError:
|
||||
text = cp.stdout.decode("utf-8", errors="replace")
|
||||
sys.stdout.write(text)
|
||||
if cp.stderr:
|
||||
try:
|
||||
sys.stderr.write(cp.stderr.decode("utf-8"))
|
||||
except UnicodeDecodeError:
|
||||
sys.stderr.write(cp.stderr.decode("utf-8", errors="replace"))
|
||||
return cp.returncode, text
|
||||
|
||||
|
||||
def run_l0():
|
||||
"""L0:pre-commit 全部钩子。返回退出码(0/1/2)。"""
|
||||
print("")
|
||||
@@ -105,10 +131,20 @@ def run_l0():
|
||||
print("[INFO] mem-numbers 照常运行")
|
||||
else:
|
||||
print("[INFO] 未找到 .map(未做 Keil 构建)-> 跳过 mem-numbers(与 CI 一致)")
|
||||
print("[INFO] :warning: 体积门禁未执行——改代码后请本地 @build + "
|
||||
"check_mem_numbers.py --scan 兜底")
|
||||
skip = env.get("SKIP", "")
|
||||
env["SKIP"] = (skip + "," if skip else "") + "mem-numbers"
|
||||
|
||||
return _run([PY, "-m", "pre_commit", "run", "--all-files"], env=env)
|
||||
rc, text = _run_capture([PY, "-m", "pre_commit", "run", "--all-files"], env=env)
|
||||
# 汇总行(对齐 CI 的 ::notice::):统计钩子 Passed/Failed/Skipped
|
||||
lines = text.splitlines()
|
||||
passed = sum(1 for l in lines if l.rstrip().endswith("Passed"))
|
||||
failed = sum(1 for l in lines if l.rstrip().endswith("Failed"))
|
||||
skipd = sum(1 for l in lines if l.rstrip().endswith("Skipped"))
|
||||
print("[SUMMARY] L0: pre-commit hooks -- passed={} failed={} skipped={}".format(
|
||||
passed, failed, skipd))
|
||||
return rc
|
||||
|
||||
|
||||
def run_l05(args):
|
||||
@@ -124,11 +160,28 @@ def run_l05(args):
|
||||
return 0
|
||||
|
||||
rc_all = 0
|
||||
runner_count = 0
|
||||
sum_pass = 0
|
||||
sum_total = 0
|
||||
for r in runners:
|
||||
runner_count += 1
|
||||
rel = r.relative_to(REPO_ROOT)
|
||||
print("")
|
||||
print("--- 运行:{} ---".format(rel))
|
||||
rc = _run([PY, str(r)])
|
||||
rc, text = _run_capture([PY, str(r)])
|
||||
# 解析模块自身汇总行,如 "=== System Clock Tests: 100/100 PASSED (failed=0) ==="
|
||||
m = None
|
||||
for line in text.splitlines():
|
||||
mm = re.search(r":\s*(\d+)/(\d+)\s+PASSED\s+\(failed=(\d+)\)", line)
|
||||
if mm:
|
||||
m = mm
|
||||
if m:
|
||||
sum_pass += int(m.group(1))
|
||||
sum_total += int(m.group(2))
|
||||
print("[SUMMARY] {}: {}/{} PASSED (failed={})".format(
|
||||
r.parent.name, m.group(1), m.group(2), m.group(3)))
|
||||
else:
|
||||
print("[WARN] {} 未输出 '=== ... N/M PASSED ===' 汇总行".format(rel))
|
||||
if rc != 0:
|
||||
print("[FAIL] {}(退出码 {})".format(rel, rc))
|
||||
if rc == 2:
|
||||
@@ -139,6 +192,9 @@ def run_l05(args):
|
||||
break
|
||||
else:
|
||||
print("[OK] {}".format(rel))
|
||||
|
||||
print("[SUMMARY] L0.5: {} runner(s), {}/{} assertions passed, fail={}".format(
|
||||
runner_count, sum_pass, sum_total, rc_all))
|
||||
return rc_all
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user