Files
qipai/scripts/dev/wsl/mysql-migration-roundtrip.sh
T

99 lines
3.3 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
case "${repo_root}" in
/mnt/*|/media/*)
echo "FAIL: run this test from a WSL-native copy, not a mounted Windows path." >&2
exit 2
;;
esac
cd "${repo_root}"
for command in mysql mysqladmin node npm openssl; do
command -v "${command}" >/dev/null || {
echo "FAIL: required command is missing: ${command}" >&2
exit 2
}
done
mysqladmin ping --silent >/dev/null || {
echo "FAIL: local MySQL is not responding." >&2
exit 2
}
mysql_version="$(mysql --batch --skip-column-names -e 'SELECT VERSION()')"
mysql_major="${mysql_version%%.*}"
if [[ "${mysql_major}" != "8" ]]; then
echo "FAIL: MySQL 8 is required; actual version is ${mysql_version}." >&2
exit 2
fi
mysql --batch --skip-column-names -e 'SELECT CURRENT_USER()' >/dev/null
run_id="$(date -u +%Y%m%d%H%M%S)_$$_$(openssl rand -hex 3)"
database="qipai_m01c_test_${run_id}"
username="qmb_$$_$(openssl rand -hex 4)"
password="$(openssl rand -hex 24)"
created=0
cleanup() {
if [[ "${created}" == "1" ]]; then
mysql --batch --skip-column-names <<SQL >/dev/null
DROP DATABASE IF EXISTS \`${database}\`;
DROP USER IF EXISTS '${username}'@'127.0.0.1';
SQL
fi
}
trap cleanup EXIT INT TERM
create_temporary_resources() {
created=1
mysql --batch --skip-column-names <<SQL >/dev/null
CREATE DATABASE \`${database}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER '${username}'@'127.0.0.1' IDENTIFIED BY '${password}';
GRANT ALL PRIVILEGES ON \`${database}\`.* TO '${username}'@'127.0.0.1';
SQL
}
if [[ "${1:-}" == "--force-failure" ]]; then
create_temporary_resources
exit 23
fi
if [[ "${1:-}" == "--cleanup-probe" ]]; then
before_database_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME LIKE 'qipai_m01c_test_%'")"
before_user_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM mysql.user WHERE User LIKE 'qmb_%' AND Host = '127.0.0.1'")"
set +e
bash "${BASH_SOURCE[0]}" --force-failure
probe_status=$?
set -e
[[ "${probe_status}" == "23" ]] || {
echo "FAIL: cleanup probe did not produce the expected interrupted status." >&2
exit 1
}
after_database_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME LIKE 'qipai_m01c_test_%'")"
after_user_count="$(mysql --batch --skip-column-names -e "SELECT COUNT(*) FROM mysql.user WHERE User LIKE 'qmb_%' AND Host = '127.0.0.1'")"
if [[ "${before_database_count}" != "${after_database_count}" || "${before_user_count}" != "${after_user_count}" ]]; then
echo "FAIL: temporary MySQL resources survived an interrupted test." >&2
exit 1
fi
echo "PASS: interrupted-run cleanup removed the temporary database and account."
exit 0
fi
create_temporary_resources
export NODE_ENV=test
export QIPAI_MYSQL_HOST=127.0.0.1
export QIPAI_MYSQL_PORT=3306
export QIPAI_MYSQL_DATABASE="${database}"
export QIPAI_MYSQL_USER="${username}"
export QIPAI_MYSQL_PASSWORD="${password}"
export QIPAI_MYSQL_CONNECTION_LIMIT=2
echo "INFO: MySQL ${mysql_version}; running M01-B through M06-B migration roundtrip in a temporary database."
npm --prefix backend run test:mysql:migration
echo "PASS: M01-B through M06-B live MySQL migration roundtrip completed."