[React] React ํ™˜๊ฒฝ๋ณ€์ˆ˜, ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ์‹œ์— ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ? (Docker, github action ์‚ฌ์šฉ ์‹œ)

React ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋ก

๊ธฐ์กด ๊ฐœ๋ฐœ ์‹œ

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ React๋ฅผ ํ”„๋ก ํŠธ๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ์ฝ”๋“œ ์‚ฌ์•„์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

  1. ์ตœ์ƒ์œ„ ํด๋”์— .env ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

  2. .env ํŒŒ์ผ์— REACT_APP์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.

    REACT_APP_ADMIN_KEY=hi
  3. ์ฝ”๋“œ ์ƒ์—์„œ process.env.REACT_APP_ADMIN_KEY์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!


๋ฐฐํฌ ์‹œ

ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ build ํ›„์—๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— build์™€ ๋™์‹œ์— build์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜(argument)๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ธํŒ…ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

NERA๋Š” github action์—์„œ docker/build-push-action@v1.1.0 ์ด๋ผ๋Š” action์„ ์ด์šฉํ•ด _Docker file_์„ ํ†ตํ•ด์„œ build๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค!

  1. REACT ๊ด€๋ จ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ git repository์˜ secret์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.

    Settings -> Secrets ์—์„œ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. github action์—์„œ build_args๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. (docker/build-push-action ๋ฒ„์ „์— ๋”ฐ๋ผ ๊ธฐ์žฌ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ฃผ์˜!)

        steps:
        - uses: actions/checkout@v2
        - name: Build and push Docker images
          uses: docker/build-push-action@v1.1.0
          with:
            username: ${{ secrets.DOCKER_ID }} 
            password: ${{ secrets.DOCKER_PW }}
            repository: csuos/nera
            build_args: REACT_APP_ADMIN_KEY=${{ secrets.REACT_APP_ADMIN_KEY }}
            tag_with_ref: true # optional
            tag_with_sha: true 
            tags: latest
            cache_froms: csuos/nera:latest # optional
            push: ${{ startsWith(secrets.DOCKER_ID, 'csuos') }}

    ์œ„์˜ build_args์— ์žˆ๋Š” REAACT_APP_ADMIN_KEY์ฒ˜๋Ÿผ ์„ธํŒ…ํ•ด์ค€๋‹ค.

    ์—ฌ๊ธฐ์„œ ๊ทธ๋ƒฅ github action์„ ๋Œ๋ฆฌ๊ฒŒ ๋˜๋ฉด [Warning] One or more build-args [ํ™˜๊ฒฝ๋ณ€์ˆ˜] were not consumed ์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค. ์ด๋Š” build๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Docker file์— ARG(๋งค๊ฐœ๋ณ€์ˆ˜)๋ฅผ ์ •์˜ํ•ด์ฃผ์ง€ ์•Š์•„์„œ์ด๋‹ค. ๊ธฐ์กด์— Docker์—์„œ ์ œ๊ณตํ•˜๋Š” ARG๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘์–ด์•ผํ•œ๋‹ค.

  3. Docker file ์ˆ˜์ •

    FROM node:12 as builder
    ARG REACT_APP_ADMIN_KEY
    ENV REACT_APP_ADMIN_KEY=$REACT_APP_ADMIN_KEY
    WORKDIR /usr/src/app
    COPY ./page/package.json ./
    RUN yarn
    COPY ./page/. .
    RUN yarn build
    
    FROM node:12
    WORKDIR /usr/src/app
    COPY ./server/package.json ./
    RUN yarn
    COPY --from=builder /usr/src/app/build /usr/src/app/build
    COPY ./server/. .
    
    EXPOSE 3000
    CMD [ "yarn", "start" ]

    ๊ธฐ์กด์˜ Docker file์—์„œ ARG์™€ ENV ๋ผ์ธ๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. ARG๋กœ REACT_APP_ADMIN_KEY๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ณ  ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•  ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ ๋กœ ์„œ๋ฒ„๋Š” ๊ณ„์† node๋ฅผ ์ด์šฉํ•ด์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์šฐ๋“œ ์ƒ์—์„œ OS ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ธํŒ…ํ•ด์ฃผ๋ฉด ์ฝ”๋“œ์ƒ์—์„œ process.env๋กœ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ž์„ธํ•œ ์ฝ”๋“œ๋Š” https://github.com/CSUOS/nera๋ฅผ ์ฐธ๊ณ ํ•˜์ž :)

๋ฐ˜์‘ํ˜•