diff --git a/scripts/dockermap-fixture-up.sh b/scripts/dockermap-fixture-up.sh index 57c042e..12b59ef 100755 --- a/scripts/dockermap-fixture-up.sh +++ b/scripts/dockermap-fixture-up.sh @@ -81,13 +81,14 @@ write_state() { cleanup_on_error() { local exit_code=$? + trap - EXIT INT TERM if [[ "$exit_code" -ne 0 ]]; then echo "[dockermap-fixture] setup failed; attempting cleanup" >&2 "$ROOT_DIR/scripts/dockermap-fixture-down.sh" --state-file "$STATE_FILE" >/dev/null 2>&1 || true fi exit "$exit_code" } -trap cleanup_on_error EXIT +trap cleanup_on_error EXIT INT TERM curl_json() { local url="$1" @@ -397,7 +398,7 @@ echo "[dockermap-fixture] starting unlabeled control container $CONTROL_CONTAINE "${DOCKER_CMD[@]}" run -d --name "$CONTROL_CONTAINER" busybox:1.36.1 sh -c 'while true; do sleep 60; done' >/dev/null echo "[dockermap-fixture] building daemon binary" -cargo build --manifest-path "$ROOT_DIR/crates/Cargo.toml" -p dockermap-daemon >/dev/null +CARGO_INCREMENTAL="${CARGO_INCREMENTAL:-0}" cargo build --manifest-path "$ROOT_DIR/crates/Cargo.toml" -p dockermap-daemon 2>&1 | tee "$LOG_DIR/daemon-build.log" echo "[dockermap-fixture] starting Rust daemon on $DAEMON_URL" PATH="$BIN_DIR:$PATH" \ diff --git a/scripts/run-dev-stack.sh b/scripts/run-dev-stack.sh index 58f5be8..c020188 100755 --- a/scripts/run-dev-stack.sh +++ b/scripts/run-dev-stack.sh @@ -5,23 +5,65 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT_DIR" +PIDS=() + +kill_tree() { + local pid="$1" + [[ -n "$pid" ]] || return 0 + if ! kill -0 "$pid" >/dev/null 2>&1; then + return 0 + fi + + local children=() + local child + if command -v pgrep >/dev/null 2>&1; then + while IFS= read -r child; do + [[ -n "$child" ]] && children+=("$child") + done < <(pgrep -P "$pid" 2>/dev/null || true) + fi + + if ((${#children[@]} > 0)); then + for child in "${children[@]}"; do + kill_tree "$child" + done + fi + + kill "$pid" >/dev/null 2>&1 || true +} + cleanup() { - local pids - mapfile -t pids < <(jobs -pr || true) - if ((${#pids[@]} > 0)); then - kill "${pids[@]}" >/dev/null 2>&1 || true + local exit_code=$? + local pid + trap - EXIT INT TERM + + if ((${#PIDS[@]} > 0)); then + echo + echo "[dockermap] stopping dev stack" + for pid in "${PIDS[@]}"; do + kill_tree "$pid" + done + for pid in "${PIDS[@]}"; do + wait "$pid" >/dev/null 2>&1 || true + done fi + + exit "$exit_code" } trap cleanup EXIT INT TERM +start_background() { + "$@" & + PIDS+=("$!") +} + echo "[dockermap] starting rust daemon on http://127.0.0.1:4100" -cargo run -p dockermap-daemon --manifest-path crates/Cargo.toml & +start_background env CARGO_INCREMENTAL="${CARGO_INCREMENTAL:-0}" cargo run -p dockermap-daemon --manifest-path crates/Cargo.toml echo "[dockermap] starting node api on http://127.0.0.1:4000" -npm run dev:api & +start_background npm run dev:api echo "[dockermap] starting react web on http://127.0.0.1:3233" -npm --workspace @dockermap/web run dev -- --host 127.0.0.1 & +start_background npm --workspace @dockermap/web run dev -- --host 127.0.0.1 --port 3233 --strictPort wait