Skip to content

[fix] deploy.sh 헬스체크 실패 시 배포 성공으로 처리되는 문제 수정 #412

Description

@kimbap1001

What is this issue? 🛠️

prod 배포 파이프라인(deploy.sh)에서 새 컨테이너의 헬스체크가 실패해도 배포가 "성공"으로 처리되는 문제가 있습니다.

실제로 release/411 배포(#411 머지) 때 green 컨테이너 헬스체크가 100초 안에 통과하지 못했는데, 다음과 같은 일이 발생했습니다.

  • green 컨테이너는 새 코드로 정상 기동됐지만, 헬스체크 타임아웃(20회 × 5초 = 100초)을 넘김
  • deploy.sh가 헬스 실패 시 Nginx 업스트림 전환을 스킵 → 운영 트래픽이 계속 옛 컨테이너(blue, 옛 코드)로 감
  • 그런데 스크립트가 exit 1 없이 정상 종료(0) → GitHub Actions는 "배포 성공(초록불)"으로 표시
  • 결과적으로 "배포는 성공처럼 보이는데 실제로는 옛 버전이 서빙" 되는 거짓 성공 상태 발생 (userId 필드 미반영으로 발견됨)

원인 코드

  # 헬스 실패 시
  if [ "$SUCCESS" -ne 1 ]; then
    echo "[ERROR] Health check failed on :${PORT_NEW}"
    ROLLBACK=1          # ← 변수만 세팅, 사용처 없음 / exit 1 없음 → 스크립트 exit 0
  fi

  # 전환은 성공일 때만 수행
  if [ "$SUCCESS" -eq 1 ]; then
    switch_upstream "${TARGET}"      # 헬스 실패 시 통째로 스킵
    docker stop "hilingual-${OLD}"
  fi

영향

  • 무중단(옛 버전 유지)이라 장애로 보이지 않아 감지가 매우 어려움 (조용한 거짓 성공)
  • 헬스 타임아웃이 부팅 시간 대비 빠듯해(100초) 콜드스타트 시 간헐적으로 재현

Progress 🏃‍♀️

  • 헬스체크 실패 시 exit 1로 워크플로우를 실패로 처리 (미사용 ROLLBACK 제거)
  • 헬스체크 재시도 횟수/대기시간 상향 (예: 20회 → 40회) — 콜드스타트 부팅 시간 확보
  • (선택) 헬스 실패 시 새 컨테이너 stop 등 정리/롤백 로직 추가
  • (선택) 전환 후 Nginx 경유 재검증(switch 성공 여부 확인) 추가
  • 수정 후 prod 재배포로 정상 전환(green) 및 userId 반영 확인

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

🔧FIX🔧Something isn't working

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions