#!/usr/bin/env bash # 로컬 submodule 소스 → chatbot.exdev.co.kr work tree rsync # (서버에서 GitHub HTTPS/SSH 미설정 시 deploy 보조) set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" EXDEV_SSH="${EXDEV_SSH:-aidev@chatbot.exdev.co.kr}" REMOTE_WT="${REMOTE_WORK_TREE:-/Users/aidev/dev/exAichatbot_agent}" log() { echo "[sync-submodules] $*"; } SUBMODULES=( chatbotApp-chatbot2.0-agent chatbotApi-chatbot2.0-agent exAiChatBot-chatbot2.0-agent kakaoChatbotSkill-chatbot2.0-agent chatbotDesktopApp-chatbot2.0 ) log "원격 동기화: ${EXDEV_SSH}:${REMOTE_WT}" for path in "${SUBMODULES[@]}"; do local_src="${ROOT_DIR}/${path}" [[ -d "${local_src}" ]] || { echo "ERROR: ${local_src} 없음"; exit 1; } log ">>> rsync ${path}" # build/dist/logs 는 자바 패키지명(예: kakao.response.build)과 충돌하므로 # 선행 슬래시로 프로젝트 최상위에만 적용한다. rsync -az --delete \ --exclude 'node_modules/' \ --exclude '.gradle/' \ --exclude 'qdrant_data/' \ --exclude '.next/' \ --exclude '.git/' \ --exclude '/build/' \ --exclude '/dist/' \ --exclude '/logs/' \ --exclude '/web/out/' \ "${local_src}/" "${EXDEV_SSH}:${REMOTE_WT}/${path}/" done log "overlay 복사..." rsync -az "${ROOT_DIR}/server-dev/docker-compose.rag.server.yml" \ "${EXDEV_SSH}:${REMOTE_WT}/server-dev/docker-compose.rag.server.yml" rsync -az "${ROOT_DIR}/server-dev/docker-compose.oracle.yml" \ "${EXDEV_SSH}:${REMOTE_WT}/server-dev/docker-compose.oracle.yml" rsync -az "${ROOT_DIR}/server-dev/oracle/" \ "${EXDEV_SSH}:${REMOTE_WT}/server-dev/oracle/" rsync -az "${ROOT_DIR}/local-dev/docker-compose.rag.local.yml" \ "${EXDEV_SSH}:${REMOTE_WT}/local-dev/docker-compose.rag.local.yml" 2>/dev/null || true ssh -o BatchMode=yes "${EXDEV_SSH}" "mkdir -p '${REMOTE_WT}/exAiChatBot-chatbot2.0-agent' '${REMOTE_WT}/server-dev/oracle/init' && \ cp '${REMOTE_WT}/server-dev/docker-compose.rag.server.yml' '${REMOTE_WT}/exAiChatBot-chatbot2.0-agent/docker-compose.server.yml' 2>/dev/null || true" if [[ -d "${ROOT_DIR}/chatbotApp-chatbot2.0-agent/public" ]]; then log ">>> rsync chatbotApp/public (로컬 빌드 산출물)" rsync -az "${ROOT_DIR}/chatbotApp-chatbot2.0-agent/public/" \ "${EXDEV_SSH}:${REMOTE_WT}/chatbotApp-chatbot2.0-agent/public/" fi if [[ -d "${ROOT_DIR}/chatbotApp-chatbot2.0-agent/public-ai" ]]; then log ">>> rsync chatbotApp/public-ai (AI 모드 빌드 산출물)" rsync -az "${ROOT_DIR}/chatbotApp-chatbot2.0-agent/public-ai/" \ "${EXDEV_SSH}:${REMOTE_WT}/chatbotApp-chatbot2.0-agent/public-ai/" fi # Windows 체크아웃(core.autocrlf)에서 넘어온 CRLF 는 macOS 에서 # "/bin/sh^M: bad interpreter" 로 죽는다. 전송 후 실행 진입점만 LF 로 강제한다. log "원격 실행 스크립트 LF 정규화..." ssh -o BatchMode=yes "${EXDEV_SSH}" "bash -s" </dev/null) \ \$(find "\${WT}" -name '*.sh' -not -path '*/node_modules/*' 2>/dev/null); do if head -c 4000 "\$f" | grep -q \$'\r'; then tr -d '\r' < "\$f" > "\$f.lf" && mv "\$f.lf" "\$f" echo " LF 변환: \$f" fi chmod +x "\$f" 2>/dev/null || true done EOSSH log "✅ submodule rsync 완료"