#!/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" '