62 lines
1.7 KiB
Bash
62 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SOURCE_ZIP=/input/source.zip
|
|
WORKSPACE=/tmp/workspace
|
|
OUTPUT=/output
|
|
|
|
mkdir -p "$WORKSPACE" "$OUTPUT"
|
|
unzip -q "$SOURCE_ZIP" -d "$WORKSPACE"
|
|
|
|
BACKEND_DIR=$(find "$WORKSPACE" -name pom.xml -not -path '*/node_modules/*' -printf '%h\n' | head -n 1)
|
|
FRONTEND_DIR=$(find "$WORKSPACE" -name package.json -not -path '*/node_modules/*' -printf '%h\n' | head -n 1 || true)
|
|
|
|
if [[ -z "${BACKEND_DIR:-}" ]]; then
|
|
echo "Generated source has no Maven backend" | tee "$OUTPUT/error.log"
|
|
exit 21
|
|
fi
|
|
|
|
(
|
|
cd "$BACKEND_DIR"
|
|
SERVER_PORT=8081 mvn -B -DskipTests spring-boot:run
|
|
) >"$OUTPUT/backend.log" 2>&1 &
|
|
BACKEND_PID=$!
|
|
|
|
READY_URL=http://127.0.0.1:8081
|
|
FRONTEND_PID=
|
|
if [[ -n "${FRONTEND_DIR:-}" ]]; then
|
|
(
|
|
cd "$FRONTEND_DIR"
|
|
if [[ -f package-lock.json ]]; then npm ci; else npm install; fi
|
|
VITE_APP_API_BASE_URL=http://127.0.0.1:8081 \
|
|
VUE_APP_API_BASE_URL=http://127.0.0.1:8081 \
|
|
npm run dev -- --host 0.0.0.0 --port 8080
|
|
) >"$OUTPUT/frontend.log" 2>&1 &
|
|
FRONTEND_PID=$!
|
|
READY_URL=http://127.0.0.1:8080
|
|
fi
|
|
|
|
for _ in $(seq 1 180); do
|
|
if curl -fsS "$READY_URL" >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
if ! kill -0 "$BACKEND_PID" 2>/dev/null; then
|
|
echo "Backend exited before preview became ready" | tee "$OUTPUT/error.log"
|
|
exit 22
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
curl -fsS "$READY_URL" >/dev/null
|
|
chromium --headless --no-sandbox --disable-gpu --hide-scrollbars \
|
|
--window-size=1440,900 --screenshot="$OUTPUT/screenshot.png" "$READY_URL" \
|
|
>"$OUTPUT/screenshot.log" 2>&1
|
|
printf '{"status":"RUNNING","url":"%s"}\n' "$READY_URL" >"$OUTPUT/ready"
|
|
|
|
if [[ -n "${FRONTEND_PID:-}" ]]; then
|
|
wait -n "$BACKEND_PID" "$FRONTEND_PID"
|
|
else
|
|
wait "$BACKEND_PID"
|
|
fi
|
|
|