From 922f8157fda19e818d3729e118c8969593d38fb9 Mon Sep 17 00:00:00 2001 From: jungwoo choi Date: Sun, 30 Aug 2026 18:16:34 +0900 Subject: [PATCH] =?UTF-8?q?fix(dev):=20dev=20ls/down=20=EB=9F=B0=ED=83=80?= =?UTF-8?q?=EC=9E=84=20=EC=9D=B8=EC=A7=80(=EB=9F=B0=ED=83=80=EC=9E=84=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=20+=20docker=C2=B7podman=20=EB=AA=A8?= =?UTF-8?q?=EB=91=90)=20=E2=80=94=200.21.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- bin/yakcloud | 63 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/bin/yakcloud b/bin/yakcloud index d8ab664..b434e77 100755 --- a/bin/yakcloud +++ b/bin/yakcloud @@ -16,7 +16,7 @@ set -uo pipefail # -e 미사용: 'test && action' 관용구가 값 없을 때 REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}" BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}" -VERSION="0.21.3" +VERSION="0.21.4" # 로컬 개발 클러스터(kind) — 개발 후 운영까지 '직선 배포'의 dev 구간. DEV_CTX="${YAK_DEV_CONTEXT:-kind-yak-dev}" DEV_CLUSTER="${YAK_DEV_CLUSTER:-yak-dev}" @@ -568,46 +568,65 @@ _dev_deregister() { return 0 } -# 로컬 dev 클러스터 목록 — kind 이름 / --name / 콘솔 등록명 매핑. 파괴적 명령(down) 전 대상 확인용. +# 사용 가능한 런타임(docker·podman) 전체에서 yak-* kind 클러스터 나열 — " " 줄. +# 여러 런타임을 섞어 써도 한 번에 보이도록(감지된 하나만 보던 문제). +_dev_all_clusters() { + local rt kenv cs c + for rt in docker podman; do + command -v "$rt" >/dev/null 2>&1 || continue + "$rt" ps -q >/dev/null 2>&1 || continue # 데몬/머신 미동작이면 스킵 + kenv=""; [ "$rt" = podman ] && kenv="KIND_EXPERIMENTAL_PROVIDER=podman" + cs="$(env $kenv kind get clusters 2>/dev/null | grep '^yak-' || true)" + while IFS= read -r c; do [ -n "$c" ] && echo "$rt $c"; done </dev/null 2>&1 || die "kind 필요" - local rt kenv=""; rt="$(_dev_runtime)"; [ "$rt" = podman ] && kenv="KIND_EXPERIMENTAL_PROVIDER=podman" - local cs; cs="$(env $kenv kind get clusters 2>/dev/null | grep '^yak-' || true)" - [ -z "$cs" ] && { echo "로컬 dev 클러스터 없음 — 'yakcloud dev up' 으로 생성."; return 0; } - printf " %-18s %-14s %s\n" "kind 클러스터" "--name" "콘솔 등록명" - local c nm - while IFS= read -r c; do + local all; all="$(_dev_all_clusters)" + [ -z "$all" ] && { echo "로컬 dev 클러스터 없음 — 'yakcloud dev up' 으로 생성."; return 0; } + printf " %-9s %-18s %-14s %s\n" "런타임" "kind 클러스터" "--name" "콘솔 등록명" + local rt c nm + while read -r rt c; do [ -z "$c" ] && continue nm="${c#yak-}"; DEV_NAME="$nm" - printf " %-18s %-14s %s\n" "$c" "$nm" "$(_local_reg_name)" + printf " %-9s %-18s %-14s %s\n" "$rt" "$c" "$nm" "$(_local_reg_name)" done </dev/null 2>&1 || die "kind 필요" - local rt kenv=""; rt="$(_dev_runtime)"; [ "$rt" = podman ] && kenv="KIND_EXPERIMENTAL_PROVIDER=podman" + local all; all="$(_dev_all_clusters)" # " " 줄들(양쪽 런타임) + local rt="" if [ "$name_given" = 0 ]; then - # --name 미지정: 정확히 하나면 그것, 여럿이면 지정 요구(엉뚱한 삭제 방지). 매니페스트 자동선택 안 함(파괴적). - local all n; all="$(env $kenv kind get clusters 2>/dev/null | grep '^yak-' || true)" - n="$(printf '%s\n' "$all" | grep -c . 2>/dev/null || echo 0)" + local n; n="$(printf '%s\n' "$all" | grep -c . 2>/dev/null || echo 0)" if [ "$n" -eq 0 ]; then die "로컬 dev 클러스터가 없습니다 — 'yakcloud dev ls'."; fi if [ "$n" -gt 1 ]; then echo "로컬 클러스터가 여러 개입니다 — 삭제할 것을 --name 으로 지정하세요:"; echo; cmd_dev_ls die "예: yakcloud dev down --name <이름>" fi - DEV_CLUSTER="$(printf '%s' "$all" | head -1)"; DEV_NAME="${DEV_CLUSTER#yak-}"; DEV_CTX="kind-$DEV_CLUSTER" + rt="$(printf '%s' "$all" | awk '{print $1}')"; DEV_CLUSTER="$(printf '%s' "$all" | awk '{print $2}')" + DEV_NAME="${DEV_CLUSTER#yak-}"; DEV_CTX="kind-$DEV_CLUSTER" + else + # --name 지정: 양쪽 런타임에서 yak- 찾기(없으면 가짜 삭제 금지). + local line; line="$(printf '%s\n' "$all" | awk -v c="$DEV_CLUSTER" '$2==c{print; exit}')" + if [ -z "$line" ]; then + echo "로컬 클러스터 '$DEV_CLUSTER' (--name $DEV_NAME) 이(가) 없습니다."; echo; cmd_dev_ls + die "콘솔 '등록명'(예 imac192)이 아니라 위 '--name' 값으로 지정하세요." + fi + rt="$(printf '%s' "$line" | awk '{print $1}')" fi - # 존재 확인 — 없으면 가짜 삭제/해제 금지(오타·'등록명 vs --name' 혼동 방지). - if ! env $kenv kind get clusters 2>/dev/null | grep -qx "$DEV_CLUSTER"; then - echo "로컬 클러스터 '$DEV_CLUSTER' (--name $DEV_NAME) 이(가) 없습니다."; echo; cmd_dev_ls - die "콘솔 '등록명'(예 imac192)이 아니라 위 '--name' 값으로 지정하세요." - fi - info "kind 클러스터 '$DEV_CLUSTER' 삭제 (콘솔 등록명 '$(_local_reg_name)')…" + local kenv=""; [ "$rt" = podman ] && kenv="KIND_EXPERIMENTAL_PROVIDER=podman" + info "kind 클러스터 '$DEV_CLUSTER' 삭제 [$rt] (콘솔 등록명 '$(_local_reg_name)')…" env $kenv kind delete cluster --name "$DEV_CLUSTER" && echo "✓ 삭제 완료" # 이 클러스터의 릴레이 에이전트만 정리(pidfile .pid, 클러스터 단위). 다른 dev 클러스터는 건드리지 않음. local agd="${YAK_CONFIG_DIR:-$HOME/.config/yakcloud}/agent"