From 09d77505b0d7f5d7fd3e9795b01306a14392c04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=82=98=EB=AF=B8?= Date: Sat, 25 Jul 2026 00:38:49 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B0=B0=ED=8F=AC=20=ED=97=AC=EC=8A=A4?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=EB=A5=BC=20=EB=A1=9C=EA=B7=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=EC=99=84=EB=A3=8C=20=EC=8B=A0=ED=98=B8=20=EA=B0=90?= =?UTF-8?q?=EC=A7=80=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 고정 타임아웃(15초+10회x10초)으로 성공/실패를 판단하던 방식이 OTel 에이전트 부팅 시간 증가로 성공한 배포를 실패로 오판하는 문제가 있어, 프로세스 생존 여부(kill -0)와 로그의 "Started ServerApplication" 신호 감지로 대체. dev 브랜치(PR #196)에서 이미 검증된 수정을 prod가 쓰는 main 브랜치에도 반영. --- scripts/deploy.sh | 63 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index e1f60e8..5fbbbe7 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -2,6 +2,7 @@ set -e APP_DIR=/home/ec2-user/app +cd "$APP_DIR" JAR_PATH=$(ls $APP_DIR/*.jar | grep -v plain | head -1) echo "> JAR 파일: $JAR_PATH" @@ -16,28 +17,64 @@ else fi echo "> 애플리케이션 시작" -nohup java -jar \ +OTEL_AGENT_JAR=$APP_DIR/grafana-opentelemetry-java.jar +OTEL_ENV_FILE=$APP_DIR/otel.env +JAVA_AGENT_OPTS="" +if [ -f "$OTEL_AGENT_JAR" ] && [ -f "$OTEL_ENV_FILE" ]; then + echo "> Grafana OTel agent 감지, 모니터링 활성화" + set -a + source "$OTEL_ENV_FILE" + set +a + JAVA_AGENT_OPTS="-javaagent:$OTEL_AGENT_JAR" +else + echo "> Grafana OTel agent 미설정, 모니터링 없이 실행" +fi + +LOG_FILE=/home/ec2-user/app/nohup.out +START_LINE=$(wc -l < "$LOG_FILE" 2>/dev/null || echo 0) + +nohup java $JAVA_AGENT_OPTS -jar \ -Duser.timezone=Asia/Seoul \ $JAR_PATH \ - >> /home/ec2-user/app/nohup.out 2>&1 & + >> "$LOG_FILE" 2>&1 & +APP_PID=$! +echo "> 프로세스 시작됨 (PID: $APP_PID)" -echo "> 15초 후 헬스체크 시작" -sleep 15 +echo "> 앱 준비 신호 대기 중 (최대 240초, 프로세스 생존 여부로 실패 판단)" +MAX_WAIT=240 +ELAPSED=0 +READY=false -for i in {1..10}; do - RESPONSE=$(curl -s http://localhost:8080/actuator/health || true) - if echo "$RESPONSE" | grep -q '"status":"UP"'; then - echo "> 헬스체크 성공" - break - fi - echo "> 헬스체크 실패($i/10): $RESPONSE" - if [ $i -eq 10 ]; then +while [ $ELAPSED -lt $MAX_WAIT ]; do + if ! kill -0 $APP_PID 2>/dev/null; then + echo "> 프로세스가 예기치 않게 종료됨 (크래시)" + echo "> 최근 로그:" + tail -n 40 "$LOG_FILE" echo "> 배포 실패" exit 1 fi - sleep 10 + + if tail -n +"$((START_LINE + 1))" "$LOG_FILE" | grep -q "Started ServerApplication"; then + echo "> 앱 준비 완료 신호 감지 (${ELAPSED}초 소요)" + READY=true + break + fi + + sleep 2 + ELAPSED=$((ELAPSED + 2)) done +if [ "$READY" != "true" ]; then + echo "> ${MAX_WAIT}초 내에 준비 신호 없음 — 안전장치 발동" + echo "> 최근 로그:" + tail -n 40 "$LOG_FILE" + echo "> 배포 실패" + exit 1 +fi + +RESPONSE=$(curl -s --max-time 10 http://localhost:8080/actuator/health || true) +echo "> 헬스체크 확인: $RESPONSE" + echo "> Nginx 시작" sudo systemctl start nginx || true sudo systemctl enable nginx || true