#!/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"