53 lines
3.2 KiB
Bash
Executable File
53 lines
3.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# 独立业务库 + 真实 Orbit 进程;仅操作本脚本创建的隔离容器和目录。
|
|
set -eu
|
|
TASK_GO=${GO:-go}
|
|
TASK_NAME="orbit-adapters-test-$$"
|
|
TASK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/orbit-adapters.XXXXXX")
|
|
TASK_PID=
|
|
cleanup() {
|
|
if [ -n "$TASK_PID" ]; then kill "$TASK_PID" >/dev/null 2>&1 || true; wait "$TASK_PID" 2>/dev/null || true; fi
|
|
docker stop "$TASK_NAME" >/dev/null 2>&1 || true
|
|
docker container rm "$TASK_NAME" >/dev/null 2>&1 || true
|
|
for TASK_FILE in "$TASK_DIR"/*; do if [ -f "$TASK_FILE" ]; then unlink "$TASK_FILE"; fi; done
|
|
rmdir "$TASK_DIR"
|
|
}
|
|
trap cleanup EXIT HUP INT TERM
|
|
umask 077
|
|
TASK_PASSWORD=$(openssl rand -hex 24)
|
|
printf 'MYSQL_ROOT_PASSWORD=%s\nMYSQL_DATABASE=orbit_test\n' "$TASK_PASSWORD" > "$TASK_DIR/mysql.env"
|
|
docker run -d --name "$TASK_NAME" --env-file "$TASK_DIR/mysql.env" -p 127.0.0.1::3306 "${ORBIT_TEST_MYSQL_IMAGE:-mysql:8.4}" >/dev/null
|
|
TASK_READY=0
|
|
for TASK_ATTEMPT in $(seq 1 60); do
|
|
if docker exec "$TASK_NAME" sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot --protocol=tcp -e "SELECT 1" >/dev/null 2>&1'; then TASK_READY=1; break; fi
|
|
sleep 1
|
|
done
|
|
if [ "$TASK_READY" -ne 1 ]; then echo 'isolated MySQL startup failed' >&2; exit 1; fi
|
|
TASK_PORT=$(docker port "$TASK_NAME" 3306/tcp | sed 's/.*://')
|
|
export ORBIT_MYSQL_DSN="root:$TASK_PASSWORD@tcp(127.0.0.1:$TASK_PORT)/orbit_test"
|
|
"$TASK_GO" build -o "$TASK_DIR/orbit" ./cmd/orbit
|
|
"$TASK_GO" build -o "$TASK_DIR/admin" ./cmd/orbit-admin
|
|
"$TASK_GO" run ./cmd/orbit-migrate up
|
|
"$TASK_DIR/admin" bootstrap --application adapters-test --namespace default --environment test --queue sender --output "$TASK_DIR/sender.json"
|
|
"$TASK_DIR/admin" bootstrap --application http-example --namespace default --environment test --queue http --worker-access --event-access --output "$TASK_DIR/http.json"
|
|
ORBIT_HTTP_ADDR=127.0.0.1:0 "$TASK_DIR/orbit" >"$TASK_DIR/orbit.log" 2>&1 &
|
|
TASK_PID=$!
|
|
TASK_HTTP_PORT=
|
|
for TASK_ATTEMPT in $(seq 1 20); do
|
|
TASK_HTTP_PORT=$(sed -n 's/.*"address":"127.0.0.1:\([0-9]*\)".*/\1/p' "$TASK_DIR/orbit.log" | head -n 1)
|
|
if [ -n "$TASK_HTTP_PORT" ]; then break; fi
|
|
if ! kill -0 "$TASK_PID" 2>/dev/null; then echo 'Orbit startup failed' >&2; exit 1; fi
|
|
sleep 1
|
|
done
|
|
if [ -z "$TASK_HTTP_PORT" ]; then echo 'Orbit listener not ready' >&2; exit 1; fi
|
|
docker exec "$TASK_NAME" sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot --protocol=tcp -e "CREATE DATABASE orbit_sender_test CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin; CREATE DATABASE orbit_http_test CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin"'
|
|
export ORBIT_TEST_SENDER_DSN="root:$TASK_PASSWORD@tcp(127.0.0.1:$TASK_PORT)/orbit_sender_test"
|
|
export ORBIT_TEST_SENDER_URL="http://127.0.0.1:$TASK_HTTP_PORT"
|
|
export ORBIT_TEST_SENDER_CREDENTIALS_FILE="$TASK_DIR/sender.json"
|
|
(cd examples/task-outbox && GOWORK=off ORBIT_SENDER_DSN="$ORBIT_TEST_SENDER_DSN" "$TASK_GO" run ./cmd/sender init)
|
|
(cd adapters/outbox/mysql && GOWORK=off "$TASK_GO" test -race -count=1 -run Integration -v ./...)
|
|
export ORBIT_TEST_HTTP_DSN="root:$TASK_PASSWORD@tcp(127.0.0.1:$TASK_PORT)/orbit_http_test"
|
|
export ORBIT_TEST_HTTP_URL="http://127.0.0.1:$TASK_HTTP_PORT"
|
|
export ORBIT_TEST_HTTP_CREDENTIALS_FILE="$TASK_DIR/http.json"
|
|
(cd examples/http-service && GOWORK=off "$TASK_GO" test -race -count=1 -run Integration -v ./...)
|