- 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/에 두고 배포 시 주입한다.
117 lines
4.9 KiB
Bash
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
|