#!/usr/bin/env bash # arko_renual — 로컬 빌드 → 개발서버 WAR 업로드 (개발자 PC에서 실행) # # 표준 흐름: # 1) bash deploy/dev/build-and-upload.sh 빌드 + WAR 업로드 # 2) git push origin master → Gitea Actions가 자동 배포 # # 옵션: # --build-only 빌드만 (업로드 안 함) # --no-build 업로드만 (기존 target/arko.war 사용) # --deploy 업로드 후 서버 배포까지 직접 실행 (push 없이 즉시 반영할 때) # # 서버(2코어/메모리 여유 1G)에서 Maven을 돌리지 않기 위한 구조다. # 빌드는 개발자 PC에서, 서버는 전개만 한다. set -euo pipefail # ------------------------------------------------------------------ 설정 SERVER_IP=101.79.17.164 SERVER_USER=root SERVER_PW='1q2w3e!Q' HOSTKEY="SHA256:Zm5aAv5DJ/EnKiObKSadOxA5nKuXgToCGhNiyhVhAjY" REMOTE_INCOMING=/opt/arko-dev/incoming REMOTE_DEPLOY=/opt/arko-dev/bin/arko-dev-deploy.sh SITE_URL=https://csv.zioinfo.co.kr/ # arko는 maven-compiler-plugin이 source/target 1.7 → JDK 8로만 빌드된다 (17/21 불가) JDK8_HOME=${JDK8_HOME:-"C:/Program Files/Java/jdk1.8.0_202"} PROJECT_ROOT=$(cd "$(dirname "$0")/../.." && pwd) WAR="$PROJECT_ROOT/target/arko.war" DO_BUILD=1 DO_UPLOAD=1 DO_DEPLOY=0 # 기본은 업로드까지만 — 배포는 git push가 Gitea Actions로 트리거한다 for arg in "$@"; do case "$arg" in --build-only) DO_UPLOAD=0 ;; --no-build) DO_BUILD=0 ;; --deploy) DO_DEPLOY=1 ;; *) echo "사용법: $0 [--build-only] [--no-build] [--deploy]"; exit 1 ;; esac done log() { echo -e "\n[$(date +'%F %T')] === $* ==="; } # PuTTY plink/pscp 사용 (Windows 기본 ssh는 비밀번호 자동입력이 안 된다) PLINK() { plink -batch -hostkey "$HOSTKEY" -pw "$SERVER_PW" "$SERVER_USER@$SERVER_IP" "$@"; } PSCP() { pscp -batch -hostkey "$HOSTKEY" -pw "$SERVER_PW" "$@"; } # ------------------------------------------------------------------ 1. 빌드 if [ "$DO_BUILD" = "1" ]; then log "1. 로컬 빌드 (JDK 8)" [ -x "$JDK8_HOME/bin/javac" ] || { echo "JDK 8을 찾을 수 없다: $JDK8_HOME (JDK8_HOME 환경변수로 지정)"; exit 1; } export JAVA_HOME="$JDK8_HOME" cd "$PROJECT_ROOT" mvn -B -ntp clean package -DskipTests [ -f "$WAR" ] || { echo "WAR 생성 실패: $WAR"; exit 1; } # 바이트코드 버전 확인 — 51(0x33)=Java7. JDK 17/21로 잘못 빌드되면 서버에서 못 뜬다 CLS=$(find target/classes -name "*.class" | head -1) VER=$(od -An -t d1 -j 7 -N 1 "$CLS" | tr -d ' ') echo "바이트코드 major=$VER (51이어야 정상)" [ "$VER" = "51" ] || { echo "경고: JDK 8이 아닌 컴파일러로 빌드된 것으로 보인다"; exit 1; } ls -lh "$WAR" fi [ "$DO_UPLOAD" = "1" ] || { log "빌드만 수행하고 종료"; exit 0; } [ -f "$WAR" ] || { echo "WAR이 없다: $WAR (--no-build 이면 먼저 빌드할 것)"; exit 1; } # ------------------------------------------------------------- 2. 업로드 log "2. 서버 업로드 ($(du -h "$WAR" | cut -f1))" PLINK "mkdir -p $REMOTE_INCOMING" # 서버 디스크 여유 확인 — WAR 3배(업로드+전개+백업)가 필요하다 FREE_MB=$(PLINK "df -m $REMOTE_INCOMING | awk 'NR==2 {print \$4}'" | tr -d '\r') WAR_MB=$(( $(du -k "$WAR" | cut -f1) / 1024 )) echo "서버 여유 ${FREE_MB}MB / WAR ${WAR_MB}MB" [ "$FREE_MB" -gt $(( WAR_MB * 3 )) ] || { echo "서버 디스크 부족"; exit 1; } # 전송 중 중단되어도 반쪽 WAR이 배포되지 않도록 임시 이름으로 올린 뒤 교체 PSCP "$WAR" "$SERVER_USER@$SERVER_IP:$REMOTE_INCOMING/arko.war.uploading" PLINK "mv -f $REMOTE_INCOMING/arko.war.uploading $REMOTE_INCOMING/arko.war && ls -lh $REMOTE_INCOMING/arko.war" # ------------------------------------------------------------- 3. 배포 if [ "$DO_DEPLOY" != "1" ]; then log "업로드 완료 — 배포는 git push 가 트리거한다" cat <