๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ ๋ฐ๋ธŒ์˜ต์Šค: DevOps

Github Actions, AWS CodeDeploy๋ฅผ ํ™œ์šฉํ•œ CI/CD - Node.js(1)

by ๐Ÿค ์ค€์ฝฉ์ด 2023. 1. 1.

๐Ÿค” CI/CD๋ž€?

 

โญ๏ธ CI

CI๋Š” Continuous Integration์˜ ์•ฝ์ž๋กœ ์ง€์†์ ์ธ ํ†ตํ•ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๊ณผ์ •์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, CI๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค Build, Test๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์ž๋™์œผ๋กœ ์ด๋Ÿฌํ•œ ๊ณผ์ •๋“ค์„ ์ง„ํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

 

โญ๏ธ CD

CD๋Š” Continuous Delivery ๋˜๋Š” Continuous Deployment์˜ ์•ฝ์ž๋กœ ์ง€์†์ ์ธ ์ œ๊ณต์ง€์†์ ์ธ ๋ฐฐํฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

CI ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด Build, Test ๊ณผ์ •์„ ๋ชจ๋‘ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐํฌ ๋‹จ๊ณ„ ์ „์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๊ฒ€์ฆ์ด ๋˜๋ฉด, ๊ฒ€์ฆ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์œผ๋กœ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•ด์ค๋‹ˆ๋‹ค.

 

 

๐Ÿš€ Github ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋กํ•˜๊ธฐ

 

CI ๊ณผ์ •์€ Github Actions๋ฅผ ํ™œ์šฉํ•ด ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

.env ํŒŒ์ผ์€ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ํ‚ค ๊ฐ’๋“ค์„ ๊นƒํ—ˆ๋ธŒ์— ๋“ฑ๋กํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

 

Repository์˜ Settings > Security > Secrets > Actions ๋กœ ์ด๋™ํ•ด์ค๋‹ˆ๋‹ค.

 

 

New Repository secret ์„ ํด๋ฆญํ•ด์ค๋‹ˆ๋‹ค.

 

 

.env ํŒŒ์ผ์˜ ํ‚ค ๊ฐ’๋“ค์„ ์œ„์™€ ๊ฐ™์ด ๋ชจ๋‘ ๋“ฑ๋กํ•ด์ค๋‹ˆ๋‹ค.

 

 

 

๐Ÿš€ Github Actions workflow ์ƒ์„ฑ

 

ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— .github/workflows/deploy.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ deploy.yml

# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: deploy

on:
  push:
    branches: [develop]
  pull_request:
    branches: [develop]

jobs:
  build:
    runs-on: ubuntu-18.04

    strategy:
      matrix:
        node-version: [16.15.1]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

    steps:
      - name: Checkout source code.
        uses: actions/checkout@v2

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}

      - name: Check Npm -v
        run: npm -v

      - name: create env file
        working-directory: ./
        run: |
          pwd
          touch .env
          echo PORT=${{ secrets.PORT }} >> .env
          echo MONGODB_URI=${{ secrets.MONGODB_URI }} >> .env
          echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env
          echo JWT_ALGO=${{ secrets.JWT_ALGO }} >> .env
          cat .env

      - name: build server files
        working-directory: ./
        run: |
          yarn
          yarn run build
on:
  push:
    branches: [develop]
  pull_request:
    branches: [develop]

develop ๋ธŒ๋žœ์น˜์— Pushํ•˜๊ฑฐ๋‚˜ Pull Requestํ–ˆ์„ ๋•Œ Workflow๋ฅผ Triger(์‹คํ–‰)ํ•ฉ๋‹ˆ๋‹ค.

 

jobs:
  build:
    runs-on: ubuntu-18.04

    strategy:
      matrix:
        node-version: [16.15.1]
        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/

runs-on ์—๋Š” ์‚ฌ์šฉํ•  ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

node-version ์—๋Š” ์‚ฌ์šฉํ•  node์˜ ๋ฒ„์ „์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

 

steps:
      - name: Checkout source code.
        uses: actions/checkout@v2

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node-version }}

      - name: Check Npm -v
        run: npm -v

      - name: create env file
        working-directory: ./
        run: |
          pwd
          touch .env
          echo PORT=${{ secrets.PORT }} >> .env
          echo MONGODB_URI=${{ secrets.MONGODB_URI }} >> .env
          echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env
          echo JWT_ALGO=${{ secrets.JWT_ALGO }} >> .env
          cat .env

      - name: build server files
        working-directory: ./
        run: |
          yarn
          yarn run build

Checkout source code. step์€ Github์˜ repository์— ์˜ฌ๋ ค๋‘” ์ฝ”๋“œ๋ฅผ CI ์„œ๋ฒ„๋กœ ๋‚ด๋ ค๋ฐ›์€ ํ›„์— ํŠน์ • ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

Use Node.js ${{ matrix.node-version }} step์€ ๋ช…์‹œํ•œ Node๋ฅผ ๋ฒ„์ „์— ๋งž๊ฒŒ ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

create env file step์€ Github์— ๋“ฑ๋กํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋“ค๋กœ .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

build server files step์—์„œ๋Š” yarn ๋ช…๋ น์–ด๋กœ ํ•„์š”ํ•œ dependency๋“ค์„ ์„ค์น˜ํ•œ ํ›„์— ๋นŒ๋“œ๋ฅผ ํ•ด์ฃผ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

 

 

๐Ÿš€ Github Actions ํ™•์ธ

 

deploy.yml ํŒŒ์ผ์„ Repository์— ๋“ฑ๋กํ•œ ์ดํ›„ develop ๋ธŒ๋žœ์น˜์— Push, Pull Requestํ•˜๋ฉด ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

 

๊นƒํ—ˆ๋ธŒ Repository์˜ Actions์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด CI๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Workflow๋ฅผ ํด๋ฆญํ•ด๋ณด๋ฉด deploy.yml ํŒŒ์ผ์— ๋“ฑ๋กํ•œ step๋ณ„๋กœ ์‹คํ–‰๋œ ๊ฒฐ๊ณผ์™€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” AWS CodeDeploy๋ฅผ ํ™œ์šฉํ•œ CD ๊ณผ์ •์„ ์ง‘์ค‘์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.