-
Notifications
You must be signed in to change notification settings - Fork 7
๐ชต 3. ์ธํ๋ผ ์ค์ต(4) : ๋์ปค๋ก ๋ฐฐํฌํ๊ธฐ CI CD
ssum1ra edited this page Dec 5, 2024
·
1 revision
pm2 delete whiteboard-server
- Docker engine
- ์ปจํ ์ด๋ ์์ฑ, ์คํ, ๊ด๋ฆฌ์ ๊ฐ์ Docker์ ์ฃผ์ ๊ธฐ๋ฅ์ ์ํํ๋ ๋ฐํ์ ํ๊ฒฝ
- ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ
- Docker Documentation: Ubuntu
- Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ
์ค๊ณ๋
# ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ก Node.js 20 Alpine ๋ฒ์ ์ฌ์ฉ
# Alpine์ ๋งค์ฐ ๊ฐ๋ฒผ์ด Linux ๋ฐฐํฌํ
FROM node:20-alpine
# ์ปจํ
์ด๋ ๋ด๋ถ์ ์์
๋๋ ํ ๋ฆฌ ์ค์
WORKDIR /app
# package.json ํ์ผ๋ค๋ง ๋จผ์ ๋ณต์ฌ
# ์บ์ ํ์ฉ์ ์ํด ์์ค์ฝ๋๋ณด๋ค ๋จผ์ ๋ณต์ฌ
COPY package*.json ./
# npm ci๋ package-lock.json ๊ธฐ๋ฐ์ผ๋ก ์ ํํ ๋ฒ์ ์ค์น
RUN npm ci
# ๋๋จธ์ง ์์ค ํ์ผ ๋ณต์ฌ
COPY . .
# NestJS ์ฑ ๋น๋
RUN npm run build
# 3000๋ฒ ํฌํธ ์ฌ์ฉ ๋ช
์
EXPOSE 3000
# ์ปจํ
์ด๋ ์คํ ์ ์คํํ ๋ช
๋ น์ด
CMD ["npm", "run", "start:prod"]
- ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ์ Docker ์ด๋ฏธ์ง ์ ์ฅ์
- NCP์
Container Repository
์ ์ ์ฌ
- The World's Largest Container Registry | Docker
- Account Settings > Personal access tokens > Generate new token
- server ํด๋์ Dockerfile ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง ๋น๋
- ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ Docker Hub์ push
- Docker Hub ๋ก๊ทธ์ธ
- ์ ์ด๋ฏธ์ง pull
- ๊ธฐ์กด ์ปจํ ์ด๋ ์ ์ง/์ ๊ฑฐ
- ์ ์ปจํ ์ด๋ ์คํ
name: Whiteboard CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "20"
# ์บ์ ์ค์ (npm ๊ธฐ์ค)
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
**/node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
# ํ๋ก ํธ์๋ ๋น๋ ๋ฐ ๋ฐฐํฌ
- name: Install & Build Frontend
working-directory: ./client
env:
VITE_SOCKET_URL: ${{ secrets.VITE_SOCKET_URL }}
run: |
npm ci
npm run build
# Object Storage ์
๋ก๋
- name: Deploy to Object Storage
env:
AWS_ACCESS_KEY_ID: ${{ secrets.NCP_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.NCP_SECRET_KEY }}
run: |
# S3 ์
๋ก๋
aws s3 sync ./client/dist s3://test-web30 \
--endpoint-url https://kr.object.ncloudstorage.com \
--region kr-standard
# ๋์ปค ๋น๋ & ๋ฐฐํฌ
- name: Docker Setup
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and Push Docker Image
uses: docker/build-push-action@v5
with:
context: ./server
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/whiteboard:latest
# ์๋ฒ ๋ฐฐํฌ
- name: Deploy to Server
uses: appleboy/[email protected]
with:
host: ${{ secrets.SSH_HOST }}
username: ncloud
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
# Docker ๋ก๊ทธ์ธ
echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
# ์ ์ด๋ฏธ์ง ํ
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/whiteboard:latest
# ๊ธฐ์กด ์ปจํ
์ด๋ ์ ์ง & ์ ๊ฑฐ
docker stop whiteboard || true
docker rm whiteboard || true
# ์ ์ปจํ
์ด๋ ์คํ
docker run -d --name whiteboard -p 3000:3000 --restart unless-stopped ${{ secrets.DOCKERHUB_USERNAME }}/whiteboard:latest
- Alpine ์ด๋ฏธ์ง์ mediasoup ์ถฉ๋
FROM node:20-alpine # ์ต์ํ๋ ๋ฆฌ๋
์ค๋ก mediasoup ๊ฐ์ ๋ค์ดํฐ๋ธ ๋ชจ๋ ๋น๋ ์ด๋ ค์
# 1. ๊ธฐ๋ณธ node ์ด๋ฏธ์ง ์ฌ์ฉ
FROM node:20
# 2. Alpine์ ๋น๋ ๋๊ตฌ ์ถ๊ฐ
FROM node:20-alpine
RUN apk add --no-cache python3 make g++ gcc
- Docker ๊ถํ ๋ฌธ์
# ncloud ์ฌ์ฉ์๋ฅผ docker ๊ทธ๋ฃน์ ์ถ๊ฐ
sudo usermod -aG docker ncloud
# ๋ณ๊ฒฝ์ฌํญ ์ ์ฉ์ ์ํด ์ฌ๋ก๊ทธ์ธ
exit
docker ps # ๊ถํ ๋ฌธ์ ์์ด ์คํ๋์ด์ผ ํจ
- 1. ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ๋ฐ ํ๋ก์ ํธ ๋ฌธ์ํ
- 2. ์ค์๊ฐ ํต์
- 3. ์ธํ๋ผ ๋ฐ CI/CD
- 4. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด Canvas ๊ตฌํํ๊ธฐ
- 5. ์บ๋ฒ์ค ๋๊ธฐํ๋ฅผ ์ํ ์์ CRDT ๊ตฌํ๊ธฐ
-
6. ์ปดํฌ๋ํธ ํจํด๋ถํฐ ์น์์ผ๊น์ง, ํจ์จ์ ์ธ FE ์ค๊ณ
- ์ข์ ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ๊ฐ? + Headless Pattern
- ํจ์จ์ ์ธ UI ์ปดํฌ๋ํธ ์คํ์ผ๋ง: Tailwind CSS + cn.ts
- Tailwind CSS๋ก ๋์์ธ ์์คํ ๋ฐ UI ์ปดํฌ๋ํธ ์ธํ
- ์น์์ผ ํด๋ผ์ด์ธํธ ๊ตฌํ๊ธฐ: React ํ๊ฒฝ์์ ํจ์จ์ ์ธ ์น์์ผ ์ํคํ ์ฒ
- ์น์์ผ ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ถ์ ๋ฐ ๊ณต์
- 7. ํธ๋ฌ๋ธ ์ํ ๋ฐ ์ฑ๋ฅ/UX ๊ฐ์
- 1์ฃผ์ฐจ ๊ธฐ์ ๊ณต์
- 2์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- 3์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- 4์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- 5์ฃผ์ฐจ ๋ฐ๋ชจ ๋ฐ์ด
- WEEK 06 ์ฃผ๊ฐ ๊ณํ
- WEEK 06 ๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- WEEK 06 ์ฃผ๊ฐ ํ๊ณ