Github Acitons CI ์„ธํŒ…ํ•˜๊ธฐ

2026. 1. 22. 14:37ใ†Projects/WooniePangee

๋ฐ˜์‘ํ˜•

 

์š”์•ฝ
yml ๋ฌธ์„œ ์ž‘์„ฑํ•ด์„œ github actions๋กœ prettier, lint, tsc ์ฒดํฌํ•˜๊ณ  vercel ๋ฐฐํฌํ•˜๊ธฐ
์ฝ”๋“œ๋ž˜๋น— ์›นํŽ˜์ด์ง€์—์„œ ๋ฆฌ๋ทฐ ์„ธํŒ…ํ•˜๊ธฐ

๋ชฉ์ฐจ

1. github_actions๋กœ CI ๋Œ๋ฆฌ๊ธฐ

2. ci.yml - lint/tsc ์ฒดํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ์—…๋ฐ์ดํŠธ

3. deploy.yml - main vercel ๋ฐฐํฌ

4. pr-title-check.yml - pr title ๊ฒ€์‚ฌ

5. ์ฝ”๋“œ๋ž˜๋น— ๋ฆฌ๋ทฐ

 


1. github actions๋กœ CI ๋Œ๋ฆฌ๊ธฐ

ci ์„ธํŒ…์„ github actions๋กœ ํ•  ๊ฑฐ์—ฌ์„œ ์ด์Šˆ ์ƒ์„ฑํ•˜๊ณ  .github/workflows์— yml ํŒŒ์ผ๋“ค์„ ์ž‘์„ฑํ•ด๋ดค๋‹ค.

ํ•  ์ผ๋“ค์€ ์•„๋ž˜์˜ ๋‚ด์šฉ๋“ค์ด๋‹ค.

  • lint/tsc ์ฒดํฌ
  • main vercel ๋ฐฐํฌ
  • CodeRabbit ๋ฆฌ๋ทฐ
  • pr title ๊ฒ€์‚ฌ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ์—…๋ฐ์ดํŠธ

2. ci.yml - lint/tsc ์ฒดํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ์—…๋ฐ์ดํŠธ

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  lint-and-typecheck:
    name: Lint & Type Check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code #1. ์ €์žฅ์†Œ ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ
        uses: actions/checkout@v4

      - name: Setup Node.js #2. Node.js ํ™˜๊ฒฝ ์„ค์ •
        uses: actions/setup-node@v4
        with:
          node-version: '22.x'
          cache: 'pnpm' # pnpm ์บ์‹œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์„ค์น˜ ์†๋„ ํ–ฅ์ƒ

      - name: Install pnpm  #3. pnpm ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์„ค์น˜
        uses: pnpm/action-setup@v4
        with:
          version: 10.19.0

      - name: Install dependencies  #4. ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ์„ค์น˜
        run: pnpm install --frozen-lockfile --prefer-offline
        # --frozen-lockfile: lock ํŒŒ์ผ๊ณผ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ๋ฒ„์ „ ์„ค์น˜
        # --prefer-offline: ๊ฐ€๋Šฅํ•œ ์บ์‹œ๋ฅผ ์‚ฌ์šฉ

      - name: Run Prettier  #5. Prettier๋กœ ํฌ๋งทํŒ… ๊ฒ€์‚ฌ
        run: pnpm exec prettier --check "src/**/*.{js,jsx,ts,tsx,json,css,md}"

      - name: Run ESLint  #6. ESLint๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ (๊ฒฝ๊ณ ๋„ ํ—ˆ์šฉx)
        run: pnpm exec eslint "src/**/*.{js,jsx,ts,tsx}" --max-warnings=0

      - name: Run TypeScript Check  #7. TS ํƒ€์ž… ๊ฒ€์‚ฌ
        run: pnpm exec tsc --noEmit

 

CI๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ๋นจ๋ฆฌ ๋ฉˆ์ถฐ์„œ ๋น„์šฉ์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค. 

