#!/usr/bin/env bash # Electron 데스크톱 앱 재빌드 → chatbotApp public-ai/downloads/ 배포 # # ./chatbotDesktopApp-chatbot2.0/build-and-publish.sh # SKIP_WIN=1 ./chatbotDesktopApp-chatbot2.0/build-and-publish.sh # Mac만 # SKIP_MAC=1 ./chatbotDesktopApp-chatbot2.0/build-and-publish.sh # Win만 set -euo pipefail DESKTOP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "${DESKTOP_DIR}/.." && pwd)" DOWNLOADS_DIR="${ROOT_DIR}/chatbotApp-chatbot2.0-agent/public-ai/downloads" export PATH="/opt/homebrew/bin:/usr/local/bin:${PATH}" export CSC_IDENTITY_AUTO_DISCOVERY="${CSC_IDENTITY_AUTO_DISCOVERY:-false}" log() { echo "[desktop-build $(date '+%H:%M:%S')] $*"; } warn() { log "⚠️ $*"; } fail() { log "ERROR: $*"; exit 1; } [[ -f "${DESKTOP_DIR}/package.json" ]] || fail "package.json 없음: ${DESKTOP_DIR}" cd "${DESKTOP_DIR}" if [[ ! -d node_modules/electron ]]; then log "npm 의존성 설치..." npm ci --prefer-offline 2>/dev/null || npm install else log "npm 의존성 확인..." npm ci --prefer-offline 2>/dev/null || npm install --prefer-offline fi SKIP_MAC="${SKIP_MAC:-0}" SKIP_WIN="${SKIP_WIN:-0}" built_any=false case "$(uname -s)" in Darwin) if [[ "${SKIP_MAC}" != "1" ]]; then log "잔여 DMG 볼륨 정리..." hdiutil detach "/Volumes/EX AI Chatbot" -force 2>/dev/null || true hdiutil detach "/Volumes/EX AI Chatbot Intel" -force 2>/dev/null || true hdiutil detach "/Volumes/EX AI Chatbot Silicon" -force 2>/dev/null || true log "Mac Intel + Apple Silicon (dmg+zip) 빌드..." # electron-builder는 arch별 dir(.app)만 순차 생성 → finalize-mac이 dmg/zip 생성 # (dmg를 동시 빌드하면 hdiutil detach 충돌로 실패함) npm run dist:mac built_any=true fi if [[ "${SKIP_WIN}" != "1" ]]; then log "Windows 32/64비트 (Setup+portable) 빌드 (크로스)..." if npm run dist:win; then built_any=true else warn "Windows 빌드 실패 — Mac 산출물만 배포합니다" fi fi ;; Linux) if [[ "${SKIP_WIN}" != "1" ]]; then log "Windows 32/64비트 (Setup+portable) 빌드..." if npm run dist:win; then built_any=true else warn "Windows 빌드 실패" fi fi if [[ "${SKIP_MAC}" != "1" ]]; then warn "Linux에서는 Mac 빌드를 건너뜁니다 (SKIP_MAC 강제)" fi ;; MINGW*|MSYS*|CYGWIN*|Windows_NT) if [[ "${SKIP_WIN}" != "1" ]]; then log "Windows 32/64비트 (Setup+portable) 빌드..." npm run dist:win built_any=true fi ;; *) fail "지원하지 않는 OS: $(uname -s)" ;; esac $built_any || fail "빌드된 산출물이 없습니다" log "downloads/ 로 복사..." npm run publish-downloads [[ -d "${DOWNLOADS_DIR}" ]] || fail "downloads 디렉터리 없음: ${DOWNLOADS_DIR}" log "✅ 데스크톱 앱 배포 완료 → ${DOWNLOADS_DIR}" ls -lh "${DOWNLOADS_DIR}" | sed 's/^/ /'