# GitHub Actions CI/CD ๊ฐ์ด๋
## ํ์ต ๋ชฉํ
GitHub Actions๋ก ์๋ํ๋ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํฉ๋๋ค.
## 1. GitHub Actions๋?
GitHub์์ ์ ๊ณตํ๋ ์๋ํ CI/CD ํ๋ซํผ์
๋๋ค.
- ์ฝ๋ ํธ์ ์ ์๋ ๋น๋/ํ
์คํธ
- PR ์๋ ๊ฒ์ฆ
- ์๋ ๋ฐฐํฌ
- ๋ฌด๋ฃ ์ฌ์ฉ๋ ์ ๊ณต
## 2. Workflow ํ์ผ ์์น
ํ๋ก์ ํธ ๋ฃจํธ์ .github/workflows/ ๋๋ ํ ๋ฆฌ ์์ฑ
YAML ํ์ผ๋ก ์ํฌํ๋ก์ฐ ์ ์
์: .github/workflows/ci.yml
## 3. ๊ธฐ๋ณธ ๊ตฌ์กฐ
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
- run: npm install
- run: npm test
## 4. ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ
Push:
on:
push:
branches: [main, develop]
paths:
- "src/**"
Pull Request:
on:
pull_request:
branches: [main]
์ค์ผ์ค:
on:
schedule:
- cron: "0 9 * * 1-5"
์๋ ์คํ:
on: workflow_dispatch
## 5. ํ๊ฒฝ๋ณ์์ ์ํฌ๋ฆฟ
ํ๊ฒฝ๋ณ์:
env:
NODE_ENV: production
jobs:
build:
env:
DATABASE_URL: postgres://localhost/test
์ํฌ๋ฆฟ ์ฌ์ฉ:
steps:
- name: Deploy
env:
API_KEY: ${{ secrets.API_KEY }}
run: ./deploy.sh
## 6. ๋งคํธ๋ฆญ์ค ๋น๋
strategy:
matrix:
node: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
## 7. ์บ์ฑ
- name: Cache node modules
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles("**/package-lock.json") }}
restore-keys: |
${{ runner.os }}-node-
## 8. ์ํฐํฉํธ
์
๋ก๋:
- uses: actions/upload-artifact@v4
with:
name: build
path: dist/
๋ค์ด๋ก๋:
- uses: actions/download-artifact@v4
with:
name: build
## 9. ์กฐ๊ฑด๋ถ ์คํ
if: github.event_name == "push"
if: github.ref == "refs/heads/main"
if: contains(github.event.head_commit.message, "[skip ci]") == false
if: success()
if: failure()
if: always()
## 10. Docker ๋น๋ ๋ฐ ํธ์
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: user/app:latest
## 11. ๋ฐฐํฌ ์์
Vercel:
- uses: amondnet/vercel-action@v25
with:
vercel-token: ${{ secrets.VERCEL_TOKEN }}
vercel-org-id: ${{ secrets.ORG_ID }}
vercel-project-id: ${{ secrets.PROJECT_ID }}
vercel-args: "--prod"
SSH ๋ฐฐํฌ:
- name: Deploy via SSH
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/app
git pull
npm install
pm2 restart all
## 12. ์ฌ์ฌ์ฉ ๊ฐ๋ฅ ์ํฌํ๋ก์ฐ
.github/workflows/reusable.yml:
on:
workflow_call:
inputs:
environment:
required: true
type: string
ํธ์ถ:
jobs:
deploy:
uses: ./.github/workflows/reusable.yml
with:
environment: production
## ์ถ์ฒ ํ์ต ์์
1. ๊ธฐ๋ณธ ์ํฌํ๋ก์ฐ ์์ฑ
2. ํธ๋ฆฌ๊ฑฐ์ ์กฐ๊ฑด ์ดํด
3. ์บ์ฑ์ผ๋ก ์๋ ๊ฐ์
4. ๋ฐฐํฌ ์๋ํ
5. ์ฌ์ฌ์ฉ ์ํฌํ๋ก์ฐ