cli v0.12.2: 개발→검증→운영 3단계 — promote --to <env> 일반화, environments 템플릿 dev/val/prod, init 마법사 검증 클러스터
This commit is contained in:
30
bin/yakcloud
30
bin/yakcloud
@ -3,7 +3,7 @@
|
||||
#
|
||||
# yakcloud project init [name] 빈 폴더에 스타터 스캐폴딩(앱+CI+매니페스트+Claude 스킬)
|
||||
# yakcloud project deploy [vX.Y.Z] 커밋 + 태그 push → CI 빌드 → 개발 클러스터 배포
|
||||
# yakcloud project promote [vX.Y.Z] 그 이미지를 재빌드 없이 운영 클러스터로 승격 + 운영 도메인
|
||||
# yakcloud project promote [vX.Y.Z] [--to val|prod] 그 이미지를 재빌드 없이 상위 환경으로 승격(개발→검증→운영)
|
||||
# yakcloud project info 프로젝트 개괄(매니페스트 + dev/prod 라이브 상태)
|
||||
# yakcloud project check [--prod] dry-run(직접 API 계획만)
|
||||
#
|
||||
@ -14,7 +14,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.12.1"
|
||||
VERSION="0.12.2"
|
||||
CONFIG_DIR="${YAKCLOUD_CONFIG_DIR:-$HOME/.config/yakcloud}"
|
||||
CONFIG_FILE="$CONFIG_DIR/config"
|
||||
|
||||
@ -158,10 +158,11 @@ cmd_project_init() {
|
||||
|
||||
# 매니페스트 채우기 마법사 — ctl 은 API 미접속(YAKCLOUD_TOKEN 비움)으로 매니페스트만 편집.
|
||||
_init_wizard() {
|
||||
local dflt_app="$1" app devc prodc pdom port health cpu mem reps path kv
|
||||
echo "── 프로젝트 설정 (엔터=기본값) ──"
|
||||
local dflt_app="$1" app devc valc prodc pdom port health cpu mem reps path kv
|
||||
echo "── 프로젝트 설정 (엔터=기본값) · 개발 → 검증 → 운영 3단계 ──"
|
||||
printf "앱 이름 [%s]: " "$dflt_app"; read -r app; app="${app:-$dflt_app}"
|
||||
printf "개발 클러스터(이름 또는 콘솔 id): "; read -r devc
|
||||
printf "검증 클러스터(선택, 엔터=생략): "; read -r valc
|
||||
printf "운영 클러스터 [%s]: " "${devc:-개발과 동일}"; read -r prodc; prodc="${prodc:-$devc}"
|
||||
printf "운영 도메인(선택, 예 app.example.com): "; read -r pdom
|
||||
printf "컨테이너 포트 [8080]: "; read -r port; port="${port:-8080}"
|
||||
@ -176,6 +177,8 @@ _init_wizard() {
|
||||
[ -n "$devc" ] && { sed -i.bak "s#my-dev-cluster#$devc#" yakcloud.yaml && rm -f yakcloud.yaml.bak; }
|
||||
[ -n "$prodc" ] && { sed -i.bak "s#my-prod-cluster#$prodc#" yakcloud.yaml && rm -f yakcloud.yaml.bak; }
|
||||
[ -n "$pdom" ] && { sed -i.bak "s#domains: \[\]#domains: [$pdom]#" yakcloud.yaml && rm -f yakcloud.yaml.bak; }
|
||||
if [ -n "$valc" ]; then sed -i.bak "s#my-val-cluster#$valc#" yakcloud.yaml && rm -f yakcloud.yaml.bak
|
||||
else sed -i.bak "/my-val-cluster/d" yakcloud.yaml && rm -f yakcloud.yaml.bak; fi # 검증 생략 시 val 줄 제거
|
||||
ensure_pyyaml
|
||||
YAKCLOUD_TOKEN= python3 scripts/yakcloud_ctl.py set web --port "$port" --health "$health" --cpu "$cpu" --mem "$mem" --path "$path" >/dev/null 2>&1 || true
|
||||
YAKCLOUD_TOKEN= python3 scripts/yakcloud_ctl.py scale web "$reps" >/dev/null 2>&1 || true
|
||||
@ -184,7 +187,7 @@ _init_wizard() {
|
||||
printf " env> "; read -r kv || break; [ -z "$kv" ] && break
|
||||
YAKCLOUD_TOKEN= python3 scripts/yakcloud_ctl.py env web "$kv" >/dev/null 2>&1 || echo " (형식: KEY=VALUE)"
|
||||
done
|
||||
echo "✓ 매니페스트 반영: app=$app dev=${devc:-<미지정>} prod=${prodc:-<미지정>} port=$port path=$path cpu=$cpu mem=$mem replicas=$reps"
|
||||
echo "✓ 매니페스트 반영: app=$app dev=${devc:-<미지정>} val=${valc:-<생략>} prod=${prodc:-<미지정>} port=$port path=$path cpu=$cpu mem=$mem replicas=$reps"
|
||||
}
|
||||
|
||||
_maybe_login_prompt() {
|
||||
@ -280,16 +283,23 @@ cmd_project_promote() {
|
||||
[ -f scripts/yakcloud_deploy.py ] || die "'yakcloud project init' 먼저"
|
||||
: "${YAKCLOUD_URL:?YAKCLOUD_URL 필요 — 'yakcloud login'}"; : "${YAKCLOUD_TOKEN:?YAKCLOUD_TOKEN 필요 — 'yakcloud login'}"
|
||||
ensure_pyyaml
|
||||
local tag=""; for a in "$@"; do case "$a" in -*) : ;; *) [ -z "$tag" ] && tag="$a" ;; esac; done
|
||||
local tag="" env="prod"
|
||||
while [ "$#" -gt 0 ]; do
|
||||
case "$1" in
|
||||
--to|--env) env="${2:-prod}"; shift 2 || shift ;;
|
||||
-*) shift ;;
|
||||
*) [ -z "$tag" ] && tag="$1"; shift ;;
|
||||
esac
|
||||
done
|
||||
if [ -z "$tag" ]; then
|
||||
git fetch -q --tags origin 2>/dev/null || true
|
||||
tag="$(git tag -l 'v*' --sort=-v:refname 2>/dev/null | head -1)"
|
||||
fi
|
||||
[ -n "$tag" ] || die "승격할 태그가 없습니다 — 'yakcloud project promote vX.Y.Z' (개발 배포된 태그)"
|
||||
case "$tag" in v*) : ;; *) tag="v$tag" ;; esac
|
||||
info "운영 승격: $tag → prod 환경(재빌드 없이 개발에서 빌드된 그 이미지를 운영 클러스터로 리컨실)"
|
||||
YAKCLOUD_ENV=prod TAG="$tag" python3 scripts/yakcloud_deploy.py yakcloud.yaml
|
||||
echo "✓ 승격 완료: $tag → 운영 클러스터 + 운영 도메인(기본 도메인은 자동)"
|
||||
info "'$env' 승격: $tag → '$env' 환경(재빌드 없이 개발에서 빌드된 그 이미지를 리컨실)"
|
||||
YAKCLOUD_ENV="$env" TAG="$tag" python3 scripts/yakcloud_deploy.py yakcloud.yaml
|
||||
echo "✓ 승격 완료: $tag → '$env' 클러스터 + 도메인(기본 도메인은 자동)"
|
||||
}
|
||||
|
||||
# 클러스터 — 계정 배포토큰으로 생성/조회(프로젝트 폴더 불필요). POST /clusters(템플릿) + 프로비저닝 폴.
|
||||
@ -433,7 +443,7 @@ yakcloud $VERSION — YakCloud 프로젝트 CLI (개발·운영 모두 yakcloud
|
||||
project init [name] 빈 폴더에 스타터 스캐폴딩(대화형 마법사) + 자격 프롬프트
|
||||
project deploy [vX.Y.Z] 커밋 + 태그 push → CI 빌드 → **개발 클러스터** 배포(버전 생략=자동 버전업)
|
||||
project deploy --local 러너 없이 로컬 build/push/리컨실(CI 대안, 개발 클러스터)
|
||||
project promote [vX.Y.Z] 개발에서 검증한 그 이미지를 재빌드 없이 **운영 클러스터**로 승격 + 운영 도메인
|
||||
project promote [vX.Y.Z] [--to val|prod] 그 이미지를 재빌드 없이 상위 환경으로 승격(개발→검증→운영). 기본 --to prod
|
||||
project info 프로젝트 개괄(매니페스트 + dev/prod 라이브 상태)
|
||||
project check [--prod] dry-run(직접 API 계획만)
|
||||
project update 이 프로젝트의 엔진·CI·스킬만 최신화(앱·매니페스트 보존)
|
||||
|
||||
Reference in New Issue
Block a user