arko_renual/deploy/dev/build-and-upload.sh
URP2026 7c574922d8 개발서버(csv.zioinfo.co.kr) 배포 구성 및 Gitea Actions 파이프라인 추가
- 00-server-setup.sh: JDK8(Temurin)·Tomcat9·systemd·nginx·act_runner 구축 (멱등)
- arko-dev-deploy.sh: WAR 검증→백업→ROOT 재전개→환경설정 주입→기동→헬스체크→실패 시 롤백
- build-and-upload.sh: 개발자 PC에서 JDK8 빌드 후 WAR 업로드 (서버 자원 보호)
- deploy-dev.yml: master push 시 자동 배포, 수동 재배포·롤백 지원

서버가 2코어/메모리 여유 1G에 40여 개 서비스가 동거하는 환경이라
Maven 빌드는 서버에서 돌리지 않고 개발자 PC에서 수행한다.
JSP가 리소스를 컨텍스트 경로 없이 하드코딩해 ROOT 전개만 가능하며,
globals-{dev,live}.properties는 .gitignore 대상이라 서버 config/에 두고 배포 시 주입한다.
2026-07-29 15:44:02 +09:00

117 lines
4.9 KiB
Bash

#!/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 <<EOF
다음 단계:
git push origin master → Gitea Actions(deploy-dev)가 자동 배포
진행 상황: https://git.zioinfo.co.kr/somang4819/arko_renual/actions
push 없이 즉시 반영하려면: $0 --no-build --deploy
EOF
exit 0
fi
log "3. 서버 배포 (--deploy)"
PLINK "bash $REMOTE_DEPLOY $REMOTE_INCOMING/arko.war"
# ------------------------------------------------------------- 4. 확인
log "4. 접속 확인"
LOCAL_CODE=$(PLINK "curl -s -o /dev/null -w '%{http_code}' --max-time 15 http://127.0.0.1:8088/" | tr -d '\r')
echo "Tomcat 직접 → HTTP $LOCAL_CODE"
EXT_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 20 "$SITE_URL" || echo 000)
echo "$SITE_URL → HTTP $EXT_CODE"
case "$LOCAL_CODE" in
200|302) echo -e "\n배포 완료" ;;
*) echo -e "\n배포 실패 — 서버 로그 확인: plink ... 'tail -50 /opt/arko-dev/tomcat/logs/catalina.out'"; exit 1 ;;
esac
if [ "$EXT_CODE" = "000" ]; then
echo "참고: 외부 도메인 미응답 — csv.zioinfo.co.kr A 레코드 등록/SSL 발급 여부를 확인할 것"
fi