๐ Next.js ์ํฌํ๋ก์ฐ ์์ ์ ๋ณต
Next.js ํ๋ก์ ํธ์์ ํจ์จ์ ์ธ CI/CD๋ฅผ ์ํ GitHub Actions ์ํฌํ๋ก์ฐ ์ค์
๐ ๋ชฉ์ฐจ
1๏ธโฃ Next.js์์ CI/CD๋ฅผ ๋์ ํด์ผ ํ๋ ์ด์
2๏ธโฃ Next.js ์ํฌํ๋ก์ฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ
3๏ธโฃ ์ฃผ์ ๊ตฌ์ฑ ์์ (on, jobs, steps, needs ๋ฑ)
4๏ธโฃ Next.js CI/CD ์๋ํ ์ค์ ์์
5๏ธโฃ ๋ฐฐํฌ ์๋ํ๋ฅผ ์ํ ์ถ๊ฐ ์ต์ ํ ์ ๋ต
6๏ธโฃ ๊ฒฐ๋ก
1๏ธโฃ Next.js์์ CI/CD๋ฅผ ๋์ ํด์ผ ํ๋ ์ด์
Next.js ํ๋ก์ ํธ์์๋ ์ ์ ์์ฑ(SSG), ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR), API Routes, Image Optimization ๋ฑ
์ฌ๋ฌ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ ์๋ํ์ ์ฑ๋ฅ ์ต์ ํ๊ฐ ๋งค์ฐ ์ค์ํด์.
CI/CD๋ฅผ ํตํด ๐
โ ์๋์ผ๋ก ๋น๋ & ๋ฐฐํฌํด์ ์ค์๋ฅผ ์ค์ด๊ณ ,
โ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋น ๋ฅด๊ฒ ๊ฒ์ฆํด์ ์์ ํ ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ด์.
โ CI/CD ์์ด ๋ฐฐํฌํ ๊ฒฝ์ฐ?
โ ๋ก์ปฌ์์๋ง ๋์ํ๋ ์ฝ๋๊ฐ ์์ ์ ์์
โ ๋ฐฐํฌ ์ ํ๊ฒฝ ๋ณ์๊ฐ ๋๋ฝ๋ ๊ฐ๋ฅ์ฑ ๋์
โ ์ ์ ํ์ด์ง & ์๋ฒ ์ฌ์ด๋ ํ์ด์ง ์บ์ฑ ๋ฌธ์ ๋ฐ์
์ด์ Next.js์ ์ํฌํ๋ก์ฐ๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋ฉด ์ข์์ง ์ดํด๋ณด์! ๐ฏ
2๏ธโฃ Next.js ์ํฌํ๋ก์ฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ
Next.js ํ๋ก์ ํธ์์ CI/CD๋ฅผ ์๋ํํ๊ธฐ ์ํด ๋ณดํต GitHub Actions๋ฅผ ํ์ฉํด์.
GitHub Actions๋ YAML ํ์ผ์ ์ด์ฉํด์ ์ํฌํ๋ก์ฐ๋ฅผ ์ ์ํ๊ณ ์คํํ๋๋ฐ,
๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์์.
name: Next.js CI/CD
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install Dependencies
run: npm ci
- name: Build Project
run: npm run build
๐ ์ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด?
โ on: ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ํฌํ๋ก์ฐ๋ฅผ ์คํํ ์ง ์ค์
โ jobs: ์คํํ ์์ ๋ค์ ์ ์
โ steps: ํ ๊ฐ์ ์์ (job) ์์์ ๋จ๊ณ๋ณ๋ก ์คํํ ๋ช ๋ น์ด
์ด์ ๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ์์ธํ ์ดํด๋ณด์! ๐ง
3๏ธโฃ ์ฃผ์ ๊ตฌ์ฑ ์์ (on, jobs, steps, needs ๋ฑ)
โ๏ธ on: ์ํฌํ๋ก์ฐ ์คํ ์กฐ๊ฑด
on ํค์๋๋ GitHub Actions์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์คํ๋๋ ์กฐ๊ฑด์ ์ ์ํด์.
Next.js์์๋ ์ฃผ๋ก push, pull_request, workflow_dispatch ๋ฑ์ ์ฌ์ฉํด์.
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch: # ์๋ ์คํ
โ ์ด๋ ๊ฒ ์ค์ ํ๋ฉด?
โ๏ธ main ๋ธ๋์น์ push ๋๋ PR์ด ๋ฐ์ํ๋ฉด ์คํ
โ๏ธ workflow_dispatch ์ต์ ์ ์ถ๊ฐํ๋ฉด GitHub Actions์์ ์ง์ ์คํ ๊ฐ๋ฅ
โ๏ธ jobs: ์คํํ ์์ ๊ทธ๋ฃน
jobs ์์๋ ์ฌ๋ฌ ๊ฐ์ job์ ์ ์ํ ์ ์์ด์.
์๋ฅผ ๋ค์ด, ๋น๋ → ํ ์คํธ → ๋ฐฐํฌ ์์๋ก ์คํํ๊ณ ์ถ๋ค๋ฉด ๊ฐ๊ฐ์ job์ ์ ์ํ ์ ์์ด์.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Install Dependencies
run: npm ci
- name: Build Next.js
run: npm run build
โ ์ด๋ ๊ฒ ํ๋ฉด?
โ๏ธ ubuntu-latest ํ๊ฒฝ์์ ์คํ
โ๏ธ npm ci๋ก ์์กด์ฑ ์ค์น ํ npm run build ์คํ
โ๏ธ steps: ๊ฐ ์์ ์์ ์คํํ ๋จ๊ณ
๊ฐ job์๋ ์ฌ๋ฌ ๊ฐ์ steps(๋จ๊ณ)๊ฐ ๋ค์ด๊ฐ์.
GitHub Actions์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ก์ (uses)์ ์ฌ์ฉํ๊ฑฐ๋ ์ง์ ๋ช ๋ น์ด(run)๋ฅผ ์คํํ ์๋ ์์ด์.
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- name: Install Dependencies
run: npm ci
โ ์ด๋ ๊ฒ ํ๋ฉด?
โ๏ธ checkout@v3 → ๋ ํฌ์งํ ๋ฆฌ ์ฝ๋ ๊ฐ์ ธ์ค๊ธฐ
โ๏ธ setup-node@v3 → Node.js 18 ๋ฒ์ ์ค์
โ๏ธ npm ci → ํจํค์ง ์ค์น
โ๏ธ needs: ์ํฌํ๋ก์ฐ ์คํ ์์ ์ง์
needs๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ job์ด ์๋ฃ๋ ํ์ ๋ค๋ฅธ job์ด ์คํ๋๋๋ก ํ ์ ์์ด์.
์๋ฅผ ๋ค์ด, ๋น๋๊ฐ ๋๋์ผ ๋ฐฐํฌ๋ฅผ ํ ์ ์๋ค๋ฉด ์๋์ฒ๋ผ ์ค์ ํ ์ ์์ด์.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Install Dependencies
run: npm ci
- name: Build Next.js
run: npm run build
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy Application
run: echo "๋ฐฐํฌ ์งํ ์ค..."
โ ์ด๋ ๊ฒ ํ๋ฉด?
โ๏ธ build ์์ ์ด ๋๋ ํ์๋ง deploy ์คํ!
4๏ธโฃ Next.js CI/CD ์๋ํ ์ค์ ์์
๋น๋ + ํ ์คํธ + ๋ฐฐํฌ๊น์ง ์๋ํ๋ Next.js CI/CD ์ค์ ์ ๋ง๋ค์ด๋ณด์!
name: Next.js CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Install Dependencies
run: npm ci
- name: Build Next.js
run: npm run build
test:
runs-on: ubuntu-latest
needs: build
steps:
- name: Run Tests
run: npm test
deploy:
runs-on: ubuntu-latest
needs: test
steps:
- name: Deploy Application
run: echo "๋ฐฐํฌ ์งํ ์ค..."
๐ ์ด๋ ๊ฒ ํ๋ฉด?
1๏ธโฃ build → Next.js ์ ํ๋ฆฌ์ผ์ด์ ๋น๋
2๏ธโฃ test → ๋น๋ ์๋ฃ ํ ํ ์คํธ ์คํ
3๏ธโฃ deploy → ํ ์คํธ ์๋ฃ ํ ๋ฐฐํฌ ์งํ
5๏ธโฃ ๋ฐฐํฌ ์๋ํ๋ฅผ ์ํ ์ถ๊ฐ ์ต์ ํ ์ ๋ต
๋ฐฐํฌ๋ฅผ ์์ ์ ์ผ๋ก ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ ์ค์ ์ ๊ณ ๋ คํ ์ ์์ด์.
โ ํ๊ฒฝ ๋ณ์ ์ค์
Next.js์์ .env ํ์ผ์ CI/CD์์ ์ฌ์ฉํ๋ ค๋ฉด GitHub Actions์ secrets ๊ธฐ๋ฅ์ ํ์ฉํด์ผ ํด์.
- name: Set Environment Variables
run: echo "NEXT_PUBLIC_API_KEY=${{ secrets.API_KEY }}" >> .env
โ Vercel์ ์ด์ฉํ ์๋ ๋ฐฐํฌ
Next.js๋ Vercel๊ณผ ๊ถํฉ์ด ์ข์์! Vercel์ ์ด์ฉํ๋ฉด ๋ฐฐํฌ๋ฅผ ์ฝ๊ฒ ์๋ํํ ์ ์์ด์.
Vercel CLI๋ฅผ ์ด์ฉํด์ ์๋์ฒ๋ผ ์ค์ ํ๋ฉด ์ฝ๋๊ฐ ํธ์๋ ๋๋ง๋ค ์๋์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅ!
- name: Deploy to Vercel
run: vercel --prod --token=${{ secrets.VERCEL_TOKEN }}
๐ฏ ๊ฒฐ๋ก : Next.js CI/CD ์๋ํ ๋ง์คํฐ!
โ๏ธ CI/CD ์ํฌํ๋ก์ฐ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์คํ ์์๋ฅผ ์ ์ดํ ์ ์์
โ๏ธ ํ ์คํธ & ๋ฐฐํฌ ์๋ํ๋ฅผ ํตํด ์์ ์ ์ธ ํ๋ก์ ํธ ์ด์ ๊ฐ๋ฅ
โ๏ธ Vercel๊ณผ ์ฐ๋ํ์ฌ ์์ฝ๊ฒ ๋ฐฐํฌํ ์ ์์
๐ก ์ด์ Next.js ํ๋ก์ ํธ์์๋ CI/CD๋ฅผ ๋ง์คํฐํ๊ณ ,
์๋์ผ๋ก ๋ฐฐํฌ๋๋ ๋ฉ์ง ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํด๋ณด์! ๐
๐ท ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท