|
1 | | -# GitHub Actions CI 파이프라인 설정 가이드 |
| 1 | +# GitHub Actions CI/CD 파이프라인 설정 가이드 |
2 | 2 |
|
3 | | -## ? 현재 구성 |
| 3 | +## 🎯 현재 구성 |
4 | 4 |
|
5 | | -이 프로젝트는 **CI (Continuous Integration)** 파이프라인만 구축되어 있습니다. |
6 | | -코드 푸시/PR 시 자동으로 빌드 검증이 실행됩니다. |
| 5 | +- **CI (Continuous Integration)**: 코드 푸시/PR 시 자동 빌드 검증 |
| 6 | +- **CD (Continuous Deployment)**: develop 브랜치 푸시 시 EC2 자동 배포 |
7 | 7 |
|
8 | | -## ? 워크플로우 설명 |
| 8 | +## 🚀 워크플로우 설명 |
9 | 9 |
|
10 | | -### `ci.yml` - 지속적 통합 (CI) |
11 | | -**트리거**: |
12 | | -- Pull Request 생성/업데이트 (develop, main 브랜치 대상) |
13 | | -- 코드 푸시 (develop, main, feature/*, fix/*, hotfix/* 브랜치) |
| 10 | +### 1. `ci.yml` - 지속적 통합 (CI) |
| 11 | +**트리거**: |
| 12 | +- Pull Request 생성/업데이트 (develop, main 브랜치 대상) |
| 13 | +- 코드 푸시 (develop, main, feature/*, fix/*, hotfix/* 브랜치) |
14 | 14 |
|
15 | | -**동작**: |
16 | | -1. **Backend 빌드 검증** |
17 | | - - Node.js 20 환경 설정 |
18 | | - - npm 의존성 설치 |
19 | | - - Prisma Client 생성 |
20 | | - - JavaScript 문법 검증 |
21 | | - - Docker 이미지 빌드 테스트 |
| 15 | +**동작**: |
| 16 | +1. **Backend 빌드 검증** |
| 17 | + - Node.js 20 환경 설정 |
| 18 | + - npm 의존성 설치 |
| 19 | + - Prisma Client 생성 |
| 20 | + - JavaScript 문법 검증 |
| 21 | + - Docker 이미지 빌드 테스트 |
22 | 22 |
|
23 | | -2. **FastAPI 빌드 검증** |
24 | | - - Python 3.11 환경 설정 |
25 | | - - pip 의존성 설치 |
26 | | - - Python 문법 검증 |
27 | | - - Docker 이미지 빌드 테스트 |
| 23 | +2. **FastAPI 빌드 검증** |
| 24 | + - Python 3.11 환경 설정 |
| 25 | + - pip 의존성 설치 |
| 26 | + - Python 문법 검증 |
| 27 | + - Docker 이미지 빌드 테스트 |
28 | 28 |
|
29 | | -3. **Docker Compose 검증** |
30 | | - - docker-compose.yml 설정 검증 |
31 | | - - MySQL/Redis 컨테이너 시작 테스트 |
| 29 | +3. **Docker Compose 검증** |
| 30 | + - docker-compose.yml 설정 검증 |
| 31 | + - MySQL/Redis 컨테이너 시작 테스트 |
32 | 32 |
|
33 | | -## ? 사용법 |
| 33 | +### 2. `cd-deploy.yml` - 자동 배포 (CD) |
| 34 | +**트리거**: |
| 35 | +- develop 브랜치 푸시 |
| 36 | +- 수동 실행 (Actions 탭에서) |
34 | 37 |
|
35 | | -### 1?? 코드 푸시 시 자동 실행 |
| 38 | +**동작**: |
| 39 | +1. **Docker 이미지 빌드 & 푸시** |
| 40 | + - GitHub Container Registry (GHCR)에 이미지 업로드 |
| 41 | + - `ghcr.io/{owner}/{repo}/backend:latest` |
| 42 | + - `ghcr.io/{owner}/{repo}/fastapi:latest` |
| 43 | + |
| 44 | +2. **EC2 서버 배포** |
| 45 | + - SSH로 서버 접속 |
| 46 | + - 최신 코드 pull (develop 브랜치) |
| 47 | + - GHCR에서 최신 이미지 pull |
| 48 | + - Docker Compose로 컨테이너 재시작 |
| 49 | + - 구버전 이미지 정리 |
| 50 | + |
| 51 | +## 📋 필요한 GitHub Secrets 설정 |
| 52 | + |
| 53 | +**Repository → Settings → Secrets and variables → Actions** |
| 54 | + |
| 55 | +### 🔐 현재 설정된 Secrets |
| 56 | +``` |
| 57 | +EC2_HOST: EC2 서버 IP 주소 |
| 58 | +EC2_USER: ubuntu |
| 59 | +EC2_SSH_KEY: SSH 프라이빗 키 |
| 60 | +``` |
| 61 | + |
| 62 | +## 🔄 배포 플로우 |
| 63 | + |
| 64 | +``` |
| 65 | +1. feature 브랜치에서 개발 |
| 66 | + ↓ |
| 67 | +2. develop 브랜치로 PR 생성 → CI 자동 실행 (검증만) |
| 68 | + ↓ |
| 69 | +3. PR 머지 → develop 브랜치 |
| 70 | + ↓ |
| 71 | +4. CD 자동 실행 → EC2 서버 배포 🚀 |
| 72 | +``` |
| 73 | + |
| 74 | +## 📝 사용법 |
| 75 | + |
| 76 | +### 1️⃣ 코드 푸시 시 CI 자동 실행 |
36 | 77 | ```bash |
37 | 78 | git add . |
38 | | -git commit -m "[feat]: 새로운 기능 추가" |
| 79 | +git commit -m "[feat]: 새로운 기능 추가" |
39 | 80 | git push origin feature/new-feature |
40 | 81 | ``` |
41 | 82 |
|
42 | | -### 2?? PR 생성 시 자동 검증 |
| 83 | +### 2️⃣ PR 생성 시 자동 검증 |
| 84 | +```bash |
| 85 | +# GitHub에서 PR 생성 |
| 86 | +feature/new-feature → develop |
| 87 | +# → CI가 자동 실행되어 빌드 검증 |
| 88 | +``` |
| 89 | + |
| 90 | +### 3️⃣ PR 머지 후 자동 배포 |
43 | 91 | ```bash |
44 | | -# GitHub에서 PR 생성 |
45 | | -feature/new-feature → develop |
| 92 | +# PR 머지 완료 |
| 93 | +# → develop 브랜치에 반영 |
| 94 | +# → CD가 자동 실행되어 EC2에 배포 |
46 | 95 | ``` |
47 | 96 |
|
48 | | -### 3?? 결과 확인 |
49 | | -**GitHub Repository → Actions 탭**에서 실시간 로그 확인 가능 |
| 97 | +### 4️⃣ 결과 확인 |
| 98 | +**GitHub Repository → Actions 탭**에서 실시간 로그 확인 가능 |
| 99 | + |
| 100 | +## 🐛 트러블슈팅 |
| 101 | + |
| 102 | +### CI 실패 시 |
| 103 | + |
| 104 | +**npm install 실패** |
| 105 | +→ `package.json` 의존성 확인 또는 `package-lock.json` 삭제 후 재생성 |
| 106 | + |
| 107 | +**Python 문법 에러** |
| 108 | +→ `fastapi-server/main.py` 코드 검토 |
50 | 109 |
|
51 | | -## ? CI 통과 조건 |
| 110 | +**Docker 빌드 실패** |
| 111 | +→ `Dockerfile` 또는 `fastapi-server/Dockerfile` 검토 |
52 | 112 |
|
53 | | -- Node.js 빌드 성공 |
54 | | -- Python 빌드 성공 |
55 | | -- Docker 이미지 빌드 성공 |
56 | | -- Docker Compose 설정 유효성 검증 통과 |
| 113 | +**Docker Compose 에러** |
| 114 | +→ `docker-compose.yml` 문법 및 서비스 설정 확인 |
57 | 115 |
|
58 | | -## ? 트러블슈팅 |
| 116 | +### CD 실패 시 |
59 | 117 |
|
60 | | -### npm install 실패 |
61 | | -→ `package.json` 의존성 확인 또는 `package-lock.json` 삭제 후 재생성 |
| 118 | +**SSH 접속 실패** |
| 119 | +→ EC2_HOST, EC2_USER, EC2_SSH_KEY 값 확인 |
| 120 | +→ EC2 보안 그룹에서 22번 포트 열려있는지 확인 |
62 | 121 |
|
63 | | -### Python 문법 에러 |
64 | | -→ `fastapi-server/main.py` 코드 검토 |
| 122 | +**git pull 실패** |
| 123 | +→ EC2 서버에 프로젝트가 클론되어 있는지 확인 |
| 124 | +→ `/home/ubuntu/moduwa-server` 경로 존재 여부 확인 |
65 | 125 |
|
66 | | -### Docker 빌드 실패 |
67 | | -→ `Dockerfile` 또는 `fastapi-server/Dockerfile` 검토 |
| 126 | +**docker pull 실패** |
| 127 | +→ GHCR 권한 문제: 워크플로우의 `permissions: packages: write` 확인 |
| 128 | +→ 이미지가 Public으로 설정되어 있는지 확인 |
68 | 129 |
|
69 | | -### Docker Compose 에러 |
70 | | -→ `docker-compose.yml` 문법 및 서비스 설정 확인 |
| 130 | +**docker-compose 실패** |
| 131 | +→ EC2 서버의 `.env` 파일 확인 |
| 132 | +→ 환경변수가 제대로 설정되어 있는지 확인 |
71 | 133 |
|
72 | | -## ? 로그 확인 |
73 | | -GitHub Actions 실행 로그: **Repository → Actions 탭 → 해당 워크플로우 클릭** |
| 134 | +## 📞 로그 확인 |
| 135 | +**GitHub Actions 실행 로그**: Repository → Actions 탭 → 해당 워크플로우 클릭 |
0 commit comments