[STK9-05] GitHub Actions CD 파이프라인

의존: STK9-02 (Dockerfile 완료 후 착수)

작업 내용 (설계 의도)

변경 사항

main 브랜치에 push(PR 머지)될 때 자동으로 Docker 이미지를 빌드·배포하는 GitHub Actions CD 워크플로우를 신설한다.

잡 구성:

  • build-and-push:
    • docker/login-action → ghcr.io 인증 (GITHUB_TOKEN 자동 사용)
    • docker/build-push-action으로 backend/frontend 이미지 빌드 + 푸시
    • 이미지 태그: latest + sha-{commit_sha[:7]}
  • deploy (needs: build-and-push):
    • appleboy/ssh-action으로 프로덕션 서버 SSH 접속
    • docker-compose -f docker-compose.prod.yml pull && up -d

GitHub Secrets 필요 (사전 등록 필요):

Secret설명
SSH_HOST프로덕션 서버 IP/도메인
SSH_USERSSH 접속 유저명
SSH_PRIVATE_KEYSSH 개인키
PROD_ENV.env 파일 내용 (MYSQL_ROOT_PASSWORD 등)

다이어그램

배포 흐름

sequenceDiagram
    participant DEV as 개발자
    participant GH as GitHub main
    participant CD as cd.yml
    participant GHCR as ghcr.io
    participant PROD as 프로덕션 서버

    DEV->>GH: PR 머지 (CI 통과 후)
    GH->>CD: push to main 트리거
    CD->>CD: docker build backend + frontend
    CD->>GHCR: docker push :latest + :sha-XXXXXX
    CD->>PROD: SSH → docker-compose pull
    PROD->>GHCR: pull latest images
    PROD->>PROD: docker-compose up -d
    PROD-->>CD: 완료
    CD-->>GH: Actions 성공 알림

이미지 태그 전략

flowchart LR
    BUILD[빌드] --> LATEST[":latest 태그"]
    BUILD --> SHA[":sha-abc1234 태그"]
    LATEST --> DEPLOY[프로덕션 배포 - latest 사용]
    SHA --> ROLLBACK[롤백 - sha 태그로 재배포]

테스트 케이스

  • main 브랜치에 push 시 cd.yml이 자동 트리거된다
  • build-and-push 잡 완료 후 ghcr.io/biuea3866/stock-backend:latest 이미지가 갱신된다
  • deploy 잡이 SSH 접속 실패(잘못된 키) 시 잡이 실패하고 이전 컨테이너는 영향받지 않는다
  • 배포 완료 후 프로덕션 서버에서 curl http://localhost:8080/actuator/health가 200을 반환한다
  • sha 태그 이미지를 이용해 이전 버전으로 롤백할 수 있다
  • PR 브랜치(feat/*)에 push 시 cd.yml이 트리거되지 않는다 (main 브랜치만 트리거)