118 lines
4.4 KiB
Bash
Executable File
118 lines
4.4 KiB
Bash
Executable File
#!/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"
|
|
'
|