build / build-push (push) Successful in 3m46s
verify-failure-guard.sh 原断言固定 'Tests run: 92, Failures: 0, Errors: 11', 而本候选门禁类实跑 101 例(D10/D11 新增用例),写死总数会让正常演进直接红灯、 阻断镜像产出。改为解析最后一行 Surefire 汇总并断言 tests>0 / failures=0 / errors>0, 保留“空 schema 必须阻断打包且不产 JAR”的原意。 本地等价实跑(隔离 MySQL 8.0.45,ddl-auto=validate,空 schema): NEGATIVE_MVN_EXIT=1,NEGATIVE_SUMMARY tests=101 failures=0 errors=11 skipped=0, CI_EMPTY_SCHEMA_FAILURE_GUARD=PASS。
27 lines
1.6 KiB
Bash
27 lines
1.6 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
cd "$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
|
|
: "${CI_TEST_DB_URL:?isolated empty MySQL schema URL is required}"
|
|
case "$CI_TEST_DB_URL" in */flowcenter_ci_invalid\?*|*/flowcenter_ci_invalid_*\?*) ;; *) echo 'Negative guard requires its own invalid test schema' >&2; exit 2 ;; esac
|
|
log=$(mktemp /tmp/flow-ci-negative.XXXXXX)
|
|
trap 'rm -f "$log"' EXIT
|
|
set +e
|
|
sh ci/test-gate.sh clean package >"$log" 2>&1
|
|
code=$?
|
|
set -e
|
|
cat "$log"
|
|
echo "NEGATIVE_MVN_EXIT=$code"
|
|
[ "$code" -ne 0 ] || { echo 'Empty schema unexpectedly passed' >&2; exit 1; }
|
|
grep -q 'Schema-validation: missing table' "$log"
|
|
# 只钉“缺表必须让真实库用例报 error、其余断言不得失败”这一契约,不钉具体用例总数:
|
|
# 门禁类会随被测类新增用例而变化(2026-10-27 已由 92 增至 101),写死总数会把正常演进变成红灯。
|
|
summary=$(sed -n 's/.*Tests run: \([0-9]*\), Failures: \([0-9]*\), Errors: \([0-9]*\), Skipped: \([0-9]*\).*/\1 \2 \3 \4/p' "$log" | tail -1)
|
|
[ -n "$summary" ] || { echo 'Negative gate produced no Surefire summary' >&2; exit 1; }
|
|
set -- $summary
|
|
echo "NEGATIVE_SUMMARY tests=$1 failures=$2 errors=$3 skipped=$4"
|
|
[ "$1" -gt 0 ] || { echo 'No tests ran' >&2; exit 1; }
|
|
[ "$2" -eq 0 ] || { echo 'Empty schema caused assertion failures, not schema errors' >&2; exit 1; }
|
|
[ "$3" -gt 0 ] || { echo 'Empty schema did not produce any schema error' >&2; exit 1; }
|
|
[ -z "$(find target -maxdepth 1 -name '*.jar' -print -quit 2>/dev/null)" ] || { echo 'Failed gate produced a JAR' >&2; exit 1; }
|
|
echo 'CI_EMPTY_SCHEMA_FAILURE_GUARD=PASS'
|