feat(infra): k8s Helm Chart 演化与备份脚本测试

- 新增 edu-platform 平台级 chart(namespace/configmap/secret/ingress/hpa)
- 新增 api-gateway 服务级 chart(完整迁移自原 manifest)
- 新增 6 个业务服务 chart 桩(iam/core-edu/content/msg/data-ana/ai)
- 删除原 api-gateway-deployment.yaml(已迁移至 helm chart)
- 更新 infra/k8s/README.md 为 Helm Chart 管理说明
- 新增 backup-mysql.sh dry-run 测试脚本(17 断言)
This commit is contained in:
SpecialX
2026-07-08 12:50:56 +08:00
parent 9b33303195
commit d831915f06
51 changed files with 2111 additions and 165 deletions

View File

@@ -0,0 +1,112 @@
#!/bin/bash
# backup-mysql.sh 参数解析与校验的 dry-run 测试
# 不实际执行 mysqldump仅验证参数解析、必填校验、默认值、帮助信息等。
#
# 运行方式(需要 bash 环境,如 Git Bash / WSL
# bash infra/backup/test-backup-mysql.sh
#
# 退出码0 表示全部通过,非 0 表示有失败用例。
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT="${SCRIPT_DIR}/backup-mysql.sh"
PASS=0
FAIL=0
# assertExit <expected_code> <description> <actual_code> <stderr>
assertExit() {
local expected="$1" desc="$2" actual="$3" stderr="${4:-}"
if [[ "$actual" == "$expected" ]]; then
echo "[PASS] $desc (exit=$actual)"
PASS=$((PASS + 1))
else
echo "[FAIL] $desc: 期望 exit=$expected, 实际 exit=$actual"
[[ -n "$stderr" ]] && echo " stderr: $stderr"
FAIL=$((FAIL + 1))
fi
}
# assertContains <needle> <description> <haystack>
assertContains() {
local needle="$1" desc="$2" haystack="${3:-}"
if [[ "$haystack" == *"$needle"* ]]; then
echo "[PASS] $desc"
PASS=$((PASS + 1))
else
echo "[FAIL] $desc: 输出应包含 '$needle'"
echo " 实际输出: $haystack"
FAIL=$((FAIL + 1))
fi
}
echo "=== backup-mysql.sh dry-run 测试 ==="
# ---------- 用例 1: 无参数应失败并提示 --service 必填 ----------
output="$("$SCRIPT" 2>&1)"
code=$?
assertExit 1 "无参数应退出 1" "$code" "$output"
assertContains "--service 参数必填" "无参数应提示 --service 必填" "$output"
# ---------- 用例 2: --help 应退出 0 并输出 Usage ----------
output="$("$SCRIPT" --help 2>&1)"
code=$?
assertExit 0 "--help 应退出 0" "$code" "$output"
assertContains "Usage:" "--help 应输出 Usage" "$output"
assertContains "--service" "--help 应说明 --service 参数" "$output"
assertContains "--keep" "--help 应说明 --keep 参数" "$output"
# ---------- 用例 3: --keep 默认值(未提供时)应在日志中体现 7 天 ----------
# 设置 MYSQL_PASSWORD 让脚本通过环境变量校验,进入主流程打印日志;
# 随后会在 mysqldump 阶段失败CI 环境无 mysqldump
output="$(MYSQL_PASSWORD=fake-pass "$SCRIPT" --service iam 2>&1)"
code=$?
assertExit 1 "无 mysqldump 时应最终退出 1" "$code" "$output"
assertContains "保留 7 天" "未提供 --keep 时应使用默认值 7 天" "$output"
# ---------- 用例 4: --keep 非数字应失败 ----------
output="$("$SCRIPT" --service iam --keep abc 2>&1)"
code=$?
assertExit 1 "--keep 非数字应退出 1" "$code" "$output"
assertContains "--keep 必须为正整数" "非数字 --keep 应报错" "$output"
# ---------- 用例 5: --keep 小于 1 应失败 ----------
output="$("$SCRIPT" --service iam --keep 0 2>&1)"
code=$?
assertExit 1 "--keep=0 应退出 1" "$code" "$output"
assertContains "--keep 必须为正整数" "--keep=0 应报错" "$output"
# ---------- 用例 6: 未知参数应失败 ----------
output="$("$SCRIPT" --service iam --unknown-flag 2>&1)"
code=$?
assertExit 1 "未知参数应退出 1" "$code" "$output"
assertContains "未知参数" "未知参数应报错" "$output"
# ---------- 用例 7: --keep 自定义值应在日志中体现 ----------
output="$(MYSQL_PASSWORD=fake-pass "$SCRIPT" --service iam --keep 30 2>&1)"
code=$?
assertExit 1 "无 mysqldump 时应最终退出 1用例 7 预置)" "$code" "$output"
assertContains "保留 30 天" "--keep=30 应在日志中体现" "$output"
# ---------- 用例 8: MYSQL_PASSWORD 已设置但 mysqldump 不可用时应优雅失败 ----------
# 此用例验证:参数校验通过后,脚本会尝试调用 mysqldump若 mysqldump 不存在则失败。
# 在无 MySQL 容器的 CI 环境中,这是最接近真实 dry-run 的验证。
output="$(MYSQL_PASSWORD=fake-pass "$SCRIPT" --service iam 2>&1)"
code=$?
# mysqldump 不存在时pipefail + gzip 写入空文件 → 脚本检测到空文件后 exit 1
# 或 mysqldump 命令未找到 → set -e 触发 exit 1
# 任一路径都应是非 0 退出
if [[ "$code" -ne 0 ]]; then
echo "[PASS] mysqldump 不可用时应非 0 退出 (exit=$code)"
PASS=$((PASS + 1))
else
echo "[FAIL] mysqldump 不可用时不应返回 0"
FAIL=$((FAIL + 1))
fi
echo "=== 测试结果 ==="
echo "通过: $PASS 失败: $FAIL"
if [[ "$FAIL" -gt 0 ]]; then
exit 1
fi
exit 0