Files
dockercraft/test.sh
T
jeremy 6e13a0aa15
Build dev image / build (push) Failing after 18m12s
refactor: modular init, add bedrock loader, dynamic java/healthcheck
- Split monolithic init into modular lib files under scripts/lib/
  (common.sh, java.sh, server.sh, loaders/{vanilla,paper,fabric,forge,neoforge}.sh)
- Add bedrock loader: downloads from Minecraft Services API,
  runs native binary with LD_LIBRARY_PATH, skips Java setup
- Add auto-detection for JAVA_VERSION from Mojang version manifest
  (MC 1.20.5+ -> temurin@21, 1.17-1.20.4 -> temurin@17,
   1.17 -> temurin@16, pre-1.17 -> temurin@8)
- Fix NEW_FORGE unbound variable when non-Forge loaders run
- Fix Fabric loader jq filter (-s slurp removed, null string check fixed)
- Fix Forge test detection (recursive find for forge-*-server.jar)
- Dynamic healthcheck: nc -z TCP 25565 for Java, nc -zu UDP 19132 for bedrock
- Add .gitea/workflows/build-dev.yml for dev branch CI builds
- Base image: debian:bookworm-slim (from ubuntu:noble)
- Add unzip, netcat-openbsd to Docker image
- Switch to shebangs, set -euo pipefail throughout
2026-06-17 18:41:26 -04:00

178 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<EOF
Usage: $(basename "$0") [options]
Test Minecraft server loader integrations in isolated Docker containers.
Options:
-m, --mc-version <ver> Minecraft version (default: auto-detect latest)
-l, --loader <name> Loader to test (default: all)
-v, --loader-version <v> Loader version (default: auto-detect latest)
-h, --help Show this help
Examples:
$(basename "$0") Test all loaders (latest MC)
$(basename "$0") -m 1.21.1 Test all loaders on MC 1.21.1
$(basename "$0") -m 1.21.1 -l fabric Test Fabric on MC 1.21.1
$(basename "$0") -m 1.21.1 -l fabric -v 0.19.3 Test Fabric 0.19.3 on MC 1.21.1
Loaders: vanilla paper fabric forge neoforge bedrock
EOF
exit 0
}
detect_mc_version() {
curl -s https://launchermeta.mojang.com/mc/game/version_manifest.json | \
jq -r '.latest.release'
}
IMAGE="dockercraft-test:latest"
MC_VERSION=""
LOADER=""
LOADER_VERSION=""
PASS=0
FAIL=0
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help) usage ;;
-m|--mc-version) MC_VERSION="$2"; shift 2 ;;
-l|--loader) LOADER="$2"; shift 2 ;;
-v|--loader-version) LOADER_VERSION="$2"; shift 2 ;;
*) echo "Unknown option: $1"; usage ;;
esac
done
if [[ -z "$MC_VERSION" ]]; then
echo "Detecting latest Minecraft version..."
MC_VERSION=$(detect_mc_version)
echo "${MC_VERSION}"
fi
if [[ -z "$LOADER" ]]; then
tests=("vanilla" "paper" "fabric" "forge" "neoforge" "bedrock")
else
tests=("$LOADER")
fi
cleanup() {
local name="$1"
docker kill "dc-test-${name}" 2>/dev/null || true
docker rm "dc-test-${name}" 2>/dev/null || true
}
run_test() {
local name="$1"
shift
echo "=== Testing: ${name} ==="
cleanup "$name"
local data_dir
data_dir=$(mktemp -d)
if CONTAINER_ID=$(docker run -d --name "dc-test-${name}" \
-e EULA=true \
-e MC_VERSION="${MC_VERSION}" \
"$@" \
-v "${data_dir}:/data" \
"${IMAGE}" 2>&1); then
local waited=0
local jar_found=false
while [[ $waited -lt 180 ]]; do
if [[ -f "${data_dir}/server/server.jar" ]] || \
(find "${data_dir}/server" -name 'forge-*-server.jar' 2>/dev/null | grep -q .) || \
[[ -f "${data_dir}/server/bedrock_server" ]]; then
jar_found=true
break
fi
sleep 3
waited=$((waited + 3))
echo -n "."
done
echo ""
if $jar_found; then
if [[ -f "${data_dir}/server/bedrock_server" ]]; then
echo " PASS (bedrock_server found in ~${waited}s)"
else
echo " PASS (server jar found in ~${waited}s)"
fi
PASS=$((PASS + 1))
else
echo ""
echo " FAIL: server.jar not found after 180s"
echo " --- container logs ---"
docker logs "dc-test-${name}" 2>&1 || true
echo " ---------------------"
FAIL=$((FAIL + 1))
fi
else
echo ""
echo " FAIL: container failed to start"
echo " ${CONTAINER_ID}"
FAIL=$((FAIL + 1))
fi
cleanup "$name"
rm -rf "$data_dir"
}
echo "Building image..."
docker build -t "${IMAGE}" .
echo "Pre-warming Java cache..."
WARM_ID=$(docker run -d --name "dc-warm" \
-e MC_VERSION="${MC_VERSION}" \
-e MC_LOADER=vanilla \
-e EULA=true \
-v "$(mktemp -d):/data" \
"${IMAGE}" 2>&1) && sleep 5
docker kill "dc-warm" 2>/dev/null || true
docker rm "dc-warm" 2>/dev/null || true
echo " done"
for t in "${tests[@]}"; do
case $t in
vanilla)
run_test "vanilla" -e MC_LOADER=vanilla
;;
paper)
run_test "paper" -e MC_LOADER=paper
;;
fabric)
run_test "fabric" \
-e MC_LOADER=fabric \
-e FABRIC_LOADER_VERSION="${LOADER_VERSION}"
;;
forge)
run_test "forge" \
-e MC_LOADER=forge \
-e FORGE_VERSION="${LOADER_VERSION}"
;;
neoforge)
run_test "neoforge" \
-e MC_LOADER=neoforge \
-e NEOFORGE_VERSION="${LOADER_VERSION}"
;;
bedrock)
run_test "bedrock" \
-e MC_LOADER=bedrock \
-e MC_VERSION=
;;
*)
echo "Unknown loader: ${t}"
echo "Valid: vanilla paper fabric forge neoforge bedrock"
exit 1
;;
esac
done
echo ""
echo "Results: ${PASS} passed, ${FAIL} failed"
[[ $FAIL -eq 0 ]]