diff --git a/deploy/deploy_itms_prod.sh b/deploy/deploy_itms_prod.sh new file mode 100644 index 00000000..23b44fe4 --- /dev/null +++ b/deploy/deploy_itms_prod.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# ITMS 운영 승격 (dev -> prod, front-only, 무빌드 tar-over-ssh). +# deploy_server.py itms 블록의 dev health 게이트 통과 후에만 호출된다. +# 실패 시 exit!=0 (운영 미반영 — 직전 war 유지). +set -euo pipefail + +KEY=/var/lib/jenkins/.ssh/id_ed25519_prod +PROD_HOST=211.37.173.197 +PROD_PORT=9271 +PROD_DOMAIN=itms.wise.ai.kr +SRC_WAR=/opt/itms/artifacts/current/itms-front.war +H=$(basename "$(readlink -f /opt/itms/artifacts/current)") +SSH="ssh -p ${PROD_PORT} -i ${KEY} -o StrictHostKeyChecking=no -o ConnectTimeout=20" + +echo "[prod-promote] target=${PROD_HOST} hash=${H}" + +# 1) prod 디렉터리 준비 +${SSH} root@${PROD_HOST} "mkdir -p /opt/itms/artifacts/${H} /etc/itms" + +# 2) front war 전송 (무빌드) +scp -P ${PROD_PORT} -i ${KEY} -o StrictHostKeyChecking=no "${SRC_WAR}" \ + root@${PROD_HOST}:/opt/itms/artifacts/${H}/itms-front.war + +# 3) 심볼릭 갱신 + 재기동 + 헬스 게이트 (Host 헤더 필수) +${SSH} root@${PROD_HOST} " + ln -sfn /opt/itms/artifacts/${H} /opt/itms/artifacts/current && + systemctl restart itms-front && + for i in \$(seq 1 30); do + sleep 3 + code=\$(curl -s -m5 -o /dev/null -w '%{http_code}' -H 'Host: ${PROD_DOMAIN}' http://127.0.0.1:11020/) + if [ \"\$code\" = '200' ] || [ \"\$code\" = '301' ] || [ \"\$code\" = '302' ]; then + echo \"[prod-promote] health OK (\$code)\"; exit 0 + fi + done + echo '[prod-promote] health FAIL'; systemctl is-active itms-front; exit 1 +" +echo "[prod-promote] done"