guardia-itsm/cicd/scripts/pipeline/was_restart.sh
DESKTOP-TKLFCPRython 64c27c3509 feat(itsm): G-1~G-12 확장 기능 + 하네스/봇/설치스크립트 구현
G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현
G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건)
G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST)
G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직
G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트
G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트
G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API
G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트
G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트
G-10: core/push_notify.py + routers/push.py + PushSubscription 모델
G-11: approvals 다중승인 (위임/서명/기한초과/마감연장)
G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh

하네스: guardia-orchestrator 확장기능 Phase 반영
봇명령어: /sr /status /license /bulk 슬래시 명령어 추가
설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 18:18:52 +09:00

216 lines
8.1 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# WAS 재기동 스크립트
# Jenkins Stage 6: WAS Restart에서 호출
# 지원: Tomcat, JBoss/WildFly, JEUS, WebLogic, Node.js(pm2/systemd)
# =============================================================================
set -euo pipefail
SERVER=""
SSH_KEY=""
SSH_USER="deploy"
SSH_PORT="${SSH_PORT:-22}"
WAS_TYPE="${WAS_TYPE:-tomcat}"
WAS_SERVICE="${WAS_SERVICE:-}" # systemd 서비스명 (빈칸이면 자동 감지)
STARTUP_WAIT="${STARTUP_WAIT:-60}" # 기동 대기 시간 (초)
LOG_DIR="${WORKSPACE:-/tmp}/build-logs"
RESTART_LOG="${LOG_DIR}/was-restart-$(date +%Y%m%d-%H%M%S).log"
GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
log() { echo -e "${GREEN}[WAS]${NC} $*" | tee -a "${RESTART_LOG}"; }
err() { echo -e "${RED}[ERROR]${NC} $*" | tee -a "${RESTART_LOG}"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*" | tee -a "${RESTART_LOG}"; }
mkdir -p "${LOG_DIR}"
while [[ $# -gt 0 ]]; do
case $1 in
--server) SERVER="$2"; shift 2 ;;
--ssh-key) SSH_KEY="$2"; shift 2 ;;
--ssh-user) SSH_USER="$2"; shift 2 ;;
--was-type) WAS_TYPE="$2"; shift 2 ;;
--service) WAS_SERVICE="$2"; shift 2 ;;
--wait) STARTUP_WAIT="$2"; shift 2 ;;
*) shift ;;
esac
done
[[ -z "${SERVER}" ]] && { err "--server 파라미터가 필요합니다"; exit 1; }
[[ -z "${SSH_KEY}" ]] && { err "--ssh-key 파라미터가 필요합니다"; exit 1; }
chmod 600 "${SSH_KEY}"
TARGET_HOST="${TARGET_HOST:-${SERVER}}"
SSH_OPTS="-i ${SSH_KEY} -p ${SSH_PORT} -o StrictHostKeyChecking=no -o ConnectTimeout=10"
SSH_CMD="ssh ${SSH_OPTS} ${SSH_USER}@${TARGET_HOST}"
log "WAS 재기동: ${WAS_TYPE} @ ${TARGET_HOST}"
# ── Tomcat ────────────────────────────────────────────────────────────────────
restart_tomcat() {
local service="${WAS_SERVICE:-tomcat9}"
# 서비스명 자동 감지 (tomcat9 / tomcat10 / tomcat)
local actual_service
actual_service=$(${SSH_CMD} "
for s in tomcat9 tomcat10 tomcat; do
systemctl list-units --type=service | grep -q \"\$s\" && echo \"\$s\" && break
done
" 2>/dev/null || echo "${service}")
log "Tomcat 서비스 재기동: ${actual_service}"
${SSH_CMD} "sudo systemctl restart '${actual_service}'"
# 기동 확인
local elapsed=0
while [[ ${elapsed} -lt ${STARTUP_WAIT} ]]; do
if ${SSH_CMD} "sudo systemctl is-active --quiet '${actual_service}'" 2>/dev/null; then
log "Tomcat 기동 완료 (${elapsed}초)"
return 0
fi
sleep 3
elapsed=$((elapsed + 3))
done
err "Tomcat 기동 타임아웃 (${STARTUP_WAIT}초)"
${SSH_CMD} "sudo systemctl status '${actual_service}'" 2>&1 | tee -a "${RESTART_LOG}" || true
exit 1
}
# ── JBoss / WildFly ────────────────────────────────────────────────────────────
restart_jboss() {
local service="${WAS_SERVICE:-jboss}"
local actual_service
actual_service=$(${SSH_CMD} "
for s in jboss wildfly eap7 jboss-eap; do
systemctl list-units --type=service | grep -q \"\$s\" && echo \"\$s\" && break
done
" 2>/dev/null || echo "${service}")
log "JBoss/WildFly 서비스 재기동: ${actual_service}"
${SSH_CMD} "sudo systemctl restart '${actual_service}'"
local elapsed=0
while [[ ${elapsed} -lt ${STARTUP_WAIT} ]]; do
if ${SSH_CMD} "sudo systemctl is-active --quiet '${actual_service}'" 2>/dev/null; then
log "JBoss 기동 완료 (${elapsed}초)"
return 0
fi
sleep 5
elapsed=$((elapsed + 5))
done
err "JBoss 기동 타임아웃"
exit 1
}
# ── JEUS ──────────────────────────────────────────────────────────────────────
restart_jeus() {
local jeus_home="${JEUS_HOME:-/opt/jeus8}"
local domain="${JEUS_DOMAIN:-domain1}"
local server="${JEUS_SERVER:-server1}"
local admin_port="${JEUS_ADMIN_PORT:-9736}"
log "JEUS 서버 재기동: ${domain}/${server}"
${SSH_CMD} "
export JEUS_HOME='${jeus_home}'
export PATH=\"\${JEUS_HOME}/bin:\${PATH}\"
# 서버 중지
jeusadmin -host localhost:${admin_port} -u administrator \
'stopServer ${server}' 2>/dev/null || true
sleep 5
# 서버 시작
startManagedServer -domain '${domain}' -server '${server}' &
"
local elapsed=0
while [[ ${elapsed} -lt ${STARTUP_WAIT} ]]; do
if ${SSH_CMD} "
export JEUS_HOME='${jeus_home}'
jeusadmin -host localhost:${admin_port} -u administrator \
'serverinfo ${server}' 2>/dev/null | grep -q 'RUNNING'
" 2>/dev/null; then
log "JEUS 기동 완료 (${elapsed}초)"
return 0
fi
sleep 5
elapsed=$((elapsed + 5))
done
err "JEUS 기동 타임아웃"
exit 1
}
# ── WebLogic ──────────────────────────────────────────────────────────────────
restart_weblogic() {
local wl_home="${WL_HOME:-/opt/oracle/wlserver}"
local domain_home="${WL_DOMAIN_HOME:-/opt/oracle/domains/base_domain}"
local server="${WL_SERVER:-ManagedServer1}"
log "WebLogic 서버 재기동: ${server}"
${SSH_CMD} "
# 서버 중지
'${domain_home}/bin/stopWebLogic.sh' '${server}' 2>/dev/null || true
sleep 5
# 서버 시작
nohup '${domain_home}/bin/startManagedWebLogic.sh' \
'${server}' 'http://localhost:7001' &
"
local elapsed=0
while [[ ${elapsed} -lt ${STARTUP_WAIT} ]]; do
if ${SSH_CMD} "
curl -sf 'http://localhost:7001/management/tenant-monitoring/servers/${server}' \
2>/dev/null | grep -q '\"state\":\"RUNNING\"'
" 2>/dev/null; then
log "WebLogic 기동 완료 (${elapsed}초)"
return 0
fi
sleep 5
elapsed=$((elapsed + 5))
done
err "WebLogic 기동 타임아웃"
exit 1
}
# ── Node.js (pm2 또는 systemd) ────────────────────────────────────────────────
restart_nodejs() {
local service="${WAS_SERVICE:-}"
local app_name="${NODE_APP_NAME:-app}"
log "Node.js 재기동..."
${SSH_CMD} "
if command -v pm2 &>/dev/null; then
pm2 restart '${app_name}' || pm2 reload '${app_name}'
elif systemctl list-units --type=service | grep -q '${service:-nodejs}'; then
sudo systemctl restart '${service:-nodejs}'
else
echo '재기동 방법을 찾을 수 없습니다. PM2 또는 systemd 서비스가 필요합니다.'
exit 1
fi
"
sleep 3
log "Node.js 재기동 완료"
}
# ── 메인 ─────────────────────────────────────────────────────────────────────
main() {
log "=== WAS 재기동 시작: $(date) ==="
case "${WAS_TYPE,,}" in
tomcat|tomcat9|tomcat10) restart_tomcat ;;
jboss|wildfly|eap) restart_jboss ;;
jeus|jeus8|jeus9) restart_jeus ;;
weblogic|wls) restart_weblogic ;;
nodejs|node|pm2) restart_nodejs ;;
systemd)
log "systemd 서비스 재기동: ${WAS_SERVICE}"
${SSH_CMD} "sudo systemctl restart '${WAS_SERVICE}'"
;;
*)
err "지원하지 않는 WAS 종류: ${WAS_TYPE}"
exit 1
;;
esac
log "=== WAS 재기동 완료 ==="
}
main "$@"