From 486e25f86bb26b88a0502076888de017ddda6654 Mon Sep 17 00:00:00 2001 From: john Date: Thu, 16 Jul 2026 22:37:50 +0800 Subject: [PATCH] fix(release): validate composed goosed containers --- scripts/release-portal-runtime-prod.sh | 35 ++++++++++++++------------ 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/scripts/release-portal-runtime-prod.sh b/scripts/release-portal-runtime-prod.sh index 4dd9eee..e10bc87 100755 --- a/scripts/release-portal-runtime-prod.sh +++ b/scripts/release-portal-runtime-prod.sh @@ -214,26 +214,30 @@ else fi docker_bin="/opt/homebrew/bin/docker" -if [[ -x "${docker_bin}" ]] && "${docker_bin}" ps --format '{{.Names}}' 2>/dev/null | grep -q '^goosed-prod-1$'; then - goosed_indexes=() - while IFS= read -r name; do - if [[ "${name}" =~ ^goosed-prod-([0-9]+)$ ]]; then +goosed_containers=() +goosed_indexes=() +if [[ -x "${docker_bin}" ]]; then + while IFS='|' read -r name service; do + if [[ "${service}" =~ ^goosed-([0-9]+)$ ]]; then + goosed_containers+=("${name}") goosed_indexes+=("${BASH_REMATCH[1]}") fi - done < <("${docker_bin}" ps --format '{{.Names}}' | sort -V) - if ((${#goosed_indexes[@]} == 0)); then - echo "goosed dependency check failed: no goosed-prod-* containers running" >&2 - missing=1 - fi - for index in "${goosed_indexes[@]}"; do - container="goosed-prod-${index}" + done < <("${docker_bin}" ps \ + --filter 'label=com.docker.compose.project=goosed-prod' \ + --format '{{.Names}}|{{.Label "com.docker.compose.service"}}') +fi +if ((${#goosed_containers[@]} > 0)); then + for position in "${!goosed_containers[@]}"; do + container="${goosed_containers[$position]}" + index="${goosed_indexes[$position]}" host_port=$((18005 + index)) - if ! "${docker_bin}" ps --format '{{.Names}} {{.Ports}} {{.Status}}' | grep -q "^${container} .*0.0.0.0:${host_port}->18006/tcp.*healthy"; then + health="$("${docker_bin}" inspect "${container}" --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' 2>/dev/null || true)" + if [[ "${health}" != "healthy" ]] || ! "${docker_bin}" port "${container}" 18006/tcp 2>/dev/null | grep -q "0.0.0.0:${host_port}$"; then echo "goosed dependency check failed: ${container} is not healthy on host port ${host_port}" >&2 missing=1 fi - if ! "${docker_bin}" exec "${container}" sh -lc 'test -x /usr/local/bin/node && test -f /opt/portal/mindspace-sandbox-mcp.mjs && test -f /opt/portal/tkmind-search-mcp.mjs' >/dev/null 2>&1; then - echo "goosed dependency check failed: ${container} missing /usr/local/bin/node, /opt/portal/mindspace-sandbox-mcp.mjs, or /opt/portal/tkmind-search-mcp.mjs" >&2 + if ! "${docker_bin}" exec "${container}" sh -lc 'test -x /usr/local/bin/node && test -f /opt/portal/mindspace-sandbox-mcp.mjs' >/dev/null 2>&1; then + echo "goosed dependency check failed: ${container} missing /usr/local/bin/node or /opt/portal/mindspace-sandbox-mcp.mjs" >&2 missing=1 fi done @@ -244,8 +248,7 @@ if [[ -x "${docker_bin}" ]] && "${docker_bin}" ps --format '{{.Names}}' 2>/dev/n echo "goosed dependency check failed: Portal .env must set GOOSED_MCP_NODE_PATH and GOOSED_MCP_SERVER_PATH for Docker goosed" >&2 missing=1 else - for index in "${goosed_indexes[@]}"; do - container="goosed-prod-${index}" + for container in "${goosed_containers[@]}"; do if ! "${docker_bin}" exec "${container}" sh -lc "test -x '${portal_mcp_node}' && test -f '${portal_mcp_server}'" >/dev/null 2>&1; then echo "goosed dependency check failed: ${container} cannot resolve Portal .env MCP paths '${portal_mcp_node}' and '${portal_mcp_server}'" >&2 missing=1