refactor: modular init, add bedrock loader, dynamic java/healthcheck
Build dev image / build (push) Failing after 18m12s
Build dev image / build (push) Failing after 18m12s
- 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
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
#!/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 ]]
|
||||
Reference in New Issue
Block a user