test: add historical sdk compatibility rehearsal
This commit is contained in:
117
scripts/test-historical-sdk-compatibility.sh
Executable file
117
scripts/test-historical-sdk-compatibility.sh
Executable 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"
|
||||
'
|
||||
Reference in New Issue
Block a user