feat(cli): 로컬 dev 클러스터를 콘솔 클러스터 목록에 등록(내 로컬/내 원격) — 0.15.0
dev up/deploy 가 배포토큰으로 콘솔에 로컬 클러스터를 best-effort 메타 등록/heartbeat, dev down 이 해제. 로그인 없으면 조용히 스킵(오프라인 dev 불변식). 콘솔 사이드바가 '내 로컬 클러스터'/'내 원격 클러스터'로 분리. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -25,7 +25,7 @@ YakCloud 콘솔 API로 **데이터소스 리컨실 + 워크로드 배포 + 바
|
|||||||
**프로젝트 라이프사이클 (로컬 kind dev → 관리형 val/prod, 한 줄기 직선)**
|
**프로젝트 라이프사이클 (로컬 kind dev → 관리형 val/prod, 한 줄기 직선)**
|
||||||
- **"클러스터 생성"** → `yakcloud cluster create <name> [--template S|M] [--nodes N] [--golden]` (배포토큰으로 프로비저닝, 완료까지 대기). `yakcloud cluster ls` 로 목록. 검증/운영 클러스터를 만들어 매니페스트 environments 에 지정.
|
- **"클러스터 생성"** → `yakcloud cluster create <name> [--template S|M] [--nodes N] [--golden]` (배포토큰으로 프로비저닝, 완료까지 대기). `yakcloud cluster ls` 로 목록. 검증/운영 클러스터를 만들어 매니페스트 environments 에 지정.
|
||||||
- **"프로젝트 초기화"** → 빈 폴더에서 `yakcloud project init [name]` (스타터+CI+매니페스트+이 스킬)
|
- **"프로젝트 초기화"** → 빈 폴더에서 `yakcloud project init [name]` (스타터+CI+매니페스트+이 스킬)
|
||||||
- **"로컬 개발"**(권장 반복 루프) → `yakcloud dev up`(최초 1회 — 로컬 kind 생성+인그레스) → `yakcloud dev deploy`. `requires` 소스+`workloads` 가 로컬에서 **관리형과 동일한 바인딩 env**로 뜬다(콘솔/CI·인터넷 불필요, 오프라인 반복). `dev status`/`dev clean`/`dev down`. 상세 `docs/local-dev-cluster.md`.
|
- **"로컬 개발"**(권장 반복 루프) → `yakcloud dev up`(최초 1회 — 로컬 kind 생성+인그레스) → `yakcloud dev deploy`. `requires` 소스+`workloads` 가 로컬에서 **관리형과 동일한 바인딩 env**로 뜬다(콘솔/CI·인터넷 불필요, 오프라인 반복). `dev status`/`dev clean`/`dev down`. 로그인돼 있으면 이 로컬 클러스터가 **콘솔 클러스터 목록('내 로컬 클러스터')에도 자동 등록/해제**된다(콘솔은 접속 않고 목록 표시만). 상세 `docs/local-dev-cluster.md`.
|
||||||
- **"개발 배포"**(관리형 개발 클러스터) → `yakcloud project deploy` (자동 버전업 → 태그 push → CI 빌드 → **개발 클러스터**). 기본 도메인으로 확인.
|
- **"개발 배포"**(관리형 개발 클러스터) → `yakcloud project deploy` (자동 버전업 → 태그 push → CI 빌드 → **개발 클러스터**). 기본 도메인으로 확인.
|
||||||
- **"승격"**(개발→검증→운영) → `yakcloud project promote [vX.Y.Z] [--to val|prod]` (그 이미지를 **재빌드 없이 상위 환경으로**; `--to prod` 는 운영 도메인 부착). 검증계(val)는 선택 — `environments` 에 없으면 개발→운영 2단계
|
- **"승격"**(개발→검증→운영) → `yakcloud project promote [vX.Y.Z] [--to val|prod]` (그 이미지를 **재빌드 없이 상위 환경으로**; `--to prod` 는 운영 도메인 부착). 검증계(val)는 선택 — `environments` 에 없으면 개발→운영 2단계
|
||||||
- **"프로젝트 개괄"** → `yakcloud project info` · 사전 점검 → `yakcloud project check [--env dev|val|prod]`
|
- **"프로젝트 개괄"** → `yakcloud project info` · 사전 점검 → `yakcloud project check [--env dev|val|prod]`
|
||||||
|
|||||||
29
bin/yakcloud
29
bin/yakcloud
@ -16,7 +16,7 @@ set -uo pipefail # -e 미사용: 'test && action' 관용구가 값 없을 때
|
|||||||
|
|
||||||
REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}"
|
REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}"
|
||||||
BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}"
|
BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}"
|
||||||
VERSION="0.14.0"
|
VERSION="0.15.0"
|
||||||
# 로컬 개발 클러스터(kind) — 개발 후 운영까지 '직선 배포'의 dev 구간.
|
# 로컬 개발 클러스터(kind) — 개발 후 운영까지 '직선 배포'의 dev 구간.
|
||||||
DEV_CTX="${YAK_DEV_CONTEXT:-kind-yak-dev}"
|
DEV_CTX="${YAK_DEV_CONTEXT:-kind-yak-dev}"
|
||||||
DEV_CLUSTER="${YAK_DEV_CLUSTER:-yak-dev}"
|
DEV_CLUSTER="${YAK_DEV_CLUSTER:-yak-dev}"
|
||||||
@ -429,9 +429,34 @@ EOF
|
|||||||
kubectl --context "$DEV_CTX" -n ingress-nginx rollout status deploy/ingress-nginx-controller --timeout=180s >/dev/null 2>&1 \
|
kubectl --context "$DEV_CTX" -n ingress-nginx rollout status deploy/ingress-nginx-controller --timeout=180s >/dev/null 2>&1 \
|
||||||
|| warn_line "ingress 컨트롤러 준비 지연 — 잠시 후 'yakcloud dev deploy'."
|
|| warn_line "ingress 컨트롤러 준비 지연 — 잠시 후 'yakcloud dev deploy'."
|
||||||
echo "✓ 로컬 dev 클러스터 준비 ($DEV_CTX). 다음: yakcloud dev deploy"
|
echo "✓ 로컬 dev 클러스터 준비 ($DEV_CTX). 다음: yakcloud dev deploy"
|
||||||
|
_dev_register
|
||||||
}
|
}
|
||||||
warn_line() { echo " ⚠ $*" >&2; }
|
warn_line() { echo " ⚠ $*" >&2; }
|
||||||
|
|
||||||
|
# 콘솔 클러스터 목록에 이 로컬 클러스터를 메타 등록 — 머신 호스트명 기준(머신당 1개, 프로젝트는 네임스페이스).
|
||||||
|
_local_reg_name() {
|
||||||
|
local h; h="$(hostname -s 2>/dev/null | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9-' '-' | sed 's/^-*//; s/-*$//')"
|
||||||
|
echo "${h:-local-dev}"
|
||||||
|
}
|
||||||
|
# best-effort 등록/heartbeat — 로그인(URL+토큰) 없으면 조용히 스킵(오프라인 dev 불변식 유지).
|
||||||
|
_dev_register() {
|
||||||
|
{ [ -n "${YAKCLOUD_URL:-}" ] && [ -n "${YAKCLOUD_TOKEN:-}" ]; } || return 0
|
||||||
|
local name; name="$(_local_reg_name)"
|
||||||
|
curl -fsS -m 6 -X POST "${YAKCLOUD_URL%/}/api/v1/clusters/local" \
|
||||||
|
-H "Authorization: Bearer $YAKCLOUD_TOKEN" -H 'content-type: application/json' \
|
||||||
|
-d "{\"name\":\"$name\",\"displayName\":\"로컬 개발 (kind)\"}" >/dev/null 2>&1 \
|
||||||
|
&& info "콘솔 클러스터 목록에 로컬 '$name' 등록/갱신" || true
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_dev_deregister() {
|
||||||
|
{ [ -n "${YAKCLOUD_URL:-}" ] && [ -n "${YAKCLOUD_TOKEN:-}" ]; } || return 0
|
||||||
|
local name; name="$(_local_reg_name)"
|
||||||
|
curl -fsS -m 6 -X DELETE "${YAKCLOUD_URL%/}/api/v1/clusters/local/$name" \
|
||||||
|
-H "Authorization: Bearer $YAKCLOUD_TOKEN" >/dev/null 2>&1 \
|
||||||
|
&& info "콘솔 클러스터 목록에서 로컬 '$name' 해제" || true
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
cmd_dev() {
|
cmd_dev() {
|
||||||
local sub="${1:-}"; [ "$#" -gt 0 ] && shift
|
local sub="${1:-}"; [ "$#" -gt 0 ] && shift
|
||||||
case "$sub" in
|
case "$sub" in
|
||||||
@ -445,12 +470,14 @@ cmd_dev() {
|
|||||||
local pysub="$sub"; [ "$sub" = clean ] && pysub="down"
|
local pysub="$sub"; [ "$sub" = clean ] && pysub="down"
|
||||||
YAK_DEV_CONTEXT="$DEV_CTX" YAK_DEV_CLUSTER="$DEV_CLUSTER" YAK_DEV_RUNTIME="${rt:-docker}" \
|
YAK_DEV_CONTEXT="$DEV_CTX" YAK_DEV_CLUSTER="$DEV_CLUSTER" YAK_DEV_RUNTIME="${rt:-docker}" \
|
||||||
TAG="${tag:-${TAG:-dev}}" python3 scripts/yakcloud_dev.py "$pysub" yakcloud.yaml
|
TAG="${tag:-${TAG:-dev}}" python3 scripts/yakcloud_dev.py "$pysub" yakcloud.yaml
|
||||||
|
[ "$sub" = deploy ] && _dev_register || true
|
||||||
;;
|
;;
|
||||||
down)
|
down)
|
||||||
command -v kind >/dev/null 2>&1 || die "kind 필요"
|
command -v kind >/dev/null 2>&1 || die "kind 필요"
|
||||||
local rt kenv=""; rt="$(_dev_runtime)"; [ "$rt" = podman ] && kenv="KIND_EXPERIMENTAL_PROVIDER=podman"
|
local rt kenv=""; rt="$(_dev_runtime)"; [ "$rt" = podman ] && kenv="KIND_EXPERIMENTAL_PROVIDER=podman"
|
||||||
info "kind 클러스터 '$DEV_CLUSTER' 삭제…"
|
info "kind 클러스터 '$DEV_CLUSTER' 삭제…"
|
||||||
env $kenv kind delete cluster --name "$DEV_CLUSTER" && echo "✓ 삭제 완료"
|
env $kenv kind delete cluster --name "$DEV_CLUSTER" && echo "✓ 삭제 완료"
|
||||||
|
_dev_deregister
|
||||||
;;
|
;;
|
||||||
*) echo "yakcloud dev <up|deploy [tag]|status|clean|down>"; exit 1 ;;
|
*) echo "yakcloud dev <up|deploy [tag]|status|clean|down>"; exit 1 ;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
Reference in New Issue
Block a user