test: add historical sdk compatibility rehearsal

This commit is contained in:
2026-09-20 17:27:41 +08:00
parent 25382c3257
commit f02e6af279
9 changed files with 172 additions and 12 deletions

View File

@@ -0,0 +1,117 @@
#!/bin/sh
# Rehearses the stable task API in both directions against a historical
# repository commit. This is evidence for a compatibility candidate, not a
# formal release-tag matrix.
set -eu
TASK_ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
TASK_DOCKER=${DOCKER:-docker}
TASK_GO_IMAGE=${ORBIT_COMPAT_GO_IMAGE:-golang:1.27.1}
TASK_MYSQL_IMAGE=${ORBIT_TEST_MYSQL_IMAGE:-mysql:8.4}
TASK_OLD_COMMIT=${ORBIT_COMPAT_OLD_COMMIT:-a50d5fa}
TASK_NAME="orbit-compat-mysql-$$"
TASK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/orbit-compat.XXXXXX")
TASK_SERVER_PID=
cleanup() {
if [ -n "$TASK_SERVER_PID" ]; then
kill "$TASK_SERVER_PID" >/dev/null 2>&1 || true
wait "$TASK_SERVER_PID" 2>/dev/null || true
fi
"$TASK_DOCKER" rm -f "$TASK_NAME" >/dev/null 2>&1 || true
rm -rf "$TASK_DIR"
}
trap cleanup EXIT HUP INT TERM
umask 077
if ! git -C "$TASK_ROOT" cat-file -e "$TASK_OLD_COMMIT^{commit}" 2>/dev/null; then
printf 'historical commit is unavailable: %s\n' "$TASK_OLD_COMMIT" >&2
exit 2
fi
mkdir -p "$TASK_DIR/$TASK_OLD_COMMIT"
git -C "$TASK_ROOT" archive "$TASK_OLD_COMMIT" | tar -x -C "$TASK_DIR/$TASK_OLD_COMMIT"
TASK_DB_PASSWORD=$(openssl rand -hex 24)
"$TASK_DOCKER" run -d --name "$TASK_NAME" \
--network bridge \
-e MYSQL_ROOT_PASSWORD="$TASK_DB_PASSWORD" \
-e MYSQL_DATABASE=orbit_compat_old \
"$TASK_MYSQL_IMAGE" >/dev/null
TASK_READY=0
for task_attempt in $(seq 1 90); do
if "$TASK_DOCKER" exec "$TASK_NAME" sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot --protocol=tcp -h127.0.0.1 -P3306 -e "SELECT 1" >/dev/null 2>&1'; then
TASK_READY=1
break
fi
sleep 1
done
if [ "$TASK_READY" -ne 1 ]; then
"$TASK_DOCKER" logs --tail 40 "$TASK_NAME" >&2 || true
exit 1
fi
TASK_DB_HOST=$("$TASK_DOCKER" inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$TASK_NAME")
"$TASK_DOCKER" exec "$TASK_NAME" sh -c \
'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot --protocol=tcp -h127.0.0.1 -P3306 -e "CREATE DATABASE orbit_compat_new CHARACTER SET utf8mb4 COLLATE utf8mb4_bin"'
TASK_OLD_DSN="root:$TASK_DB_PASSWORD@tcp($TASK_DB_HOST:3306)/orbit_compat_old"
TASK_NEW_DSN="root:$TASK_DB_PASSWORD@tcp($TASK_DB_HOST:3306)/orbit_compat_new"
"$TASK_DOCKER" run --rm --network bridge \
-v "$TASK_ROOT:/workspace" -v "$TASK_DIR:/out" \
-e TASK_OLD_COMMIT="$TASK_OLD_COMMIT" \
-e TASK_OLD_DSN="$TASK_OLD_DSN" -e TASK_NEW_DSN="$TASK_NEW_DSN" \
-e TASK_GO_IMAGE="$TASK_GO_IMAGE" "$TASK_GO_IMAGE" sh -ec '
set -eu
export GOWORK=off GOCACHE=/out/go-cache GOMODCACHE=/out/go-mod
mkdir -p /out/go-cache /out/go-mod
cd /workspace
go version
go build -o /out/new-orbit ./cmd/orbit
go build -o /out/new-migrate ./cmd/orbit-migrate
go build -o /out/new-admin ./cmd/orbit-admin
cd /out/'"$TASK_OLD_COMMIT"'
go build -o /out/old-orbit ./cmd/orbit
go build -o /out/old-migrate ./cmd/orbit-migrate
go build -o /out/old-admin ./cmd/orbit-admin
wait_server() {
log=$1
port=
for attempt in $(seq 1 40); do
port=$(sed -n "s/.*\"address\":\"127.0.0.1:\\([0-9]*\\)\".*/\\1/p" "$log" | head -n 1)
if [ -n "$port" ]; then
echo "$port"
return 0
fi
sleep 1
done
cat "$log" >&2
return 1
}
run_direction() {
label=$1
server=$2
migrate=$3
admin=$4
dsn=$5
credentials=/out/$label.credentials.json
log=/out/$label.server.log
ORBIT_MYSQL_DSN="$dsn" "$migrate" up >/dev/null
ORBIT_MYSQL_DSN="$dsn" "$admin" bootstrap --application "compat-$label" --namespace default --environment test --queue stable --output "$credentials" >/dev/null
ORBIT_MYSQL_DSN="$dsn" ORBIT_METRICS_ADDR=127.0.0.1:0 ORBIT_HTTP_ADDR=127.0.0.1:0 "$server" >"$log" 2>&1 &
pid=$!
port=$(wait_server "$log")
if [ "$label" = old-server-current-sdk ]; then
(cd /workspace/sdk/go && ORBIT_SKIP_SOURCE=1 ORBIT_URL="http://127.0.0.1:$port" ORBIT_CREDENTIALS_FILE="$credentials" go run ./examples/tasks)
else
(cd /out/'"$TASK_OLD_COMMIT"'/sdk/go && ORBIT_URL="http://127.0.0.1:$port" ORBIT_CREDENTIALS_FILE="$credentials" go run ./examples/tasks)
fi
kill "$pid" >/dev/null 2>&1 || true
wait "$pid" 2>/dev/null || true
}
run_direction old-server-current-sdk /out/old-orbit /out/old-migrate /out/old-admin "$TASK_OLD_DSN"
run_direction current-server-old-sdk /out/new-orbit /out/new-migrate /out/new-admin "$TASK_NEW_DSN"
printf "{\"historical_commit\":\"%s\",\"old_server_current_sdk\":\"passed\",\"current_server_old_sdk\":\"passed\",\"scope\":\"stable task API smoke; not a formal release-tag matrix\"}\n" "$TASK_OLD_COMMIT"
'