๋ณด๋ฉด ๋ฒ„์ „์ด ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋Š”๋ฐ latest๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ ์ง์ ‘ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์€ ์•„๋ž˜ ์ œ๋ชฉ์— ๊ฑธ์–ด๋‘” ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. Checkout code

  • ์ €์žฅ์†Œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด ๋ฐ›๋Š”๋‹ค. ์ดํ›„ ๋ชจ๋“  ๋‹จ๊ณ„๋Š” ์ €์žฅ์†Œ ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์•ผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2. Install pnpm

  • ํ”„๋กœ์ ํŠธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ pnpm์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค. ๋’ค์— ์ด์–ด์งˆ ์˜์กด์„ฑ ์„ค์น˜ ์ „์— ํ•„์š”ํ•˜๋‹ค.
  • Node.js๋ณด๋‹ค ๋จผ์ € ์„ค์น˜ํ•˜๋Š” ์ด์œ ๋Š” node.js์—์„œ pnpm ์บ์‹œ๋ฅด ์‚ฌ์šฉํ•˜๋ ค๋ฉด pnpm ์„ค์น˜๊ฐ€ ๋จผ์ € ์ด๋ฃจ์–ด์ ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

3. Setup Node.js

  • pnpm์€ ๋‚ด๋ถ€์ ์œผ๋กœ Node.js๋กœ ์ž‘์„ฑ๋œ CLI ๋„๊ตฌ์ด๋ฏ€๋กœ, Node ํ™˜๊ฒฝ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ธํŒ…์ด ํ•„์š”ํ•˜๋‹ค.
  • cache: pnpm์„ ์„ค์ •ํ•˜๋ฉด pnpm ์บ์‹œ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์„œ ์„ค์น˜ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    pnpm์€ ๋งค๋ฒˆ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ์ธํ„ฐ๋„ท์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ node_modules ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    ์—ฌ๊ธฐ์„œ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ ๋ฐ›์€ ํŒจํ‚ค์ง€๋Š” Github ์„œ๋ฒ„์— ์ €์žฅํ•˜์—ฌ ๋‹ค์Œ CI์—์„œ ์žฌ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    ์†๋„ ๊ฐœ์„  ๋ฐ ๋„คํŠธ์›Œํฌ ์ด์Šˆ ๊ฐ์†Œ์— ํ•„์š”ํ•˜๋‹ค.

 

4. Install dependencies (pnpm install --frozen-lockfile --prefer-offline)

  • ๊ฒ€์‚ฌํ•  prettier, eslint, tsc๋Š” ๋ชจ๋‘ node_modules์— ์˜์กดํ•˜์—ฌ, ์˜์กด์„ฑ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • --frozen-lockfile๋กœ ํ•ญ์ƒ ๊ฐ™์€ ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋ฉด ํ™˜๊ฒฝ ๋ถˆ์ผ์น˜๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • --prefer-offline์œผ๋กœ ์—ญ์‹œ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์—ฌ ๋น„์šฉ์„ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค.

5. Run Pretteir, Run ESLint, Run TypeScript Check

  • pnpm์œผ๋กœ prettier, eslint, type check๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • prettier ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๋ฉฐ, ์ฝ”๋“œ ์Šคํƒ€์ผ ๋ฌธ์ œ๋ฅผ ์ดˆ๊ธฐ์— ์ฆ‰์‹œ ์ฐจ๋‹จํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋น ๋ฅธ ์ˆœ์„œ๋กœ ์žˆ๋‹ค.
  • ESLint๋Š” --max-warnings=0์œผ๋กœ ๊ฒฝ๊ณ ๋„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ’ˆ์งˆ ๊ธฐ์ค€์„ ๊ฐ•์ œํ•˜๋„๋ก ํ–ˆ๋‹ค.
  • tsc ์ฒดํฌ๋Š” ๊ฐ€์žฅ ๋А๋ฆฌ๊ณ  ๋ฌด๊ฑฐ์šด ๋™์ž‘์ด๋‹ค. ์–ด์ฐจํ”ผ pretteir, eslint๊ฐ€ ํ•„์ˆ˜๋กœ ์ง€์ผœ์ ธ์•ผํ•  ๋™์ž‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰์— ์žˆ๋‹ค.

 


3. deploy.yml - main vercel ๋ฐฐํฌ

name: Deploy

on:
  push:
    branches: [main]

  # CI ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰
  workflow_run:
    workflows: ["CI"]
    types: [completed]
    branches: [main]

