#!/usr/bin/env bash # ============================================================================== # exAichatbot_agent — Gitea push → exdev 서버 빌드·배포 # 설치: /Volumes/ADATA/git/deploy-exAichatbot_agent.sh # 호출: post-receive (main 브랜치 push) # ============================================================================== set -euo pipefail GIT_DIR="${GIT_DIR:-/Volumes/ADATA/gitea/data/gitea-repositories/aidev/exaichatbot_agent.git}" WORK_TREE="${WORK_TREE:-/Users/aidev/dev/exAichatbot_agent}" BRANCH="${BRANCH:-main}" DEPLOY_LOG="${DEPLOY_LOG:-/Volumes/ADATA/logs/deploy/exAichatbot_agent.log}" LOG_TAG="[exAichatbot_agent-deploy]" export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/Applications/Docker.app/Contents/Resources/bin:${PATH:-/usr/bin:/bin}" mkdir -p "$(dirname "$DEPLOY_LOG")" exec >> "$DEPLOY_LOG" 2>&1 log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $LOG_TAG $*"; } fail() { log "[ERROR] $*"; exit 1; } LOCK_FILE="/tmp/exAichatbot_agent_deploy.lock" if [[ -f "$LOCK_FILE" ]]; then LOCK_PID="$(cat "$LOCK_FILE" 2>/dev/null || echo "")" if [[ -n "$LOCK_PID" ]] && kill -0 "$LOCK_PID" 2>/dev/null; then fail "다른 배포 진행 중 (PID: $LOCK_PID)" fi rm -f "$LOCK_FILE" fi echo $$ > "$LOCK_FILE" trap 'rm -f "$LOCK_FILE"; log "락 해제"' EXIT for arg in "$@"; do case "$arg" in --start-only) START_ONLY=true ;; esac done START_ONLY="${START_ONLY:-false}" log "======================================================" log " exAichatbot Agent 2.0 배포 시작" log " GIT_DIR : $GIT_DIR" log " WORK_TREE : $WORK_TREE" log " BRANCH : $BRANCH" log " START_ONLY: $START_ONLY" log "======================================================" [[ -d "$GIT_DIR" ]] || fail "GIT_DIR 없음: $GIT_DIR" mkdir -p "$WORK_TREE" chmod +x "$WORK_TREE/server-dev/"*.sh 2>/dev/null || true chmod +x "$WORK_TREE/git_fetch_all.sh" 2>/dev/null || true chmod +x "$WORK_TREE/chatbotApp-chatbot2.0-agent/build.sh" 2>/dev/null || true sync_worktree_submodules() { local tree="$1" local path ready=0 for path in chatbotApp-chatbot2.0-agent chatbotApi-chatbot2.0-agent \ exAiChatBot-chatbot2.0-agent kakaoChatbotSkill-chatbot2.0-agent; do if [[ -f "${tree}/${path}/build.gradle" ]] || [[ -f "${tree}/${path}/build.sh" ]] \ || [[ -f "${tree}/${path}/docker/service-slim.Dockerfile" ]]; then ready=$((ready + 1)) fi done if [[ ${ready} -ge 4 ]]; then log "submodule 소스 이미 존재 (rsync 또는 clone 완료) — GitHub fetch 생략" if [[ -f "${tree}/server-dev/docker-compose.rag.server.yml" ]]; then cp "${tree}/server-dev/docker-compose.rag.server.yml" \ "${tree}/exAiChatBot-chatbot2.0-agent/docker-compose.server.yml" 2>/dev/null || true fi return 0 fi if [[ -x "${tree}/git_fetch_all.sh" ]]; then log "GitHub submodule 동기화 (git_fetch_all.sh --init)..." MONOREPO_GIT_DIR="${GIT_DIR}" "${tree}/git_fetch_all.sh" --init || log "[WARN] git_fetch_all 실패 — 로컬 rsync 필요" else log "[WARN] git_fetch_all.sh 없음 — 로컬 rsync 필요" fi } log "[Phase 1] stop-all-server.sh" "$WORK_TREE/server-dev/stop-all-server.sh" --keep-caddy || true if ! $START_ONLY; then log "[Phase 2] checkout + GitHub submodule" git --work-tree="$WORK_TREE" --git-dir="$GIT_DIR" checkout -f "$BRANCH" rm -f "$WORK_TREE/.git" sync_worktree_submodules "$WORK_TREE" fi log "[Phase 3] .env 준비" ENV_FILE="$WORK_TREE/exAiChatBot-chatbot2.0-agent/.env" if [[ ! -f "$ENV_FILE" ]]; then cp "$WORK_TREE/server-dev/env.exdev-server.template" "$ENV_FILE" log ".env 생성 (env.exdev-server.template)" fi log "[Phase 4] start-all-server.sh (기동)" START_ARGS=(--skip-legacy-stop --no-pull --no-push) if $START_ONLY || [[ -f "$WORK_TREE/chatbotApp-chatbot2.0-agent/public/index.html" ]]; then START_ARGS+=(--no-build) fi "$WORK_TREE/server-dev/start-all-server.sh" "${START_ARGS[@]}" COMMIT="$(git --git-dir="$GIT_DIR" rev-parse --short HEAD 2>/dev/null || echo unknown)" log "======================================================" log " 배포 완료 — $COMMIT" log " UI: https://chatbot.exdev.co.kr/chatbot/app/" log "======================================================"