Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 0 additions & 86 deletions .github/ISSUE_TEMPLATE/redis-cache-issue.md

This file was deleted.

104 changes: 104 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# =============================================================================
# CD (Continuous Deployment) 워크플로우
# 목적: main 브랜치 push 시 EC2에 자동 배포
# 보안: 배포 중에만 SSH 포트 열고, 완료 후 자동으로 닫음
#
# 중요: 어떤 방식으로 실행해도 항상 main 브랜치 최신 코드가 배포됩니다.
# =============================================================================
name: CD

# -----------------------------------------------------------------------------
# 트리거:
# 1. main 브랜치에 push 시 자동 실행
# 2. GitHub Actions 탭에서 수동 실행 (Run workflow 버튼)
#
# ※ 수동 실행 시 브랜치 선택과 무관하게 main 브랜치가 배포됩니다.
# -----------------------------------------------------------------------------
on:
push:
branches: [ main ]
workflow_dispatch: # 수동 실행 활성화

permissions:
contents: read

jobs:
deploy:
runs-on: ubuntu-latest

steps:
# -----------------------------------------------------------------------
# Step 1: 현재 GitHub Actions 러너의 IP 확인
# -----------------------------------------------------------------------
- name: 러너 IP 확인
id: ip
run: echo "ipv4=$(curl -s https://api.ipify.org)" >> $GITHUB_OUTPUT

# -----------------------------------------------------------------------
# Step 2: AWS CLI 설정
# -----------------------------------------------------------------------
- name: AWS 자격 증명 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2 # 서울 리전

# -----------------------------------------------------------------------
# Step 3: EC2 보안 그룹에 현재 IP로 SSH(22) 포트 열기
# -----------------------------------------------------------------------
- name: SSH 포트 열기
run: |
aws ec2 authorize-security-group-ingress \
--group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} \
--protocol tcp \
--port 22 \
--cidr ${{ steps.ip.outputs.ipv4 }}/32 \
--tag-specifications 'ResourceType=security-group-rule,Tags=[{Key=Name,Value=github-actions-temp}]'

# -----------------------------------------------------------------------
# Step 4: EC2에 SSH 접속하여 배포 실행
# -----------------------------------------------------------------------
- name: EC2 배포 실행
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
port: 22
script: |
sudo bash -lc '
set -e

# 1. root 계정의 기존 배포 폴더로 이동
cd /root/cocktail-api

# 2. main 브랜치 최신 코드로 동기화
git fetch origin main
git checkout main
git pull --ff-only origin main

# 3. Gradle 권한 부여
chmod +x gradlew

# 4. 기존 컨테이너 종료
docker-compose down

# 5. 다시 빌드 및 실행
docker-compose up -d --build

# 6. 불필요한 이미지 정리
docker image prune -f
'

# -----------------------------------------------------------------------
# Step 5: 배포 완료 후 SSH 포트 닫기 (항상 실행)
# -----------------------------------------------------------------------
- name: SSH 포트 닫기
if: always() # 성공/실패 상관없이 항상 실행
run: |
aws ec2 revoke-security-group-ingress \
--group-id ${{ secrets.EC2_SECURITY_GROUP_ID }} \
--protocol tcp \
--port 22 \
--cidr ${{ steps.ip.outputs.ipv4 }}/32
56 changes: 48 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,36 +1,76 @@
# =============================================================================
# CI (Continuous Integration) 워크플로우
# 목적: PR 또는 push 시 단위 테스트 실행 + 코드 빌드 검증
# =============================================================================
name: CI

# -----------------------------------------------------------------------------
# 트리거 조건: 언제 이 워크플로우가 실행되는지 정의
# -----------------------------------------------------------------------------
on:
push:
branches: [ dev, main ]
branches: [ dev, main ] # dev, main 브랜치에 push 시 실행
pull_request:
branches: [ dev, main ]
branches: [ dev, main ] # dev, main 브랜치로 PR 생성/업데이트 시 실행

jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-latest # Ubuntu 최신 버전에서 실행

steps:
# -------------------------------------------------------------------------
# Step 1: 코드 체크아웃
# 레포지토리의 코드를 runner에 다운로드
# -------------------------------------------------------------------------
- name: Checkout code
uses: actions/checkout@v4

# -------------------------------------------------------------------------
# Step 2: JDK 17 설정
# - Temurin(Eclipse Adoptium) 배포판 사용
# - Gradle 캐시 활성화로 빌드 속도 향상
# -------------------------------------------------------------------------
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: gradle
cache: gradle # Gradle 의존성 캐시 (빌드 시간 단축)

# -------------------------------------------------------------------------
# Step 3: Gradle 실행 권한 부여
# gradlew 파일에 실행 권한이 없을 경우를 대비
# -------------------------------------------------------------------------
- name: Grant execute permission for gradlew
run: chmod +x gradlew

# -------------------------------------------------------------------------
# Step 4: 단위 테스트 실행
# - Mock 기반 단위 테스트로 비즈니스 로직 검증
# - 실제 DB 연결 없이 실행 (환경변수 불필요)
# -------------------------------------------------------------------------
- name: Run Unit Tests
run: ./gradlew test

# -------------------------------------------------------------------------
# Step 5: Gradle 빌드 실행
# - clean: 이전 빌드 결과물 삭제
# - build: 프로젝트 빌드
# - -x test: 테스트는 위에서 이미 실행했으므로 스킵
# -------------------------------------------------------------------------
- name: Build with Gradle
run: ./gradlew clean build -x test

# -------------------------------------------------------------------------
# Step 6: 빌드 아티팩트 업로드
# - 빌드 성공 시에만 실행 (if: success())
# - JAR 파일을 GitHub Actions 아티팩트로 저장
# - 7일간 보관 후 자동 삭제
# -------------------------------------------------------------------------
- name: Upload build artifacts
if: success()
if: success() # 빌드 성공 시에만 실행
uses: actions/upload-artifact@v4
with:
name: build-artifacts
path: build/libs/*.jar
retention-days: 7
name: build-artifacts # 아티팩트 이름
path: build/libs/*.jar # 업로드할 파일 경로 (빌드된 JAR)
retention-days: 7 # 보관 기간 (7일)
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ services:
volumes:
- postgres-data:/var/lib/postgresql

# 3. Redis 서비스
# 3. Redis
redis:
image: redis:7-alpine
container_name: cocktail-redis
Expand Down
Loading
Loading