[INFRA-03] deploy.sh / rollback.sh 배포·롤백 스크립트

작업 내용 (설계 의도)

변경 사항

근거 TDD: ../TDD.md “인터페이스 시그니처 — 배포/롤백 스크립트 계약”, “실패 경로·동시성·멱등”. ADR-004. dev/prod 워크플로가 공통으로 호출할 배포 로직을 스크립트로 추출해 중복을 제거하고, 워크플로(INFRA-06/07)는 이 계약만 호출한다.

  • scripts/deploy.sh <env> <image_tag>: .env.<env>DOCKER_TAGimage_tag로 치환 → docker compose -p sports-<env> -f docker-compose.yml -f docker-compose.<env>.yml up -d/actuator/health 폴링(최대 5분, 5s 간격) UP이면 exit 0, 아니면 exit 1.
  • scripts/rollback.sh <env> <previous_image_tag>: 이전 태그로 DOCKER_TAG 치환 → up -d → health 폴링. 목표 5분 내 복구(NFR).
  • 멱등: 같은 tag 재실행 시 up -d no-op 수렴. env 인자 검증(dev|prod 외 거부).
  • 스크립트는 override 파일명을 계약(docker-compose.<env>.yml)으로만 참조 — 파일 존재는 런타임 요건.

롤백: 스크립트 자체는 무상태. 잘못 배포 시 rollback.sh <env> <prev>로 즉시 복구.

의존

  • INFRA-02 (compose 커맨드 형태·프로젝트명 규약 확정)

다이어그램

처리 흐름

sequenceDiagram
    participant Wf as 워크플로
    participant Sh as deploy.sh
    participant Co as docker compose
    Wf->>Sh: deploy.sh prod <sha>
    Sh->>Sh: .env.prod DOCKER_TAG 치환
    Sh->>Co: -p sports-prod ... up -d
    Sh->>Sh: /actuator/health 폴링 5분
    Sh-->>Wf: UP → exit 0 / 실패 → exit 1

테스트 케이스

  • deploy.sh dev latest가 dev 스택을 기동하고 health UP 시 exit 0을 반환한다
  • health가 5분 내 UP이 아니면 exit 1을 반환한다
  • deploy.sh xxx tag처럼 잘못된 env 인자를 거부한다(exit≠0)
  • 같은 tag로 재실행 시 no-op으로 멱등 수렴한다
  • rollback.sh prod <prev>가 이전 태그로 재배포하고 health UP을 확인한다
  • .env.<env>DOCKER_TAG만 치환하고 다른 키는 보존한다