#!/usr/bin/env bash # yakcloud — YakCloud 프로젝트 CLI. 빈 폴더 초기화(스타터+스킬) + 태그 push 자동배포. # yakcloud init [name] 현재(빈) 폴더 또는 name/ 에 스타터 스캐폴딩(.claude 스킬 포함) # yakcloud deploy [vX.Y.Z] 커밋 + 태그 push → Gitea Actions 자동 배포 # yakcloud check dry-run(직접 API, 계획만; YAKCLOUD_URL/TOKEN 필요) set -euo pipefail REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}" BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}" VERSION="0.1.0" die() { echo "✗ $*" >&2; exit 1; } info() { echo "▸ $*"; } cmd_init() { local name="${1:-}" if [ -n "$name" ]; then mkdir -p "$name" && cd "$name" fi # 빈 폴더인지 확인(.git 은 허용) if [ -n "$(ls -A . 2>/dev/null | grep -v '^\.git$' || true)" ]; then die "폴더가 비어있지 않습니다. 빈 폴더에서 실행하거나 'yakcloud init ' 로 새 폴더에 생성하세요." fi info "yakcloud-starter 내려받는 중… ($REPO @ $BRANCH)" curl -fsSL "$REPO/archive/$BRANCH.tar.gz" | tar xz --strip-components=1 \ || die "스타터 다운로드 실패 — 네트워크/레포 공개 여부 확인" # 프로젝트 이름 치환(선택) if [ -n "$name" ] && [ -f yakcloud.yaml ]; then sed -i.bak "s/^project: .*/project: $name/" yakcloud.yaml && rm -f yakcloud.yaml.bak fi git rev-parse --git-dir >/dev/null 2>&1 || git init -q echo "✓ 초기화 완료 ($(pwd))" echo " 다음:" echo " 1) yakcloud.yaml 의 cluster / image() 수정, 필요하면 requires·binds 추가" echo " 2) 앱 개발 (Claude Code 스킬: .claude/skills/yakcloud-deploy)" echo " 3) Gitea 레포 연결 + Secrets(YAKCLOUD_URL/TOKEN/CLUSTER, REGISTRY_TOKEN) 설정" echo " 4) yakcloud deploy v0.1.0" } cmd_deploy() { [ -f yakcloud.yaml ] || die "yakcloud.yaml 없음 — 먼저 'yakcloud init'" local ver="${1:-v0.1.0}" case "$ver" in v*) : ;; *) ver="v$ver" ;; esac git rev-parse --git-dir >/dev/null 2>&1 || git init -q git remote get-url origin >/dev/null 2>&1 \ || die "git 원격(origin) 없음 — Gitea 레포를 만들어 'git remote add origin ' 후, 레포 Secrets 설정 뒤 다시 실행" info "커밋 + 태그 $ver push…" git add -A git commit -q -m "deploy $ver" 2>/dev/null || true git push -q origin HEAD 2>/dev/null || true git tag "$ver" 2>/dev/null || die "태그 $ver 이미 존재 — 다른 버전으로" git push -q origin "$ver" echo "✓ $ver push — Gitea Actions 에서 빌드·배포 진행. 콘솔 앱 탭/도메인에서 확인." } cmd_check() { [ -f scripts/yakcloud_deploy.py ] || die "scripts/yakcloud_deploy.py 없음 — 'yakcloud init' 먼저" : "${YAKCLOUD_URL:?YAKCLOUD_URL 필요}" : "${YAKCLOUD_TOKEN:?YAKCLOUD_TOKEN(배포 토큰) 필요}" python3 -c "import yaml" 2>/dev/null || pip3 install --quiet pyyaml python3 scripts/yakcloud_deploy.py yakcloud.yaml --dry-run } case "${1:-help}" in init) shift; cmd_init "$@" ;; deploy) shift; cmd_deploy "$@" ;; check|dry-run) shift; cmd_check "$@" ;; version|-v|--version) echo "yakcloud $VERSION" ;; *) cat <