fix(release): enforce AIHR tenant collation contract

This commit is contained in:
2026-07-15 13:33:56 +08:00
parent bd19cdd255
commit ab406e616a
19 changed files with 243 additions and 67 deletions
+49 -5
View File
@@ -68,6 +68,9 @@ grep -q '/h5/' "$mobile_index" || fail "mobile H5 index does not contain the /h5
if [[ "${RELEASE_VERIFY_REMOTE_BACKEND:-false}" == "true" && "${RELEASE_VERIFY_REMOTE_MATCH:-false}" != "true" ]]; then
fail "RELEASE_VERIFY_REMOTE_BACKEND=true requires RELEASE_VERIFY_REMOTE_MATCH=true"
fi
if [[ "${RELEASE_VERIFY_REMOTE_BACKEND:-false}" == "true" && "${RELEASE_VERIFY_REMOTE_SCHEMA:-false}" != "true" ]]; then
fail "RELEASE_VERIFY_REMOTE_BACKEND=true requires RELEASE_VERIFY_REMOTE_SCHEMA=true"
fi
if [[ "${RELEASE_VERIFY_REMOTE_SCHEMA:-false}" == "true" && "${RELEASE_VERIFY_REMOTE_MATCH:-false}" != "true" ]]; then
fail "RELEASE_VERIFY_REMOTE_SCHEMA=true requires RELEASE_VERIFY_REMOTE_MATCH=true"
fi
@@ -111,12 +114,12 @@ require_remote_schema() {
local remote_db="${RELEASE_REMOTE_DB_NAME:-ry-vue}"
[[ "$remote_db" =~ ^[A-Za-z0-9_-]+$ ]] || fail "remote database name is invalid: $remote_db"
local missing
missing="$(ssh -o BatchMode=yes -o ConnectTimeout=10 "$remote_ssh" bash -s -- "$remote_db" <<'REMOTE'
local issues
issues="$(ssh -o BatchMode=yes -o ConnectTimeout=10 "$remote_ssh" bash -s -- "$remote_db" <<'REMOTE'
set -euo pipefail
db="$1"
mysql --batch --skip-column-names --connect-timeout=5 "$db" <<'SQL'
SELECT required.table_name
SELECT CONCAT('missing_table:', required.table_name) AS issue
FROM (
SELECT 'aihr_prompt_template' AS table_name
UNION ALL SELECT 'aihr_practice_scenario'
@@ -138,13 +141,54 @@ FROM (
LEFT JOIN information_schema.tables actual
ON actual.table_schema = DATABASE() AND actual.table_name = required.table_name
WHERE actual.table_name IS NULL
ORDER BY required.table_name;
UNION ALL
SELECT 'missing_column:sys_oss.tenant_id'
WHERE NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'sys_oss'
AND column_name = 'tenant_id'
)
UNION ALL
SELECT CONCAT(
'tenant_collation:', aihr.table_name, '.', aihr.column_name,
'=', COALESCE(aihr.collation_name, 'NULL'),
',expected=', core.collation_name
)
FROM information_schema.columns aihr
JOIN information_schema.columns core
ON core.table_schema = aihr.table_schema
AND core.table_name = 'sys_oss'
AND core.column_name = 'tenant_id'
WHERE aihr.table_schema = DATABASE()
AND LEFT(aihr.table_name, 5) = 'aihr_'
AND aihr.column_name = 'tenant_id'
AND aihr.collation_name <> core.collation_name
ORDER BY issue;
SQL
REMOTE
)" || fail "remote schema check failed: $remote_ssh:$remote_db"
[[ -z "$missing" ]] || fail "remote schema missing required tables: $(printf '%s' "$missing" | tr '\n' ', ' | sed 's/, $//')"
[[ -z "$issues" ]] || fail "remote schema incompatible: $(printf '%s' "$issues" | tr '\n' ', ' | sed 's/, $//')"
local processing_join_count
processing_join_count="$(ssh -o BatchMode=yes -o ConnectTimeout=10 "$remote_ssh" bash -s -- "$remote_db" <<'REMOTE'
set -euo pipefail
db="$1"
mysql --batch --skip-column-names --connect-timeout=5 "$db" <<'SQL'
SELECT COUNT(*)
FROM aihr_knowledge_attach a
LEFT JOIN sys_oss o
ON o.oss_id = a.oss_id
AND o.tenant_id = a.tenant_id;
SQL
REMOTE
)" || fail "remote processing join check failed: $remote_ssh:$remote_db"
[[ "$processing_join_count" =~ ^[0-9]+$ ]] || fail "remote processing join count is invalid: $processing_join_count"
echo "remote_schema=16/16 $remote_ssh:$remote_db"
echo "remote_tenant_collation=aligned"
echo "remote_processing_join_count=$processing_join_count"
}
changed_files="$(git status --porcelain)"