#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # shellcheck disable=SC1091 source "$SCRIPT_DIR/common.sh" BUILD_SCRIPT="$SCRIPT_DIR/build_local_backend.sh" PUBLISH_SCRIPT="$SCRIPT_DIR/publish_local_nacos_configs.sh" SKIP_BUILD=false INFRA_ONLY=false FORCE_BUILD=false PARALLEL_PIDS=() PARALLEL_LABELS=() reset_parallel_jobs() { PARALLEL_PIDS=() PARALLEL_LABELS=() } start_parallel_job() { local label="$1" shift "$@" & PARALLEL_PIDS+=("$!") PARALLEL_LABELS+=("$label") } wait_parallel_jobs() { local failed=0 index for index in "${!PARALLEL_PIDS[@]}"; do if ! wait "${PARALLEL_PIDS[$index]}"; then echo "parallel wait failed: ${PARALLEL_LABELS[$index]}" >&2 failed=1 fi done if [ "$failed" -ne 0 ]; then exit 1 fi } wait_infra_ready() { reset_parallel_jobs start_parallel_job mysql wait_container_healthy chatapp3-local-mysql 120 start_parallel_job redis wait_container_healthy chatapp3-local-redis 120 start_parallel_job mongo wait_container_healthy chatapp3-local-mongo 120 start_parallel_job nacos wait_http "http://127.0.0.1:${LIKEI_LOCAL_NACOS_PORT}/nacos/" 120 if ! local_rocketmq_disabled; then start_parallel_job rocketmq wait_local_rocketmq fi wait_parallel_jobs } wait_app_services_ready() { local service reset_parallel_jobs for service in gateway auth other live order wallet console external visual-monitor scheduling golang; do start_parallel_job "$service" wait_service_health "$service" 180 done wait_parallel_jobs } usage() { cat <<'EOF' 用法: ./start_local_services.sh ./start_local_services.sh --skip-build ./start_local_services.sh --infra-only ./start_local_services.sh --rebuild EOF } while [ "$#" -gt 0 ]; do case "$1" in --skip-build) SKIP_BUILD=true ;; --infra-only) INFRA_ONLY=true ;; --rebuild) FORCE_BUILD=true ;; -h|--help) usage exit 0 ;; *) echo "unknown option: $1" >&2 usage >&2 exit 1 ;; esac shift done load_local_env wait_for_docker if [ "$SKIP_BUILD" = false ] && [ "$INFRA_ONLY" = false ]; then if [ "$FORCE_BUILD" = true ] || ! all_local_java_jars_present; then java_major="$(java_major_version || true)" if [ "$java_major" = "17" ]; then "$BUILD_SCRIPT" else if [ "$FORCE_BUILD" = true ]; then echo "rebuilding local Java services requires JDK 17; current java major version is ${java_major:-unknown}" >&2 else echo "local Java jars are missing and the current machine is not using JDK 17" >&2 echo "please switch to JDK 17 and rerun ./start_local_services.sh, or prebuild the jars first" >&2 fi exit 1 fi else echo "local Java jars already exist; skipping build" fi fi compose up -d --remove-orphans mysql redis mongo nacos zookeeper if ! local_rocketmq_disabled; then compose up -d --remove-orphans rocketmq-namesrv rocketmq-init rocketmq-broker rocketmq-proxy fi echo "waiting for local infra..." require_env LIKEI_LOCAL_NACOS_PORT wait_infra_ready "$PUBLISH_SCRIPT" if [ "$INFRA_ONLY" = false ]; then compose up -d --remove-orphans --force-recreate \ gateway auth external other live order wallet console visual-monitor scheduling golang wait_app_services_ready fi compose ps