#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" usage() { cat <<'USAGE' Usage: ./scripts/deploy-backend.sh [--skip-docker] Options: --skip-docker Build jar only, skip docker compose build/up USAGE } log() { printf '[deploy] %s\n' "$*" } SKIP_DOCKER=0 while [[ $# -gt 0 ]]; do case "$1" in --skip-docker) SKIP_DOCKER=1 shift ;; -h|--help) usage exit 0 ;; *) echo "Unknown option: $1" >&2 usage exit 1 ;; esac done "$SCRIPT_DIR/ensure-martial-tool-installed.sh" log "Packaging backend jar ..." ( cd "$PROJECT_DIR" mvn clean package -DskipTests ) if [[ "$SKIP_DOCKER" -eq 1 ]]; then log "--skip-docker enabled, jar build finished." exit 0 fi log "Building and restarting martial-api ..." ( cd "$PROJECT_DIR" docker compose build martial-api docker compose up -d --no-deps martial-api ) log "Waiting for martial-api health ..." for _ in $(seq 1 60); do json="$(cd "$PROJECT_DIR" && docker compose ps --format json martial-api 2>/dev/null || true)" health="$(printf '%s\n' "$json" | sed -n 's/.*"Health":"\([^"]*\)".*/\1/p' | head -n 1)" status="$(printf '%s\n' "$json" | sed -n 's/.*"Status":"\([^"]*\)".*/\1/p' | head -n 1)" if [[ "$health" == "healthy" ]]; then log "martial-api is healthy." exit 0 fi if printf '%s' "$status" | grep -Eiq 'unhealthy|exited|dead'; then echo "[deploy] ERROR: martial-api status=$status" >&2 exit 1 fi sleep 3 done echo "[deploy] ERROR: timed out waiting for martial-api health" >&2 (cd "$PROJECT_DIR" && docker compose ps martial-api) exit 1