mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-12 16:02:48 +08:00
🐛 fix(driver-manager): 修复驱动 revision 错配与安装卡住
- 修复 revision 生成文件变更未触发 driver-agent 构建的问题 - 检测脚本自身变更时保守触发全量 driver-agent 构建 - 调整 dev 构建驱动安装策略为发布包优先、源码构建兜底 - 为驱动总包下载和源码构建增加超时边界 - 为驱动管理安装流程增加前端看门狗并补充回归测试
This commit is contained in:
@@ -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
|
||||
|
||||
72
tools/detect-changed-driver-agents.test.sh
Executable file
72
tools/detect-changed-driver-agents.test.sh
Executable 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"
|
||||
Reference in New Issue
Block a user