๊ฐ์
์ด ํ๋ก์ ํธ๋ pnpm ๋ชจ๋ ธ๋ ํฌ ๊ธฐ๋ฐ์ MSA(Microservices Architecture) ๊ตฌ์กฐ๋ก, ๋ณ๊ฒฝ๋ ์๋น์ค๋ง ์ ํ์ ์ผ๋ก ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ํจ์จ์ ์ธ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ต๋๋ค.
๐ํต์ฌ ์์น
- ์๋น์ค ๋จ์ ๋ฐฐํฌ - ๋ ํฌ์งํ ๋ฆฌ ์ ์ฒด๊ฐ ์๋ ๊ฐ๋ณ ์๋น์ค ๋จ์๋ก ๋ฐฐํฌ
- ๋ณ๊ฒฝ๋ ์๋น์ค๋ง CI/CD ์คํ - ๋ถํ์ํ ๋ฆฌ์์ค ๋ญ๋น ๋ฐฉ์ง
- ๊ณตํต ํจํค์ง ๋ณ๊ฒฝ ์ ์์กด ์๋น์ค ์๋ ์ฌ๋ฐฐํฌ - ์์กด์ฑ ๊ทธ๋ํ ๊ธฐ๋ฐ ๋ฐฐํฌ
ํ๋ก์ ํธ ๊ตฌ์กฐ
web10-beastcamp/
โโโ frontend/ # Next.js ํ๋ก ํธ์๋
โ โโโ Dockerfile
โโโ backend/
โ โโโ api-server/ # API ์๋ฒ (NestJS)
โ โ โโโ Dockerfile
โ โโโ ticket-server/ # ํฐ์ผ ์๋ฒ (NestJS)
โ โโโ Dockerfile
โโโ queue-backend/ # ํ ๋ฐฑ์๋ (NestJS)
โ โโโ Dockerfile
โโโ packages/
โ โโโ shared-types/ # ๊ณตํต ํ์
์ ์
โ โโโ backend-config/ # ๋ฐฑ์๋ ๊ณตํต ์ค์
โ โโโ shared-constants/ # ๊ณตํต ์์
โโโ .github/
โโโ workflows/
โ โโโ ci.yml # CI ์ํฌํ๋ก์ฐ (PR)
โ โโโ cd.yml # CD ์ํฌํ๋ก์ฐ (main merge)
โโโ scripts/
โโโ detect-changes.sh # ๋ณ๊ฒฝ ๊ฐ์ง ์คํฌ๋ฆฝํธ
CI/CD ์ํฌํ๋ก์ฐ
1. CI ์ํฌํ๋ก์ฐ (Pull Request)
ํธ๋ฆฌ๊ฑฐ: PR ์์ฑ ๋๋ ์ ๋ฐ์ดํธ (→ main, dev)
๋์ ๊ณผ์ :
- ๋ณ๊ฒฝ ๊ฐ์ง
detect-changes.sh์คํฌ๋ฆฝํธ ์คํ- PR์ target ๋ธ๋์น(base)์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ํ์ผ ๋ถ์
feature→devPR: dev ๋ธ๋์น์ ๋น๊ตdev→mainPR: main ๋ธ๋์น์ ๋น๊ต
- ์ํฅ๋ฐ๋ ์๋น์ค ๋ชฉ๋ก ์์ฑ
- ๋ณ๋ ฌ CI ์คํ
- ๋ณ๊ฒฝ๋ ์๋น์ค๋ง ์ ํ์ ์ผ๋ก CI ์์ ์คํ
- ๊ฐ ์๋น์ค๋ณ๋ก ๋
๋ฆฝ์ ์ธ Job ์คํ:
- Lint ๊ฒ์ฌ
- ๋จ์ ํ ์คํธ
- Next.js ๋น๋ (Frontend๋ง)
- Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
feature→dev: ๋น๋ ํ ์คํธ๋ง (ํธ์ ์ ํจ)dev→main: ๋น๋ ํ NCP Registry์ ํธ์ (Frontend๋ง)
- CI ๊ฒฐ๊ณผ ์์ฝ
- ๋ชจ๋ CI ์์ ๊ฒฐ๊ณผ ์ทจํฉ
- ์คํจ ์ PR ๋จธ์ง ์ฐจ๋จ
2. CD ์ํฌํ๋ก์ฐ (Main Branch)
ํธ๋ฆฌ๊ฑฐ: main ๋ธ๋์น๋ก์ push (merge ์๋ฃ)
๋์ ๊ณผ์ :
- ๋ณ๊ฒฝ ๊ฐ์ง
- ์ด์ ์ปค๋ฐ๊ณผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ์๋น์ค ๊ฐ์ง
- ๋ฐฐํฌ ์ ๋ต (์๋น์ค๋ณ ์ฐจ์ด)
- CI ๋จ๊ณ(dev→main PR)์์ ์ด๋ฏธ ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์ ์๋ฃ
- CD๋ SSH๋ก ํ๋ก ํธ์๋ ์๋ฒ์ ์ ์
- ์๋ฒ์์ CI๊ฐ ํธ์ํ ์ด๋ฏธ์ง๋ฅผ Registry๋ก๋ถํฐ pull
- ์ปจํ
์ด๋ ์คํ (ํ๊ทธ:
{commit-sha}) - ์ฅ์ : ๋น๋ ์๊ฐ ๋จ์ถ (์ํ ์๋ฒ ๋ถ๋ด ๊ฐ์), CI์์ ๋น๋ ์๋ฃ ํ ๋ฐฐํฌ๋ง ์ํ
- GitHub Actions Runner๊ฐ SSH๋ก ๋ฐฐํฌ ์๋ฒ์ ์ ์
- ๋ฐฐํฌ ์๋ฒ์์ ์ง์
git pull๋ก ์ต์ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ - ๋ณ๊ฒฝ๋ ์๋น์ค๋ง
docker-compose build๋ฐdocker-compose up -d์คํ - ์ด์ ์ด๋ฏธ์ง ์ ๋ฆฌ (
docker image prune) - ์ฅ์ : ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ๋ถํ์, ์ค์ ์ด ๊ฐ๋จ
- Frontend (NCP Container Registry ์ฌ์ฉ):
- ๋ฐฐํฌ ๊ฒฐ๊ณผ ์์ฝ
- ๋ชจ๋ ๋ฐฐํฌ ์์ ๊ฒฐ๊ณผ ์ทจํฉ
- ์คํจ ์ ์๋ฆผ
๋ณ๊ฒฝ ๊ฐ์ง ๋ก์ง
์ง์ ๋ณ๊ฒฝ ๊ฐ์ง
ํ์ผ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค ๋ณ๊ฒฝ์ ๊ฐ์งํฉ๋๋ค:
frontend/**→ frontend ๋ฐฐํฌbackend/api-server/**→ api-server ๋ฐฐํฌbackend/ticket-server/**→ ticket-server ๋ฐฐํฌqueue-backend/**→ queue-backend ๋ฐฐํฌ
์์กด์ฑ ๊ธฐ๋ฐ ๋ณ๊ฒฝ ๊ฐ์ง
๊ณตํต ํจํค์ง ๋ณ๊ฒฝ ์ ์์กดํ๋ ์๋น์ค๋ฅผ ์๋์ผ๋ก ์ฌ๋ฐฐํฌํฉ๋๋ค:
packages/shared-types/**๋ณ๊ฒฝ- → api-server ์ฌ๋ฐฐํฌ
- → ticket-server ์ฌ๋ฐฐํฌ
packages/backend-config/**๋ณ๊ฒฝ- → queue-backend ์ฌ๋ฐฐํฌ
packages/shared-constants/**๋ณ๊ฒฝ- → queue-backend ์ฌ๋ฐฐํฌ
pnpm filter ํ์ฉ
# ๋ณ๊ฒฝ๋ ์ํฌ์คํ์ด์ค๋ง ๋น๋
pnpm -r --filter "[origin/main...HEAD]" build
# ํน์ ์๋น์ค์ ์์กด์ฑ๋ง ๋น๋
pnpm --filter @beastcamp/api-server... build
Docker ๋น๋ ์ ๋ต
๋ฉํฐ ์คํ ์ด์ง ๋น๋
๋ชจ๋ ์๋น์ค๋ 3๋จ๊ณ ๋ฉํฐ ์คํ ์ด์ง ๋น๋๋ฅผ ์ฌ์ฉํฉ๋๋ค:
- deps stage: ์์กด์ฑ ์ค์น
- pnpm workspace ๊ตฌ์กฐ ์ ์ง
- frozen-lockfile๋ก ์ ํํ ์์กด์ฑ ๊ด๋ฆฌ
- builder stage: ์ ํ๋ฆฌ์ผ์ด์
๋น๋
- ์์ค ์ฝ๋ ๋ณต์ฌ ๋ฐ ๋น๋
- ๊ณตํต ํจํค์ง ํฌํจ
- runner stage: ํ๋ก๋์
์คํ
- ์ต์ํ์ ๋ฐํ์ ํ์ผ๋ง ํฌํจ
- ๋นํน๊ถ ์ฌ์ฉ์๋ก ์คํ (๋ณด์)
ํ์ด๋ธ๋ฆฌ๋ ๋ฐฐํฌ ์ ๋ต
์ด ํ๋ก์ ํธ๋ ์๋น์ค ํน์ฑ์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฐฐํฌ ๋ฐฉ์์ ํผ์ฉํฉ๋๋ค:
Frontend: NCP Container Registry ์ฌ์ฉ
- ์ด์ : ํ๋ก ํธ์๋ ์๋ฒ ์คํ์ด ์์ ๋น๋ ์๊ฐ์ด ๊ณผ๋ํ๊ฒ ์์ (1์๊ฐ+)
- ๋ฐฉ์:
- CI ๋จ๊ณ (dev→main PR): GitHub Actions Runner์์ ์ด๋ฏธ์ง ๋น๋ ๋ฐ NCP Registry์ ํธ์
- CD ๋จ๊ณ (main merge): ํ๋ก ํธ์๋ ์๋ฒ๋ CI๊ฐ ํธ์ํ ์ด๋ฏธ์ง๋ฅผ pullํ์ฌ ์คํ
- ์ฅ์ :
- ๋น๋ ์๊ฐ ๋ํญ ๋จ์ถ (GitHub Actions์ ๊ณ ์ฑ๋ฅ ํ๊ฒฝ ํ์ฉ)
- Registry์ ๋น๋ ์บ์ ํ์ฉ ๊ฐ๋ฅ
- ์๋ฒ ๋ฆฌ์์ค ๋ถ๋ด ์ต์ํ
- CI ํต๊ณผ = ์ด๋ฏธ์ง ๊ฒ์ฆ ์๋ฃ, CD๋ ๊ฒ์ฆ๋ ์ด๋ฏธ์ง๋ง ๋ฐฐํฌ
Backend Services: ์๋ฒ ์ง์ ๋น๋
- ๋ฐฉ์:
- GitHub Actions → SSH → ๋ฐฐํฌ ์๋ฒ
- ๋ฐฐํฌ ์๋ฒ์์
git pullํdocker-compose build
- ์ฅ์ :
- ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ๋ถํ์ (๋น์ฉ ์ ๊ฐ)
- ์ค์ ์ด ๊ฐ๋จํ๊ณ ์ง๊ด์
- ํ๊ฒฝ ์ผ๊ด์ฑ ๋ณด์ฅ
CI/CD ์ํฌํ๋ก์ฐ
1. ํ๋ก ํธ์๋ CI/CD
2. ๋ฐฑ์๋ CI/CD
์ค์ ๊ฐ์ด๋
1. ๋ฐฐํฌ ์๋ฒ ์ค๋น
์ด ํ๋ก์ ํธ๋ ์๋น์ค๋ณ๋ก ๋ถ๋ฆฌ๋ ์๋ฒ์ ๋ฐฐํฌ๋ฉ๋๋ค:
ํ๋ก ํธ์๋ ์๋ฒ (server1)
โโโ frontend
๋ฐฑ์๋ ์๋ฒ (server2)
โโโ api-server
โโโ ticket-server
ํ ์๋ฒ (server3)
โโโ queue-backend
๊ฐ ์๋ฒ์์ ๋ค์ ํ๊ฒฝ์ ์ค๋นํ์ธ์:
- Docker ๋ฐ Docker Compose ์ค์น
# Docker ์ค์น curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Docker Compose ์ค์น sudo apt-get install docker-compose-plugin- Git Repository ํด๋ก
cd /app git clone https://github.com/your-org/web10-beastcamp.git cd web10-beastcamp- ๋ฐฐํฌ์ฉ ์ฌ์ฉ์ ์์ฑ (๊ถ์ฅ)
sudo useradd -m -s /bin/bash deploy sudo usermod -aG docker deploy
2. GitHub Secrets ์ค์
GitHub Repository → Settings → Secrets and variables → Actions์์ ๋ค์ ์ํฌ๋ฆฟ์ ์ถ๊ฐํ์ธ์:
๊ณตํต SSH ํค
| Secret ์ด๋ฆ | ์ค๋ช | ์์ |
|---|---|---|
SSH_PRIVATE_KEY |
๋ชจ๋ ์๋ฒ์์ ์ฌ์ฉํ๋ SSH ํค | -----BEGIN OPENSSH PRIVATE KEY-----... |
์๋ฒ๋ณ ํธ์คํธ ๋ฐ ์ฌ์ฉ์
| Secret ์ด๋ฆ | ์ค๋ช | ์์ |
|---|---|---|
FRONTEND_SERVER_HOST |
ํ๋ก ํธ์๋ ์๋ฒ ํธ์คํธ | 123.456.78.90 |
FRONTEND_SERVER_USER |
ํ๋ก ํธ์๋ ์๋ฒ ์ฌ์ฉ์ | deploy |
BACKEND_SERVER_HOST |
๋ฐฑ์๋ ์๋ฒ ํธ์คํธ | 123.456.78.91 |
BACKEND_SERVER_USER |
๋ฐฑ์๋ ์๋ฒ ์ฌ์ฉ์ | deploy |
QUEUE_SERVER_HOST |
ํ ์๋ฒ ํธ์คํธ | 123.456.78.92 |
QUEUE_SERVER_USER |
ํ ์๋ฒ ์ฌ์ฉ์ | deploy |
NCP Container Registry (ํ๋ก ํธ์๋ ๋ฐฐํฌ์ฉ)
| Secret ์ด๋ฆ | ์ค๋ช | ์์ |
|---|---|---|
NCP_REGISTRY_URL |
NCP Container Registry URL | your-registry.kr.ncr.ntruss.com |
NCP_REGISTRY_USERNAME |
NCP Container Registry ์ฌ์ฉ์ | your-username |
NCP_REGISTRY_PASSWORD |
NCP Container Registry ๋น๋ฐ๋ฒํธ | your-password ๋๋ Access Token |
์ด 10๊ฐ์ Secrets ํ์
SSH ํค ์์ฑ ๋ฐฉ๋ฒ
ํ ๋ฒ๋ง SSH ํค๋ฅผ ์์ฑํ๊ณ ๋ชจ๋ ์๋ฒ์ ๊ณต๊ฐํค๋ฅผ ๋ฑ๋กํ์ธ์:
# 1. ๋ก์ปฌ ๋๋ ์์ ํ ํ๊ฒฝ์์ SSH ํค ์์ฑ
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions
# 2. ๊ฐ ๋ฐฐํฌ ์๋ฒ์ ๊ณต๊ฐํค ๋ฑ๋ก
# ํ๋ก ํธ์๋ ์๋ฒ
ssh deploy@FRONTEND_SERVER_HOST 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/github_actions.pub
# ๋ฐฑ์๋ ์๋ฒ
ssh deploy@BACKEND_SERVER_HOST 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/github_actions.pub
# ํ ์๋ฒ
ssh deploy@QUEUE_SERVER_HOST 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' < ~/.ssh/github_actions.pub
# 3. ๊ฐ ์๋ฒ์์ ๊ถํ ์ค์
ssh deploy@์๋ฒ์ฃผ์ 'chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'
# 4. ๊ฐ์ธํค๋ฅผ GitHub Secret (SSH_PRIVATE_KEY)์ ๋ฑ๋ก
cat ~/.ssh/github_actions
# ์ถ๋ ฅ๋ ์ ์ฒด ๋ด์ฉ์ ๋ณต์ฌํ์ฌ GitHub Secrets์ ๋ฑ๋ก
NCP Container Registry ์ค์ ๋ฐฉ๋ฒ
ํ๋ก ํธ์๋ ๋ฐฐํฌ๋ฅผ ์ํด NCP Container Registry๋ฅผ ์ค์ ํ์ธ์:
# 1. NCP Console์์ Container Registry ์์ฑ
# - Container Registry ๋ฉ๋ด ์ ์
# - ๋ ์ง์คํธ๋ฆฌ ์์ฑ (์: beastcamp-registry)
# - ์์ฑ ์๋ฃ ํ Registry URL ํ์ธ (์: beastcamp-registry.kr.ncr.ntruss.com)
# 2. Access Token ์์ฑ (๋๋ Sub Account ์ฌ์ฉ)
# - Container Registry ์์ธ ํ์ด์ง์์ Access Token ์์ฑ
# - Username๊ณผ Token ๋ณต์ฌ
# 3. GitHub Secrets์ ๋ฑ๋ก
# NCP_REGISTRY_URL: beastcamp-registry.kr.ncr.ntruss.com
# NCP_REGISTRY_USERNAME: your-username
# NCP_REGISTRY_PASSWORD: your-token
# 4. ํ๋ก ํธ์๋ ์๋ฒ์์ Registry ๋ก๊ทธ์ธ ํ
์คํธ
ssh deploy@FRONTEND_SERVER_HOST
docker login beastcamp-registry.kr.ncr.ntruss.com -u your-username -p your-token
3. Docker Compose ํ์ผ ํ์ธ
๊ฐ ์๋น์ค ๋๋ ํ ๋ฆฌ์ docker-compose.yml ํ์ผ์ด ์ด๋ฏธ ์์ฑ๋์ด ์์ต๋๋ค:
ํ๋ก ํธ์๋ (frontend/docker-compose.yml)
version: '3.8'
services:
frontend:
build:
context: ..
dockerfile: frontend/Dockerfile
ports:
- '3000:3000'
environment:
- NODE_ENV=production
restart: unless-stopped
๋ฐฑ์๋ (backend/docker-compose.yml)
version: '3.8'
services:
api-server:
build:
context: ..
dockerfile: backend/api-server/Dockerfile
ports:
- '3001:3001'
environment:
- NODE_ENV=production
restart: unless-stopped
ticket-server:
build:
context: ..
dockerfile: backend/ticket-server/Dockerfile
ports:
- '3002:3002'
environment:
- NODE_ENV=production
restart: unless-stopped
ํ ์๋ฒ (queue-backend/docker-compose.yml)
version: '3.8'
services:
queue-backend:
build:
context: ..
dockerfile: queue-backend/Dockerfile
ports:
- '3003:3003'
environment:
- NODE_ENV=production
restart: unless-stopped
4. ๋ฐฐํฌ ๊ฒฝ๋ก ์ปค์คํฐ๋ง์ด์ฆ
.github/workflows/cd.yml์ ๋ฐฐํฌ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๊ฒฝ์ ๋ง๊ฒ ์์ ํ์ธ์:
# ๊ธฐ๋ณธ๊ฐ: cd /app/web10-beastcamp
# ์ค์ ๋ฐฐํฌ ๊ฒฝ๋ก๋ก ๋ณ๊ฒฝ
cd /your/actual/deployment/path
์ฌ์ฉ ์์
์๋๋ฆฌ์ค 1: Frontend๋ง ์์
# frontend ํ์ผ ์์
git add frontend/
git commit -m "feat: ๋ฉ์ธ ํ์ด์ง UI ๊ฐ์ "
git push origin feature/improve-ui
# feature -> dev PR ์์ฑ → CI ์คํ (frontend๋ง)
# โ
CI - Frontend: lint, Next.js build, Docker build (ํธ์ ์ ํจ)
# โญ๏ธ CI - API Server: skipped
# โญ๏ธ CI - Ticket Server: skipped
# โญ๏ธ CI - Queue Backend: skipped
# dev์ merge ํ, dev -> main PR ์์ฑ → CI ์คํ
# โ
CI - Frontend: lint, Next.js build, Docker build + NCP Registry ํธ์
# โญ๏ธ CI - API Server: skipped
# โญ๏ธ CI - Ticket Server: skipped
# โญ๏ธ CI - Queue Backend: skipped
# main์ merge → CD ์คํ (frontend๋ง)
# ๐ Deploy - Frontend: SSH → CI๊ฐ ํธ์ํ ์ด๋ฏธ์ง pull → ์ปจํ
์ด๋ ์คํ
# โญ๏ธ Deploy - API Server: skipped
# โญ๏ธ Deploy - Ticket Server: skipped
# โญ๏ธ Deploy - Queue Backend: skipped
์๋๋ฆฌ์ค 2: shared-types ์์ (๊ณตํต ํจํค์ง)
# shared-types ์์
git add packages/shared-types/
git commit -m "feat: ์๋ก์ด ํ์
์ถ๊ฐ"
git push origin feature/add-types
# feature -> dev PR ์์ฑ → CI ์คํ (์์กด ์๋น์ค๋ค๋ง)
# โญ๏ธ CI - Frontend: skipped
# โ
CI - API Server: lint, test, build, Docker build
# โ
CI - Ticket Server: lint, test, build, Docker build
# โญ๏ธ CI - Queue Backend: skipped
# dev์ merge ํ, dev -> main PR ์์ฑ → CI ์คํ (์ด๋ฏธ์ง ํธ์ ์์, ๋ฐฑ์๋๋ ์๋ฒ ๋น๋ ๋ฐฉ์)
# โญ๏ธ CI - Frontend: skipped
# โ
CI - API Server: lint, test, build, Docker build
# โ
CI - Ticket Server: lint, test, build, Docker build
# โญ๏ธ CI - Queue Backend: skipped
# main์ merge → CD ์คํ (์์กด ์๋น์ค๋ค๋ง)
# โญ๏ธ Deploy - Frontend: skipped
# ๐ Deploy - API Server: SSH → git pull → docker-compose build/up
# ๐ Deploy - Ticket Server: SSH → git pull → docker-compose build/up
# โญ๏ธ Deploy - Queue Backend: skipped
์๋๋ฆฌ์ค 3: ์ฌ๋ฌ ์๋น์ค ๋์ ์์
# ์ฌ๋ฌ ์๋น์ค ์์
git add frontend/ backend/api-server/
git commit -m "feat: ์ฌ์ฉ์ ์ธ์ฆ ๊ธฐ๋ฅ ์ถ๊ฐ"
git push origin feature/auth
# feature -> dev PR ์์ฑ → CI ์คํ (๋ณ๋ ฌ)
# โ
CI - Frontend: lint, Next.js build, Docker build (ํธ์ ์ ํจ)
# โ
CI - API Server: lint, test, build, Docker build
# โญ๏ธ CI - Ticket Server: skipped
# โญ๏ธ CI - Queue Backend: skipped
# dev์ merge ํ, dev -> main PR ์์ฑ → CI ์คํ (๋ณ๋ ฌ)
# โ
CI - Frontend: lint, Next.js build, Docker build + NCP Registry ํธ์
# โ
CI - API Server: lint, test, build, Docker build
# โญ๏ธ CI - Ticket Server: skipped
# โญ๏ธ CI - Queue Backend: skipped
# main์ merge → CD ์คํ (๋ณ๋ ฌ)
# ๐ Deploy - Frontend: SSH → CI๊ฐ ํธ์ํ ์ด๋ฏธ์ง pull → ์ปจํ
์ด๋ ์คํ
# ๐ Deploy - API Server: SSH → git pull → docker-compose build/up
# โญ๏ธ Deploy - Ticket Server: skipped
# โญ๏ธ Deploy - Queue Backend: skipped
ํธ๋ฌ๋ธ์ํ
๋ณ๊ฒฝ์ด ์๋๋ฐ CI/CD๊ฐ ์คํ๋จ
์์ธ: git history๊ฐ ๊น์ง ์๊ฑฐ๋ base branch ๋น๊ต ์ค๋ฅ
ํด๊ฒฐ:
# .github/workflows/ci.yml ๋๋ cd.yml์์
- uses: actions/checkout@v4
with:
fetch-depth: 0 # ์ ์ฒด ํ์คํ ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
Docker ๋น๋ ์คํจ
์์ธ: pnpm workspace ์์กด์ฑ ํด๊ฒฐ ์คํจ
ํด๊ฒฐ:
- Dockerfile์์ workspace ํ์ผ๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋ณต์ฌ๋๋์ง ํ์ธ
pnpm install --frozen-lockfile์ฌ์ฉ ํ์ธ- ๋ก์ปฌ์์ Docker ๋น๋ ํ
์คํธ:
docker build -f frontend/Dockerfile -t test:latest .
๊ณตํต ํจํค์ง ๋ณ๊ฒฝ์ด ๊ฐ์ง๋์ง ์์
์์ธ: detect-changes.sh ์คํฌ๋ฆฝํธ์ ํจํค์ง ๊ฒฝ๋ก ์ค๋ฅ
ํด๊ฒฐ:
- ์คํฌ๋ฆฝํธ ๋๋ฒ๊ทธ:
.github/scripts/detect-changes.sh origin/main - ํจํค์ง ๊ฒฝ๋ก๊ฐ ์ ํํ์ง ํ์ธ
- ์์กด์ฑ ๋งคํ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
SSH ์ ์ ์คํจ
์์ธ: SSH ํค ์ค์ ๋๋ ๊ถํ ๋ฌธ์
ํด๊ฒฐ:
- GitHub Secrets์ SSH ํค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฑ๋ก๋์๋์ง ํ์ธ
- ๋ฐฐํฌ ์๋ฒ์์ SSH ์ ์ ํ
์คํธ:
ssh -i ~/.ssh/github_actions deploy@your-server - known_hosts ๋ฌธ์ ์ ๋ฐฐํฌ ์๋ฒ ์ฌ์์ ํ ์ฌ์๋
Docker Compose ๋น๋ ์คํจ
์์ธ: docker-compose.yml ํ์ผ์ด ์๊ฑฐ๋ ๊ฒฝ๋ก ์ค๋ฅ
ํด๊ฒฐ:
- ํ๋ก์ ํธ ๋ฃจํธ์ docker-compose.yml ํ์ผ์ด ์๋์ง ํ์ธ
- Dockerfile ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธ
- ๋ฐฐํฌ ์๋ฒ์์ ์๋ ํ
์คํธ:
cd /app/web10-beastcamp docker-compose build frontend
์ฅ๋จ์
์ฅ์ โ
- ๋น ๋ฅธ CI/CD: ๋ณ๊ฒฝ๋ ์๋น์ค๋ง ์ฒ๋ฆฌํ์ฌ ์๊ฐ ์ ์ฝ
- ๋ฆฌ์์ค ํจ์จ: ๋ถํ์ํ ๋น๋/๋ฐฐํฌ ๋ฐฉ์ง
- ๋ช ํํ ์ํฅ ๋ฒ์: ์ด๋ค ์๋น์ค๊ฐ ๋ฐฐํฌ๋๋์ง ๋ช ํ
- ์์ ํ ๋ฐฐํฌ: ์์กด์ฑ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ์ฐ๊ด ์๋น์ค ์ฌ๋ฐฐํฌ
- ํ์ด๋ธ๋ฆฌ๋ ์ ๋ต: ์๋น์ค ํน์ฑ์ ๋ง๋ ์ต์ ์ ๋ฐฐํฌ ๋ฐฉ์ ์ ํ
- Frontend: CI์์ ๋น๋ ๋ฐ ๊ฒ์ฆ ์๋ฃ, CD๋ ๊ฒ์ฆ๋ ์ด๋ฏธ์ง๋ง ๋ฐฐํฌ
- Backend: ์๋ฒ ์ง์ ๋น๋๋ก ๊ฐ๋จํ ์ค์
- ๋น๋ ์บ์ฑ: Frontend๋ Registry์ ๋น๋ ์บ์ ํ์ฉ ๊ฐ๋ฅ
- ๊ฒ์ฆ๋ ๋ฐฐํฌ: CI ํต๊ณผ = ์ด๋ฏธ์ง ๊ฒ์ฆ ์๋ฃ, CD๋ ์ด๋ฏธ ๊ฒ์ฆ๋ ์ํฐํฉํธ๋ง ๋ฐฐํฌ
๋จ์ / ๊ณ ๋ ค์ฌํญ โ ๏ธ
- ์ด๊ธฐ ์ค์ ๋ณต์ก๋: CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ํ์ต ํ์
- ๋ณ๊ฒฝ ๊ฐ์ง ๋ก์ง ์ ์ง๋ณด์: ์๋น์ค ์ถ๊ฐ/๋ณ๊ฒฝ ์ ์คํฌ๋ฆฝํธ ์ ๋ฐ์ดํธ ํ์
- ํ ํ์ต ๊ณก์ : pnpm workspace์ ๋ชจ๋ ธ๋ ํฌ ๊ฐ๋ ์ดํด ํ์
- ์์กด์ฑ ๊ด๋ฆฌ: ๊ณตํต ํจํค์ง์ breaking change ๊ด๋ฆฌ ์ค์
- Registry ๋น์ฉ: Frontend ๋ฐฐํฌ๋ฅผ ์ํ NCP Container Registry ๋น์ฉ ๋ฐ์ (ํธ๋ํฝ/์คํ ๋ฆฌ์ง์ ๋ฐ๋ผ ๋ณ๋)