diff --git a/scripts/db-migration/run-migration-test.sh b/scripts/db-migration/run-migration-test.sh index 142e0d0db6..285b85cc17 100644 --- a/scripts/db-migration/run-migration-test.sh +++ b/scripts/db-migration/run-migration-test.sh @@ -19,6 +19,7 @@ set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" FIXTURE_DIR="${FIXTURE_DIR:-$REPO_ROOT/app/proprietary/src/test/resources/db-migration-fixtures}" STIRLING_JAR="${STIRLING_JAR:-}" +JAVA_BIN="${JAVA_BIN:-${MIGRATION_TEST_JAVA:-}}" ADMIN_USERNAME="${ADMIN_USERNAME:-admin}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-stirling}" STARTUP_TIMEOUT_SEC="${STARTUP_TIMEOUT_SEC:-300}" @@ -26,6 +27,54 @@ STARTUP_TIMEOUT_SEC="${STARTUP_TIMEOUT_SEC:-300}" log() { printf '[migration-test] %s\n' "$*" >&2; } fail() { printf '[migration-test][FAIL] %s\n' "$*" >&2; exit 1; } +java_major_version() { + local java_bin="$1" + "$java_bin" -XshowSettings:properties -version 2>&1 \ + | awk -F'= ' '/java.specification.version =/ { print $2; exit }' +} + +# The runner JAR is Java 25 class files; the host default `java` may be older. +# Prefer JAVA_BIN/MIGRATION_TEST_JAVA, then JAVA_HOME, then the JDK 25 homes +# GitHub's setup-java exports, then PATH. +find_java() { + local candidate + if [[ -n "$JAVA_BIN" ]]; then + if [[ -x "$JAVA_BIN" ]]; then + candidate="$JAVA_BIN" + elif command -v "$JAVA_BIN" >/dev/null 2>&1; then + candidate=$(command -v "$JAVA_BIN") + else + fail "JAVA_BIN/MIGRATION_TEST_JAVA='$JAVA_BIN' is not executable or on PATH" + fi + elif [[ -n "${JAVA_HOME:-}" && -x "${JAVA_HOME}/bin/java" ]]; then + candidate="${JAVA_HOME}/bin/java" + else + local java_home_var + for java_home_var in JAVA_HOME_25_X64 JAVA_HOME_25_ARM64 JAVA_HOME_25_AARCH64; do + local java_home="${!java_home_var:-}" + if [[ -n "$java_home" && -x "$java_home/bin/java" ]]; then + candidate="$java_home/bin/java" + break + fi + done + if [[ -z "${candidate:-}" ]]; then + candidate=$(command -v java || true) + fi + fi + [[ -n "${candidate:-}" ]] || fail "No java executable found; install JDK 25 or set JAVA_BIN" + realpath "$candidate" +} + +assert_supported_java() { + local java_bin="$1" + local major + major=$(java_major_version "$java_bin") + [[ -n "$major" ]] || fail "Could not determine Java version from '$java_bin'" + if (( major < 25 )); then + fail "Migration test requires JDK 25+ to run the built JAR, but '$java_bin' is Java $major. Set JAVA_HOME or JAVA_BIN to a JDK 25 installation." + fi +} + find_jar() { local candidate if [[ -n "$STIRLING_JAR" ]]; then @@ -63,6 +112,7 @@ test_fixture() { log "=== $label ===" local jar; jar=$(find_jar) + local java_bin="$MIGRATION_JAVA_BIN" local workdir; workdir=$(mktemp -d) local configsdir="$workdir/configs" mkdir -p "$configsdir" @@ -73,6 +123,7 @@ test_fixture() { local log_file="$workdir/app.log" log " jar=$jar" + log " java=$java_bin ($("$java_bin" -version 2>&1 | head -n 1))" log " workdir=$workdir" log " port=$port" @@ -88,7 +139,7 @@ test_fixture() { # Quarkus reads config from -D system properties (which must precede -jar), # not Spring's post-jar --key=value args. Translated 1:1 from the former # Spring properties; system properties override application.properties. - java -Xmx1g \ + "$java_bin" -Xmx1g \ "-Dquarkus.http.port=$port" \ "-Dquarkus.datasource.jdbc.url=jdbc:h2:file:./configs/stirling-pdf-DB-2.3.232;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;MODE=PostgreSQL" \ "-Dquarkus.hibernate-orm.log.sql=false" \ @@ -172,6 +223,8 @@ test_fixture() { main() { [[ -d "$FIXTURE_DIR" ]] || fail "Fixture dir not found: $FIXTURE_DIR" + MIGRATION_JAVA_BIN=$(find_java) + assert_supported_java "$MIGRATION_JAVA_BIN" local fixtures mapfile -t fixtures < <(find "$FIXTURE_DIR" -maxdepth 1 -name '*.mv.db' | sort) [[ ${#fixtures[@]} -gt 0 ]] || fail "No fixtures under $FIXTURE_DIR"