Frontend ๐Ÿ“š/React

[React] TMDB API๋ฅผ ํ™œ์šฉํ•œ ๋„ทํ”Œ๋ฆญ์Šค ํด๋ก  ์ฝ”๋”ฉ - 8. GitHub Actions๋ฅผ ์ด์šฉํ•œ React ์•ฑ CI/CD ๋ฐฐํฌ ์ž๋™ํ™”

leejaejae 2024. 12. 10. 14:31

GitHub Actions๋ฅผ ์ด์šฉํ•œ React ์•ฑ CI/CD ๋ฐฐํฌ ์ž๋™ํ™”

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” GitHub Actions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ์•ฑ์„ GitHub Pages์— ์ž๋™ ๋ฐฐํฌํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. GitHub Actions๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋กœ, ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React ์•ฑ์„ GitHub Pages์— ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ, ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•  ํ•„์š” ์—†์ด, main ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋˜๊ณ  ๋ฐฐํฌ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ ์„ค์ •

GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ๋Š” .github/workflows ํด๋” ๋‚ด์— YAML ํŒŒ์ผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” Deploy React App to GitHub Pages๋ผ๋Š” ์ด๋ฆ„์˜ ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

name: Deploy React App to GitHub Pages

on:
  push:
    branches:
      - main  # main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค ๋ฐฐํฌ ์‹คํ–‰

jobs:
  deploy:
    runs-on: ubuntu-latest  # ์‹คํ–‰ ํ™˜๊ฒฝ, ์ตœ์‹  ์šฐ๋ถ„ํˆฌ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰

    steps:
      # 1. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ฒดํฌ์•„์›ƒ
      - name: Checkout repository
        uses: actions/checkout@v2

      # 2. Node.js ์„ค์ •
      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: "14"

      # 3. ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ์„ค์น˜
      - name: Install dependencies
        run: npm install

      # 4. ์•ฑ ๋นŒ๋“œ
      - name: Build the app
        run: npm run build

      # 5. Git ์„ค์ • (์ด๋ฉ”์ผ๊ณผ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์„ค์ •)
      - name: Set Git user
        run: |
          git config --global user.email "leesengjie@naver.com"
          git config --global user.name "SeungjaeLee00"
          git config --global url."https://${GH_TOKEN}@github.com/".insteadOf "https://github.com/"

      # 6. GitHub Pages์— ๋ฐฐํฌ
      - name: Deploy to GitHub Pages
        run: |
          git remote set-url origin https://$GH_TOKEN@github.com/SeungjaeLee00/Netflix_cloneCoding.git
          npm run deploy
        env:
          GH_TOKEN: ${{ secrets.GH_TOKEN }}

2. ๊ฐ ๋‹จ๊ณ„ ์„ค๋ช…

name:

  • ์›Œํฌํ”Œ๋กœ์šฐ ์ด๋ฆ„: GitHub Pages์— React ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

on:

  • ํ‘ธ์‹œ ์ด๋ฒคํŠธ: main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค ์ด ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

jobs:

  • deploy: ๋ฐฐํฌ ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” Job์ž…๋‹ˆ๋‹ค.

steps:

  • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ฒดํฌ์•„์›ƒ: GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฒดํฌ์•„์›ƒํ•˜์—ฌ, ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
- name: Checkout repository
  uses: actions/checkout@v2

 

  • Node.js ์„ค์ •: ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Node.js ๋ฒ„์ „์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 14 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
- name: Set up Node.js
  uses: actions/setup-node@v2
  with:
    node-version: "14"
  • ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ ์„ค์น˜: npm install์„ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ๋“ค์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
- name: Install dependencies
  run: npm install
  • ์•ฑ ๋นŒ๋“œ: npm run build ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ, ๋ฐฐํฌ์šฉ์œผ๋กœ ์ตœ์ ํ™”๋œ React ์•ฑ์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
- name: Build the app
  run: npm run build
  • Git ์„ค์ •: ๋ฐฐํฌ ์‹œ ์‚ฌ์šฉํ•  Git ์ด๋ฉ”์ผ๊ณผ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, GH_TOKEN์„ ์‚ฌ์šฉํ•˜์—ฌ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
- name: Set Git user
  run: |
  git config --global user.email "leesengjie@naver.com"
  git config --global user.name "SeungjaeLee00"
  git config --global url."https://${GH_TOKEN}@github.com/".insteadOf "https://github.com/"
  • GitHub Pages์— ๋ฐฐํฌ: npm run deploy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ, GitHub Pages์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ GH_TOKEN์€ GitHub์˜ Personal Access Token(PAT)์œผ๋กœ ์„ค์ •๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ด ํ† ํฐ์€ GitHub์˜ Secrets์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- name: Deploy to GitHub Pages
  run: |
    git remote set-url origin https://$GH_TOKEN@github.com/SeungjaeLee00/Netflix_cloneCoding.git
    npm run deploy
  env:
    GH_TOKEN: ${{ secrets.GH_TOKEN }}

3. GitHub Secrets ์„ค์ •

  • GitHub Token: GH_TOKEN์€ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๊ฐ€์ง„ Personal Access Token์ž…๋‹ˆ๋‹ค. ์ด ํ† ํฐ์„ GitHub์˜ Secrets์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ Settings > Secrets์—์„œ ์ƒˆ๋กœ์šด secret์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • Secret Name: GH_TOKEN
    • Secret Value: GitHub์—์„œ ์ƒ์„ฑํ•œ Personal Access Token

4. npm run deploy ๋ช…๋ น์–ด ์„ค์ •

๋ฐฐํฌ๋ฅผ ์œ„ํ•ด npm run deploy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. package.json ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

"scripts": {
  "deploy": "gh-pages -d build"
}
  • gh-pages ํŒจํ‚ค์ง€๋Š” React ์•ฑ์„ GitHub Pages์— ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด, npm install --save gh-pages ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5. ๋ฐฐํฌ ์ž๋™ํ™”

์ด์ œ main ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ๊ฐ€ ํ‘ธ์‹œ๋  ๋•Œ๋งˆ๋‹ค GitHub Actions๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋นŒ๋“œ๋œ React ์•ฑ์„ GitHub Pages์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ๋งค๋ฒˆ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•  ํ•„์š” ์—†์ด ์ž๋™์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.


๐Ÿš€ ๊ฒฐ๊ณผ 

๋„ทํ”Œ๋ฆญ์Šค ํด๋ก  ์›น์‚ฌ์ดํŠธ ์ฃผ์†Œ: https://seungjaelee00.github.io/Netflix_cloneCoding/


๐Ÿ’ก ์ •๋ฆฌ

GitHub Actions๋ฅผ ์ด์šฉํ•œ CI/CD ์„ค์ •์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ๋ฐฐํฌ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ˆ˜๋ฅผ ์ค„์ด๊ณ , ๋”์šฑ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” GitHub Pages์— React ์•ฑ์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ–ˆ์œผ๋ฉฐ, ์ด ์„ค์ •์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ฐฐํฌ ์ž‘์—…์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.