🐛 fix(driver-manager): 修复驱动 revision 错配与安装卡住

- 修复 revision 生成文件变更未触发 driver-agent 构建的问题
- 检测脚本自身变更时保守触发全量 driver-agent 构建
- 调整 dev 构建驱动安装策略为发布包优先、源码构建兜底
- 为驱动总包下载和源码构建增加超时边界
- 为驱动管理安装流程增加前端看门狗并补充回归测试
This commit is contained in:
Syngnat
2026-06-05 08:34:38 +08:00
parent 2438899ff5
commit 53811969c5
6 changed files with 200 additions and 28 deletions

View File

@@ -320,9 +320,31 @@ add_all_forced_drivers() {
done
}
revision_file_changed_drivers() {
local line driver emitted_seen
emitted_seen="|"
while IFS= read -r line; do
case "$line" in
+++*|---*|@@*)
continue
;;
+*|-*)
if [[ "$line" =~ \"([^\"]+)\"[[:space:]]*:[[:space:]]*\"src-[^\"]+\" ]]; then
driver="$(normalize_driver "${BASH_REMATCH[1]}")" || continue
if [[ "$emitted_seen" == *"|$driver|"* ]]; then
continue
fi
printf '%s\n' "$driver"
emitted_seen="${emitted_seen}${driver}|"
fi
;;
esac
done < <(git diff --unified=0 "$base_commit" "$head_commit" -- internal/db/driver_agent_revisions_gen.go)
}
is_ignored_driver_agent_source_file() {
case "$1" in
*_test.go|frontend/*|internal/app/*|internal/db/driver_agent_revisions_gen.go)
*_test.go|frontend/*|internal/app/*)
return 0
;;
esac
@@ -469,6 +491,15 @@ declare -a forced_changed_drivers=()
forced_driver_seen="|"
for file in "${!changed_file_set[@]}"; do
case "$file" in
internal/db/driver_agent_revisions_gen.go)
revision_delta="$(revision_file_changed_drivers)"
if [[ -z "$revision_delta" ]]; then
echo "检测到 driver-agent revision 文件存在无法归因的变更;保守构建全部 driver-agent$file" >&2
all_drivers_csv
exit 0
fi
add_forced_drivers_from_tokens "$revision_delta"
;;
go.mod|go.sum|build-driver-agents.sh|tools/generate-driver-agent-revisions.sh)
set +e
shared_delta="$(shared_file_driver_delta "$file")"
@@ -487,7 +518,9 @@ for file in "${!changed_file_set[@]}"; do
exit 0
;;
tools/detect-changed-driver-agents.sh)
# This script only selects CI work; it is not embedded in driver-agent binaries.
echo "检测到 driver-agent 变更检测脚本更新;保守构建全部 driver-agent$file" >&2
all_drivers_csv
exit 0
;;
esac
done

View File

@@ -0,0 +1,72 @@
#!/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
)
echo "detect-changed-driver-agents revision test passed"