jobs:
  deploy:
    name: Deploy to Vercel
    # CI ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰
    if: |
      github.event_name == 'push' || 
      (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v41.1.4
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'
          github-token: ${{ secrets.GITHUB_TOKEN }}

 

1. on ์„ค์ •

  • push ํ‚ค์›Œ๋“œ๋กœ main ๋ธŒ๋žœ์น˜์— pushํ•  ๋•Œ ์ฆ‰์‹œ ๋ฐฐํฌํ•˜๋„๋ก ํ–ˆ๋‹ค. 1์ธ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๊ฒฐํ•˜๋‹ค.
  • workflow_run์œผ๋กœ CI ์›Œํฌ ํ”Œ๋กœ์šฐ๊ฐ€ ๋๋‚œ ํ›„์— ๋™์ž‘ํ•˜๋„๋ก ํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ ์ฝ”๋“œ๋งŒ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

2. jobs ์„ค์ •

  • if ์กฐ๊ฑด๋ฌธ์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค. 'push'๋กœ ์ง์ ‘ ํŠธ๋ฆฌ๊ฑฐ ๋˜์—ˆ๊ฑฐ๋‚˜', 'ci๊ฐ€ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ๋งŒ' ์•„๋ž˜ ๋‚ด์šฉ์„ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.
  • ์ด ์กฐ๊ฑด์ด ์—†์œผ๋ฉด ๋ญ”๊ฐ€ ๊ผฌ์—ฌ์„œ CI๊ฐ€ ์‹คํŒจํ•ด๋„ Deploy๊ฐ€ ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  • vercel์ด ๋ฐฐํฌํ•  ์†Œ์Šค์ฝ”๋“œ๋ฅผ checkout์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ๋ฒ„์…€๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
    amondnet/vercel-action์„ ์‚ฌ์šฉํ•œ๋‹ค.
    → vercel cli๋ฅผ ๋Œ€์‹  ์‹คํ–‰ํ•ด์ฃผ๋Š” Action์œผ๋กœ, ๋‚ด๋ถ€์—์„œ ํ”„๋กœ์ ํŠธ ์‹๋ณ„, ๋นŒ๋“œ, ๋ฐฐํฌ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•œ๋‹ค.

3. vercel ๊ด€๋ จ ์„ค์ •๊ฐ’

  • vercel-token : github๊ฐ€ vercel ๊ณ„์ •์œผ๋กœ ๋ฐฐํฌํ•  ๊ถŒํ•œ (ํ•„์ˆ˜)
  • vercel-org-id, vercel-project-id : ์–ด๋–ค ์กฐ์ง/ํ”„๋กœ์ ํŠธ์— ๋ฐฐํฌํ•  ์ง€ ๋ช…์‹œ
  • vercel-args: '--prod' : preview๊ฐ€ ์•„๋‹Œ production์œผ๋กœ ๋ฐฐํฌ
  • github-token : ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฅผ github pr/commit์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐฐํฌ ์ƒํƒœ ํ‘œ์‹œ

์—ฌ๊ธฐ์„œ github-token์€ ๋‚ด๊ฐ€ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ ๋ฒ„์…€ ํ† ํฐ๋“ค์€ ๋‚ด๊ฐ€ ๋ฐ›์•„์„œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

vercel-token ๋ฐ›๊ธฐ

vercel์˜ ํ”„๋กœํ•„์„ ๋ˆ„๋ฅด๋ฉด ๋‚˜์˜ค๋Š” ํŒ์—…์—์„œ Settings - Tokens - Create๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

ํ† ํฐ๊ฐ’์€ ๋ชจ๋‹ฌ๋กœ ํ•œ ๋ฒˆ ๋ณด์—ฌ์ฃผ๊ณ  ๋‹ค์‹œ๋Š” ์•ˆ๋ณด์—ฌ์ฃผ๋‹ˆ๊นŒ ํ•„์š”ํ•˜๋ฉด ์ž˜ ๊ฐ„์งํ•ด์•ผํ•œ๋‹ค.

 

organization id, project id๋Š” ์กฐ์ง, ํ”„๋กœ์ ํŠธ์˜ ๊ฐ Settings/General/ ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์…€ ์ดˆ๊ธฐ ํ™”๋ฉด์—์„œ ํŒ€ ์„ค์ •, ํ”„๋กœ์ ํŠธ ์„ค์ • ๋‹ค ๋ณด์ธ๋‹ค.
organization = team

 

 


4. pr-title-check.yml - pr title ๊ฒ€์‚ฌ

name: PR Title Check

on:
  pull_request:
    types: [opened, edited, synchronize]

jobs:
  validate-title:
    name: Validate PR Title
    runs-on: ubuntu-latest
    steps:
      - uses: amannn/action-semantic-pull-request@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          types: |
            feat
            fix
            docs
            style
            refactor
            test
            chore
          requireScope: false
          subjectPattern: ^#\\d+-.+
          subjectPatternError: |
            PR ์ œ๋ชฉ ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
            ์˜ˆ์‹œ: feat/#13-์ด๋ฏธ์ง€-์—…๋กœ๋“œ-์ถ”๊ฐ€

pr ํ’ˆ์งˆ ์œ ์ง€๋ฅผ ์œ„ํ•ด์„œ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์€๊ทผ pr ์ œ๋ชฉ์—์„œ ์‹ค์ˆ˜๋ฅผ ๋งŽ์ดํ•ด์„œ ๋„ฃ์—ˆ๋‹ค.

 

1. on ์„ค์ •

  • pr ์ƒ์„ฑ, ์ œ๋ชฉ ์ˆ˜์ •, ์ปค๋ฐ‹ ์ถ”๊ฐ€๋งˆ๋‹ค ๊ฒ€์‚ฌ ํ•œ๋‹ค.

2. amannn/action-semantic-pull-request

  • PR ์ œ๋ชฉ์„ ๋ถ„์„ํ•ด์„œ type์— ํ•ด๋‹นํ•˜๋Š” ํ˜•์‹์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
    ํ—ˆ์šฉํ•˜๋Š” ํƒ€์ž…์€ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ๋‘์—ˆ๋‹ค.

3. GITHUB_TOKEN

  • gihub token์„ ์ฃผ์–ด์„œ PR ์ •๋ณด ์กฐํšŒ ๊ถŒํ•œ์„ ์ค€๋‹ค.

4. subjectPattern

  • feat/#13-description๊ณผ ๊ฐ™์ด /#num์„ ๋ถ™์ด๋„๋ก ๊ฐ•์ œํ–ˆ๋‹ค. 

 


5. ์ฝ”๋“œ๋ž˜๋น— ๋ฆฌ๋ทฐ

์ฝ”๋“œ๋ž˜๋น—๋„ yml๋กœ ์ž‘์„ฑํ• ๊นŒ ํ•˜๋‹ค๊ฐ€ ๊ทธ๋ƒฅ ์›น์—์„œ ์„ธํŒ…ํ–ˆ๋‹ค.

https://www.coderabbit.ai/

 

CodeRabbit: AI Code Reviews

CodeRabbit: AI Code Reviews

www.coderabbit.ai

๋กœ๊ทธ์ธํ•˜๊ณ  organization ์ƒ์„ฑํ•ด์„œ github repo๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์„ธํŒ…ํ•˜๋ฉด ๋œ๋‹ค.

๊ธฐ๋ณธ ์„ธํŒ…์œผ๋กœ ๋‘๋ฉด ๋‹ค์ด์–ด๊ทธ๋žจ๋„ ๊ทธ๋ฆฌ๊ณ  ์‹œ๋„ ์“ฐ๊ณ  ์ด๊ฒƒ์ €๊ฒƒ ํ•˜๋Š”๊ฒŒ ๋งŽ์•„์„œ ๊บผ์•ผํ•˜๋Š” ๊ฒŒ ์ข€ ๋งŽ๋‹ค.

์ด๊ฑด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ง€๋Š” ์•Š๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ์„ธํŒ…ํ•œ ๊ฑฐ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์ผ๋‹ค.

์„ธํŒ…๋งˆ๋‹ค ํƒ€์ดํ‹€ ์˜†์— ๋ถ™์€ info ๋ฒ„ํŠผ์œผ๋กœ ํˆดํŒ์„ ๋„์›Œ์ค˜์„œ ๋ฐ”๋กœ ๋ฌด์Šจ ์„ธํŒ…์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


6. ์„ธํŒ… ์™„๋ฃŒ

 

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•