Files
MyGoNavi/tools/detect-changed-driver-agents.test.sh
Syngnat ebdf7b5a6c 🐛 fix(ci): 修复 dev CI 漏掉驱动补偿构建
- dev 构建改为优先使用已发布 driver release 对应源码提交作为检测基线
- 避免驱动相关提交的 CI 失败后,后续仅修 workflow 时被误判为无需重建驱动
- 当已发布驱动基线无法解析时,保守回退为全量驱动构建
- 补充驱动变更检测补偿场景回归测试
- 新增 driver release source 解析测试,覆盖 release body 与 target_commitish 场景
2026-06-05 09:10:49 +08:00

118 lines
4.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
if [[ "${BASH_VERSINFO[0]:-0}" -lt 4 ]]; then
echo "skip: detect-changed-driver-agents.sh requires Bash 4+ for associative arrays; current bash is ${BASH_VERSION:-unknown}"
exit 0
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$SCRIPT_DIR"
tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-detect-driver-revisions.XXXXXX")"
tmpdir_script=""
cleanup() {
rm -rf "$tmpdir"
if [[ -n "$tmpdir_script" ]]; then
rm -rf "$tmpdir_script"
fi
}
trap cleanup EXIT
git init -q "$tmpdir"
mkdir -p "$tmpdir/tools"
cp tools/detect-changed-driver-agents.sh "$tmpdir/tools/detect-changed-driver-agents.sh"
mkdir -p "$tmpdir/internal/db"
cat >"$tmpdir/internal/db/driver_agent_revisions_gen.go" <<'GOEOF'
package db
func init() {
optionalDriverAgentRevisions = map[string]string{
"mariadb": "src-old-mariadb",
"clickhouse": "src-old-clickhouse",
}
}
GOEOF
(
cd "$tmpdir"
git add .
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m initial
base="$(git rev-parse HEAD)"
perl -0pi -e 's/src-old-clickhouse/src-new-clickhouse/' internal/db/driver_agent_revisions_gen.go
git add internal/db/driver_agent_revisions_gen.go
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m 'update clickhouse revision'
actual="$(bash ./tools/detect-changed-driver-agents.sh --base "$base" --head HEAD)"
if [[ "$actual" != "clickhouse" ]]; then
echo "expected clickhouse revision-only change to trigger clickhouse build, got: ${actual:-<empty>}" >&2
exit 1
fi
)
tmpdir_script="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-detect-script-change.XXXXXX")"
git init -q "$tmpdir_script"
mkdir -p "$tmpdir_script/tools"
cp tools/detect-changed-driver-agents.sh "$tmpdir_script/tools/detect-changed-driver-agents.sh"
(
cd "$tmpdir_script"
git add .
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m initial
base="$(git rev-parse HEAD)"
printf '\n# test change\n' >> tools/detect-changed-driver-agents.sh
git add tools/detect-changed-driver-agents.sh
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m 'update detection script'
actual="$(bash ./tools/detect-changed-driver-agents.sh --base "$base" --head HEAD 2>/dev/null)"
if [[ "$actual" != *"mariadb"* || "$actual" != *"clickhouse"* || "$actual" != *"elasticsearch"* ]]; then
echo "expected detection script change to trigger all driver builds, got: ${actual:-<empty>}" >&2
exit 1
fi
)
tmpdir_compensation="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-detect-compensation.XXXXXX")"
git init -q "$tmpdir_compensation"
mkdir -p "$tmpdir_compensation/tools" "$tmpdir_compensation/internal/db" "$tmpdir_compensation/.github/workflows"
cp tools/detect-changed-driver-agents.sh "$tmpdir_compensation/tools/detect-changed-driver-agents.sh"
cat >"$tmpdir_compensation/internal/db/driver_agent_revisions_gen.go" <<'GOEOF'
package db
func init() {
optionalDriverAgentRevisions = map[string]string{
"clickhouse": "src-old-clickhouse",
}
}
GOEOF
cat >"$tmpdir_compensation/.github/workflows/dev-build.yml" <<'YAMLEOF'
name: Dev Build
YAMLEOF
(
cd "$tmpdir_compensation"
git add .
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m initial
published_base="$(git rev-parse HEAD)"
perl -0pi -e 's/src-old-clickhouse/src-new-clickhouse/' internal/db/driver_agent_revisions_gen.go
git add internal/db/driver_agent_revisions_gen.go
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m 'update clickhouse revision'
push_base="$(git rev-parse HEAD)"
printf '\n# workflow fix\n' >> .github/workflows/dev-build.yml
git add .github/workflows/dev-build.yml
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m 'fix workflow'
actual_push_base="$(bash ./tools/detect-changed-driver-agents.sh --base "$push_base" --head HEAD)"
if [[ -n "$actual_push_base" ]]; then
echo "expected workflow-only fix commit to be empty when using push diff base, got: ${actual_push_base:-<empty>}" >&2
exit 1
fi
actual_published_base="$(bash ./tools/detect-changed-driver-agents.sh --base "$published_base" --head HEAD)"
if [[ "$actual_published_base" != "clickhouse" ]]; then
echo "expected published release base to recover clickhouse rebuild, got: ${actual_published_base:-<empty>}" >&2
exit 1
fi
)
echo "detect-changed-driver-agents revision test passed"