🐛 fix(driver): 修复驱动代理 revision 误触发重装并优化事务提示

This commit is contained in:
Syngnat
2026-06-12 11:07:41 +08:00
parent e83c9f5553
commit 5061ec081a
9 changed files with 172 additions and 66 deletions

View File

@@ -346,7 +346,7 @@ revision_file_changed_drivers() {
is_ignored_driver_agent_source_file() {
case "$1" in
*_test.go|frontend/*|internal/app/*)
*_test.go|frontend/*|internal/app/*|internal/appdata/*|internal/connection/*|internal/logger/*)
return 0
;;
esac
@@ -489,6 +489,22 @@ if [[ ${#changed_file_set[@]} -eq 0 ]]; then
exit 0
fi
has_revision_file_change=false
only_workflow_changes=true
for file in "${!changed_file_set[@]}"; do
case "$file" in
internal/db/driver_agent_revisions_gen.go)
has_revision_file_change=true
only_workflow_changes=false
;;
.github/workflows/dev-build.yml|.github/workflows/release.yml)
;;
*)
only_workflow_changes=false
;;
esac
done
declare -a forced_changed_drivers=()
forced_driver_seen="|"
for file in "${!changed_file_set[@]}"; do
@@ -527,6 +543,12 @@ for file in "${!changed_file_set[@]}"; do
exit 0
;;
.github/workflows/dev-build.yml|.github/workflows/release.yml)
if [[ "$has_revision_file_change" == "true" ]]; then
continue
fi
if [[ "$only_workflow_changes" == "true" && -f internal/db/driver_agent_revisions_gen.go ]]; then
continue
fi
echo "检测到 driver-agent 构建/发布工作流变更;保守构建全部 driver-agent$file" >&2
all_drivers_csv
exit 0

View File

@@ -11,9 +11,13 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$SCRIPT_DIR"
tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-detect-driver-revisions.XXXXXX")"
tmpdir_connection=""
tmpdir_script=""
cleanup() {
rm -rf "$tmpdir"
if [[ -n "$tmpdir_connection" ]]; then
rm -rf "$tmpdir_connection"
fi
if [[ -n "$tmpdir_script" ]]; then
rm -rf "$tmpdir_script"
fi
@@ -50,6 +54,33 @@ GOEOF
fi
)
tmpdir_connection="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-detect-connection-change.XXXXXX")"
git init -q "$tmpdir_connection"
mkdir -p "$tmpdir_connection/tools" "$tmpdir_connection/internal/connection"
cp tools/detect-changed-driver-agents.sh "$tmpdir_connection/tools/detect-changed-driver-agents.sh"
cat >"$tmpdir_connection/internal/connection/types.go" <<'GOEOF'
package connection
type ConnectionConfig struct {
Type string `json:"type"`
}
GOEOF
(
cd "$tmpdir_connection"
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/Type string/RedisSentinelLabel string `json:"redisSentinelLabel,omitempty"`\n\tType string/' internal/connection/types.go
git add internal/connection/types.go
git -c user.name=GoNavi -c user.email=gonavi@example.test commit -q -m 'add redis-only connection field'
actual="$(bash ./tools/detect-changed-driver-agents.sh --base "$base" --head HEAD)"
if [[ -n "$actual" ]]; then
echo "expected connection-only field change to keep driver-agent detection empty, got: ${actual}" >&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"

View File

@@ -4,6 +4,8 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$SCRIPT_DIR"
SCRIPT_DIR_WINDOWS="$(pwd -W 2>/dev/null || true)"
SCRIPT_DIR_WINDOWS="${SCRIPT_DIR_WINDOWS//\\//}"
DEFAULT_DRIVERS=(mariadb oceanbase diros starrocks sphinx sqlserver sqlite duckdb dameng kingbase highgo vastbase opengauss iris mongodb tdengine clickhouse elasticsearch)
OUTPUT_FILE="internal/db/driver_agent_revisions_gen.go"
@@ -145,6 +147,11 @@ elasticsearch:internal/db/elasticsearch_helpers.go)
should_include_source_file() {
local driver="$1"
local identity="$2"
case "$identity" in
internal/appdata/*|internal/connection/*|internal/logger/*)
return 1
;;
esac
if [[ "$identity" == internal/db/* ]]; then
should_include_internal_db_file "$driver" "$identity"
return
@@ -193,6 +200,7 @@ fi
goos="${target_platform%%/*}"
goarch="${target_platform##*/}"
gomodcache="$(go env GOMODCACHE)"
gomodcache="${gomodcache//\\//}"
declare -a drivers=()
if [[ -n "$driver_csv" ]]; then
@@ -277,18 +285,23 @@ fingerprint_driver() {
} >"$tmp"
while IFS= read -r file; do
file="${file//\\//}"
[[ -n "$file" && -f "$file" ]] || continue
case "$file" in
"$SCRIPT_DIR"/*)
identity="${file#$SCRIPT_DIR/}"
;;
"$gomodcache"/*)
identity="gomod/${file#$gomodcache/}"
;;
*)
identity="$file"
;;
esac
if [[ -n "$SCRIPT_DIR_WINDOWS" && "$file" == "$SCRIPT_DIR_WINDOWS"/* ]]; then
identity="${file#$SCRIPT_DIR_WINDOWS/}"
else
case "$file" in
"$SCRIPT_DIR"/*)
identity="${file#$SCRIPT_DIR/}"
;;
"$gomodcache"/*)
identity="gomod/${file#$gomodcache/}"
;;
*)
identity="$file"
;;
esac
fi
if [[ "$identity" == "$OUTPUT_FILE" ]]; then
continue
fi

View File

@@ -11,44 +11,30 @@ extract_revision() {
sed -n "s/.*\"${driver}\"[[:space:]]*:[[:space:]]*\"\\([^\"]*\\)\".*/\\1/p" "$file" | head -n 1
}
run_case() {
local platform="$1"
local drivers="$2"
local tmpdir
tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-generate-driver-revisions.XXXXXX")"
trap 'rm -rf "$tmpdir"' RETURN
rsync -a --exclude .git ./ "$tmpdir/" >/dev/null
(
cd "$tmpdir"
GONAVI_DRIVER_REVISION_JOBS=1 bash ./tools/generate-driver-agent-revisions.sh --platform "$platform" --drivers "$drivers" >/dev/null
cat internal/db/driver_agent_revisions_gen.go
)
copy_repo_to_tmp() {
local target="$1"
git ls-files -z | tar --null -T - -cf - | (cd "$target" && tar -xf -)
}
darwin_output="$(run_case darwin/arm64 mariadb,duckdb)"
windows_output="$(run_case windows/amd64 mariadb,duckdb)"
tmpdir_platform="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-generate-driver-revisions-platform.XXXXXX")"
tmpdir_connection="$(mktemp -d "${TMPDIR:-/tmp}/gonavi-generate-driver-revisions-connection.XXXXXX")"
darwin_file="$(mktemp "${TMPDIR:-/tmp}/gonavi-darwin-revisions.XXXXXX")"
windows_file="$(mktemp "${TMPDIR:-/tmp}/gonavi-windows-revisions.XXXXXX")"
cleanup() {
rm -rf "$tmpdir_platform" "$tmpdir_connection"
rm -f "$darwin_file" "$windows_file"
}
trap cleanup EXIT
printf '%s\n' "$darwin_output" >"$darwin_file"
printf '%s\n' "$windows_output" >"$windows_file"
copy_repo_to_tmp "$tmpdir_platform"
darwin_mariadb="$(extract_revision "$darwin_file" mariadb)"
windows_mariadb="$(extract_revision "$windows_file" mariadb)"
if [[ -z "$darwin_mariadb" || -z "$windows_mariadb" ]]; then
echo "expected mariadb revision to be generated for both platforms" >&2
exit 1
fi
if [[ "$darwin_mariadb" == "$windows_mariadb" ]]; then
echo "expected mariadb revision to differ between darwin/arm64 and windows/amd64, got identical value: $darwin_mariadb" >&2
exit 1
fi
(
cd "$tmpdir_platform"
GONAVI_DRIVER_REVISION_JOBS=1 bash ./tools/generate-driver-agent-revisions.sh --platform darwin/arm64 --drivers duckdb >/dev/null
cp internal/db/driver_agent_revisions_gen.go "$darwin_file"
GONAVI_DRIVER_REVISION_JOBS=1 bash ./tools/generate-driver-agent-revisions.sh --platform windows/amd64 --drivers duckdb >/dev/null
cp internal/db/driver_agent_revisions_gen.go "$windows_file"
)
darwin_duckdb="$(extract_revision "$darwin_file" duckdb)"
windows_duckdb="$(extract_revision "$windows_file" duckdb)"
@@ -61,4 +47,33 @@ if [[ "$darwin_duckdb" == "$windows_duckdb" ]]; then
exit 1
fi
copy_repo_to_tmp "$tmpdir_connection"
(
cd "$tmpdir_connection"
GONAVI_DRIVER_REVISION_JOBS=1 bash ./tools/generate-driver-agent-revisions.sh --platform windows/amd64 --drivers sqlserver >/dev/null
before_file="$(mktemp "${TMPDIR:-/tmp}/gonavi-sqlserver-revision-before.XXXXXX")"
after_file="$(mktemp "${TMPDIR:-/tmp}/gonavi-sqlserver-revision-after.XXXXXX")"
cleanup_sqlserver_revision_files() {
rm -f "$before_file" "$after_file"
}
trap cleanup_sqlserver_revision_files EXIT
cp internal/db/driver_agent_revisions_gen.go "$before_file"
perl -0pi -e 's/RedisSentinelMaster string/RedisSentinelLabel string `json:"redisSentinelLabel,omitempty"`\n\tRedisSentinelMaster string/' internal/connection/types.go
GONAVI_DRIVER_REVISION_JOBS=1 bash ./tools/generate-driver-agent-revisions.sh --platform windows/amd64 --drivers sqlserver >/dev/null
cp internal/db/driver_agent_revisions_gen.go "$after_file"
before_sqlserver="$(extract_revision "$before_file" sqlserver)"
after_sqlserver="$(extract_revision "$after_file" sqlserver)"
if [[ -z "$before_sqlserver" || -z "$after_sqlserver" ]]; then
echo "expected sqlserver revision to be generated before and after connection-only change" >&2
exit 1
fi
if [[ "$before_sqlserver" != "$after_sqlserver" ]]; then
echo "expected Redis-only connection field change to keep sqlserver revision stable, before=$before_sqlserver after=$after_sqlserver" >&2
exit 1
fi
)
echo "generate-driver-agent-revisions platform test passed"