hy-app-monitor/testbox/scripts/apply-mysql-baseline.sh

71 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"
env_value() {
python3 "$ROOT_DIR/scripts/env-value.py" "$ROOT_DIR/.env" "$1" "${2:-}"
}
MYSQL_CONTAINER="${MYSQL_CONTAINER:-$(env_value MYSQL_CONTAINER chatapp-test-mysql)}"
MYSQL_DATABASE="${MYSQL_DATABASE:-$(env_value MYSQL_DATABASE likei)}"
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-$(env_value MYSQL_ROOT_PASSWORD)}"
GOLANG_SOURCE_DIR="${GOLANG_SOURCE_DIR:-$(env_value GOLANG_SOURCE_DIR "$ROOT_DIR/sources/chatapp3-golang")}"
JAVA_SOURCE_DIR="${JAVA_SOURCE_DIR:-$(env_value JAVA_SOURCE_DIR "$ROOT_DIR/sources/chatapp3-java")}"
TESTBOX_APPLY_JAVA_SQL="${TESTBOX_APPLY_JAVA_SQL:-$(env_value TESTBOX_APPLY_JAVA_SQL 1)}"
if [ -z "$MYSQL_ROOT_PASSWORD" ]; then
echo "MYSQL_ROOT_PASSWORD is required" >&2
exit 1
fi
mysql_exec() {
docker exec -i "$MYSQL_CONTAINER" mysql -uroot -p"$MYSQL_ROOT_PASSWORD" "$@"
}
echo "waiting mysql..."
for _ in $(seq 1 90); do
if docker exec "$MYSQL_CONTAINER" mysqladmin ping -h 127.0.0.1 -uroot -p"$MYSQL_ROOT_PASSWORD" --silent >/dev/null 2>&1; then
break
fi
sleep 2
done
mysql_exec -e "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
shopt -s nullglob
baseline_files=("$ROOT_DIR"/mysql/baseline/*.sql)
if [ "${#baseline_files[@]}" -eq 0 ]; then
echo "warn: no mysql baseline SQL found in mysql/baseline; Java services need schema/base data before full use" >&2
else
for sql in "${baseline_files[@]}"; do
echo "applying baseline $(basename "$sql")"
mysql_exec "$MYSQL_DATABASE" < "$sql"
done
fi
GO_MIGRATIONS_DIR="$GOLANG_SOURCE_DIR/migrations"
if [ -d "$GO_MIGRATIONS_DIR" ]; then
for sql in "$GO_MIGRATIONS_DIR"/*.sql; do
[ -f "$sql" ] || continue
echo "applying go migration $(basename "$sql")"
mysql_exec "$MYSQL_DATABASE" < "$sql" || {
echo "warn: go migration failed, continuing: $sql" >&2
}
done
fi
JAVA_SQL_DIR="$JAVA_SOURCE_DIR/sql"
if [ "${TESTBOX_APPLY_JAVA_SQL:-1}" = "1" ] && [ -d "$JAVA_SQL_DIR" ]; then
for sql in "$JAVA_SQL_DIR"/*.sql; do
[ -f "$sql" ] || continue
echo "applying java sql $(basename "$sql")"
mysql_exec "$MYSQL_DATABASE" < "$sql" || {
echo "warn: java sql failed, continuing: $sql" >&2
}
done
fi
echo "mysql baseline step done"