Server๐Ÿงค/Node.JS

[Node.js] CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ - Github Actions, AWS Codedeploy (Prisma, yarn run build keeps running)

yujindonut 2023. 1. 9. 17:05
728x90

๐Ÿ‘จ‍๐Ÿฆฒ๊ธฐ์กด ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

Node.js, EC2, github์„ ํ†ตํ•ด ์„œ๋ฒ„ ๋ฐฐํฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ • 

local ๊ฐœ๋ฐœ -> github push -> ec2์—์„œ pull -> build or run -> ๋ฐฐํฌ ์™„๋ฃŒ

 

๋งค๋ฒˆ ๊ฐœ๋ฐœ ํ›„ ์ง์ ‘ EC2 ์ ‘์†ํ•ด์„œ pull ๋ฐ›๊ณ  build, run ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธด๋‹ค.!.!.!

๊ทธ๋ž˜์„œ ๋ฐฐํฌ ์ž๋™ํ™” ๊ณผ์ •์„ ํ†ตํ•ด ์ด ๊ณผ์ •์„ ์‰ฝ๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

Git์˜ GithubActions์™€ AWS์—์„œ ์ œ๊ณตํ•˜๋Š” CodeDeploy๋ฅผ ํ†ตํ•ด Github repository์—์„œ ์ž‘์—…ํ•œ code๊ฐ€ ๋ฐ”๋กœ ec์—์„œ deploy ๋˜๋„๋ก ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ๋‹ค.


CI/CD ?

 

CI

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

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

CD

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

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


Github Actions์„ ์ด์šฉํ•œ CI ๊ณผ์ • ์ง„ํ–‰ 

1. Github ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ๋ก

.env ํŒŒ์ผ์€ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ฆฌ๋ฉด ํฐ์ผ๋‚œ๋‹ค ใ„ท -ใ„ท 

์‚ฌ์šฉํ•  ํ‚ค ๊ฐ’๋“ค์€ ๊นƒํ—ˆ๋ธŒ์— ์šฐ๋ฆฌ๋งŒ ์•Œ๊ฒŒ๋” ๋“ฑ๋กํ•ด์ค€๋‹ค.

 

๊นƒํ—™์˜ ๋ ˆํฌ > Settings > Security > Secrets > Actions

 

ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๋‚ด์˜ .env ํŒŒ์ผ์— ์žˆ๋Š” ๊ฒƒ๋“ค์„ ๋‹ค ์˜ฎ๊ฒจ์คŒ

 

2. Github Actions workflow ์ƒ์„ฑ

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

 

deploy.yml

 



name: deploy

on:
  push:
    branches: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-20.04

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

    steps:
      - name: โœ… ์ฒดํฌ์•„์›ƒ source code.
        uses: actions/checkout@v3

      - name: โš™๏ธ ${{ matrix.node-version }} ๋ฒ„์ „์˜ ๋…ธ๋“œ๋กœ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

      - name: โš™๏ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
        working-directory: ./
        run: |
          pwd
          touch .env
          echo DATABASE_URL=${{ secrets.DATABASE_URL }} >> .env
          cat .env

      - name: โœจ ํŒจํ‚ค์ง€ ์„ค์น˜
        working-directory: ./
        run: yarn
        
      - name: โœจ ๋นŒ๋“œ ๊ณผ์ •์„ ์‹œ์ž‘
        working-directory: ./
        run: yarn run build

 

branches : ์–ด๋–ค ๋ธŒ๋žœ์น˜์— Push, Pull Requestํ–ˆ์„๋•Œ Workflow๋ฅผ Triger(์‹คํ–‰)

runs-on : ์‚ฌ์šฉํ•  ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •

node-version : ์‚ฌ์šฉํ•  node์˜ ๋ฒ„์ „

 

์•„๋ž˜์˜ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ ubuntu - ๋ฒ„์ „์„ 20์œผ๋กœ ์„ค์ •ํ•จ

 

node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node) ์—๋Ÿฌ ํ•ด๊ฒฐ ์‚ฌ๋ก€

OS ๋ฒ„์ „์˜ ์ค‘์š”์„ฑ

velog.io

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

node-version : Node๋ฅผ ๋ฒ„์ „์— ๋งž๊ฒŒ ์„ค์น˜

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

build server files : yarn ๋ช…๋ น์–ด๋กœ ํ•„์š”ํ•œ dependency๋“ค์„ ์„ค์น˜ํ•œ ํ›„์— ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •

 

๐Ÿ”ฅ์™„์ „ ์‚ฝ์งˆํ•œ ๋ถ€๋ถ„๐Ÿ”ฅ

github actions yarn run build keeps running

๋ธ”๋กœ๊ทธ ๊ธ€ ๋ณด๊ณ  ๋”ฐ๋ผํ•˜๋Š”๋ฐ , yarn run build ๋ถ€๋ถ„์—์„œ 3์‹œ๊ฐ„ 50๋ถ„๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋Š”๋ฐ ๊ณ„์† ๋กœ๋”ฉ๋งŒ ๊ฑธ๋ ธ๋‹ค.. 

CI ๊ณผ์ •์„ ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ ๋ถ™์—ฌ์„œ ํŒŒ์ผ๋“ค์„ ์‹คํ–‰ํ• ๊ฒŒ ๋งŽ์•„์„œ ๋ฒŒ์„ ์ฃผ๋Š”๊ฑด๊ฐ€ ์‹ถ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ์•„๋‹ˆ์˜€๋‹ค!!!!!!!

 

package.jsonํŒŒ์ผ์˜

scripts:์˜ build ๋ช…๋ น์–ด๊ฐ€ tsc && node dist๋กœ ๋˜์–ด์žˆ์—ˆ๋‹ค.

node dist๋กœ ์„œ๋ฒ„๊ฐ€ ๊ณ„์† ์ผœ์ ธ์žˆ์–ด์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์ง„ํ–‰์ด ์•ˆ๋˜์—ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ๋ช…๋ น์–ด ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

 



  "scripts": {
    "dev": "nodemon",
    "build": "tsc",
    "db:pull": "npx prisma db pull",
    "db:push": "npx prisma db push",
    "generate": "npx prisma generate",
    "pretest": "yarn generate",
    "test": "jest",
    "prepare": "husky install"
  },

3. Github Actions ํ™•์ธ

deploy.yml ํŒŒ์ผ์„ Repository์— ๋“ฑ๋กํ•œ ์ดํ›„ main ๋ธŒ๋žœ์น˜์— push, pull Requestํ•˜๋ฉด ์›Œํฌ ํ”Œ๋กœ์šฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์•ž์— ์„ค์ •ํ•ด์ค€ step์œผ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค~

 


AWS CodeDeploy ์„ค์ •

1. S3 ๋ฒ„ํ‚ท ์ƒ์„ฑ

 

Github Actions์—์„œ EC2์— ๋ฐฐํฌํ•  ํŒŒ์ผ์„ ์••์ถ•ํ•˜์—ฌ S3์— ์ €์žฅํ•˜๊ณ , Codedeploy๋Š” S3์— ์ €์žฅ๋œ ํŒŒ์ผ์„ EC2๋กœ ๋ฐฐํฌํ•œ๋‹ค.

๋ฐฐํฌ ํŒŒ์ผ์„ ์••์ถ•ํ•ด ์ €์žฅํ•  ๋ฒ„ํ‚ท์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

 

2. EC2 IAM ์„ค์ •

 

EC2์—์„œ S3์™€ Codedeploy๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค!

 

AWS > IAM > ์•ก์„ธ์Šค ๊ด€๋ฆฌ > ์—ญํ•  > ์—ญํ•  ๋งŒ๋“ค๊ธฐ

  1. AWSCodeDeployFullAccess
  2. AmazonS3FullAccess

์—ญํ•  ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ  ์—ญํ•  ์ƒ์„ฑ์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค. 

EC2 ์ฝ˜์†” > ์ธ์Šคํ„ด์Šค ์„ ํƒ > ์ž‘์—… > ๋ณด์•ˆ > IAM ์—ญํ•  ์ˆ˜์ •

์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ IAM ์—ญํ• ์„ EC2์— ์ ์šฉํ•ด์ค€๋‹ค. 

 

3. CodeDeploy IAM ์„ค์ •

๋‹ค์Œ์€ CodeDeploy๋ฅผ ์œ„ํ•œ IAM์„ ์ƒ์„ฑํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

AWS > IAM > ์•ก์„ธ์Šค ๊ด€๋ฆฌ > ์—ญํ•  > ์—ญํ• ๋งŒ๋“ค๊ธฐ

 

๋‹ค๋ฅธ AWS ์„œ๋น„์Šค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ CodeDeploy๋ฅผ ์„ ํƒ ํ›„ ๋‹ค์Œ

์ด๋ฆ„๋งŒ ์„ค์ •ํ•ด์ฃผ๊ณ  ์—ญํ•  ์ƒ์„ฑ์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.


4. CodeDeploy ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ

AWS > CodeDeploy > ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ > ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค.

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„ ์„ค์ • > EC2/์˜จํ”„๋ ˆ๋ฏธ์Šค ํด๋ฆญ > ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •

๋ฐฐํฌ ๊ทธ๋ฃน ์ƒ์„ฑ 

๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐํฌ๊ทธ๋ฃน ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

ํ™˜๊ฒฝ ๋ณ„๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ฐฐํฌ ๊ทธ๋ฃน์„ dev, prod ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•จ

 

์„œ๋น„์Šค ์—ญํ• ์— ์•„๊นŒ ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ Codedeploy IAM ์ถ”๊ฐ€

 

- ํ˜„์žฌ์œ„์น˜ ์„ ํƒ

- Amazon EC2 ์ธ์Šคํ„ด์Šค ์„ ํƒ - ํ‚ค์— Name์„ ์ž…๋ ฅํ•˜๊ณ  ๊ฐ’์— ๋ฐฐํฌํ•  EC2 ์ธ์Šคํ„ด์Šค์˜ ์ด๋ฆ„์„ ์ ์–ด์ค€๋‹ค. (EC2 ์ฝ˜์†”์—์„œ ํ™•์ธ๊ฐ€๋Šฅ)

์ธ์Šคํ„ด์Šค๊ฐ€ 1๊ฐœ ์ด์ƒ ํ‘œ์‹œ๋˜๋ฉด ๋ฐฐํฌํ•  EC2๊ฐ€ ์„ ํƒ๋œ๊ฒƒ.

๋‚˜๋จธ์ง€ ์„ค์ •์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•ด์ฃผ๊ณ  ๋ฐฐํฌ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

 

5. IAM ์‚ฌ์šฉ์ž ์ถ”๊ฐ€

AWS > IAM > ์•ก์„ธ์Šค ๊ด€๋ฆฌ > ์‚ฌ์šฉ์ž > ์‚ฌ์šฉ์ž ์ถ”๊ฐ€

 

Github actions๊ฐ€ S3์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ณ , Codedeploy๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ์ฃผ์–ด์•ผํ•œ๋‹ค.

์ด์ „์—๋Š” EC2, Codedeploy์— ์—ฐ๊ฒฐํ•œ ๊ฒƒ์€ '์—ญํ• ', ํ˜„์žฌ๋Š” '์‚ฌ์šฉ์ž'๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •

์‚ฌ์šฉ์ž ์ด๋ฆ„ ์„ค์ •ํ•˜๊ณ  ์•ก์„ธ์Šค ํ‚ค - ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ์•ก์„ธ์Šค์— ์ฒดํฌ๋ฅผ ํ•œ ๋’ค ๋‹ค์Œ์„ ๋ˆŒ๋Ÿฌ์ค€๋‹ค.

๊ธฐ์กด ์ •์ฑ… ์ง์ ‘ ์—ฐ๊ฒฐ > 

ec2์˜ ์—ญํ• ์„ ์ƒ์„ฑํ•ด์ค€๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ AWSCodeDeployFullAccess / AmazonS3FullAccess ์ •์ฑ… ์—ฐ๊ฒฐ

 

ํƒœ๊ทธ ์ƒ์„ฑ > ๊ฒ€ํ†  > ์‚ฌ์šฉ์ž ๋งŒ๋“ค๊ธฐ 

 

Access Key Id, Secret Access Key๊ฐ€ ๋‚˜์˜จ๋‹ค.

.csv ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์œผ์‹ญ์‹œ์˜ค!

 

6. Github repository์— secret ๋ณ€์ˆ˜ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

์›Œํฌํ”Œ๋กœ์šฐ์—์„œ AWS ์—ฐ๋™์„ ์œ„ํ•ด ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ AcessKeyId, Secret Access Key๋ฅผ ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

Repository - Settings - Secrets - Actions

Access key id, Secret access key ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

7. EC2์— codedeploy-agent ์„ค์น˜

EC2์— nvm, npm, yarn, git, node ์„ค์น˜๊ฐ€ ๋˜์–ด์žˆ์–ด์•ผํ•œ๋‹ค. 

--์ด๋ฏธ ์„ค์น˜๋˜์–ด์žˆ์œผ๋ฉด ์ƒ๋žต---

 



$ sudo apt-get install curl
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ sudo apt-get install build-essential

//nvm๊ณผ yarn ์„ค์น˜
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
$ export NVM_DIR="$HOME/.nvm"
$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" 
$ [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
$ nvm install --lts
$ npm install -g yarn

//git ์„ค์น˜
$ sudo apt-get update
$ sudo apt-get install git

 

AWS Code deploy๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” EC2์— CodeDeploy Agent๋ฅผ ์„ค์น˜ํ•ด์ค˜์•ผํ•œ๋‹ค. 

awscli ์„ค์น˜

 



$ sudo apt update
$ sudo apt install awscli

์•„๊นŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•˜๋˜ .csv ํŒŒ์ผ์„ ๋‹ค์‹œ ์—ด์–ด Access key Id, Secret Access Key๋ฅผ ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค. 



$ sudo aws configure
AWS Access Key ID : ๋‹ค์šด ๋ฐ›์€ csv ํŒŒ์ผ ๋‚ด์— Access Key ID
AWS Secret Access KEy : ๋‹ค์šด ๋ฐ›์€ csv ํŒŒ์ผ ๋‚ด์— Secret Access Key
Default region name : ap-northeast-2
Default output format : json

CodeDeploy Agent ์„ค์น˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ณ  install ํŒŒ์ผ์— ๊ถŒํ•œ ์ถ”๊ฐ€



$ wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
$ chmod +x ./install

ruby ์„ค์น˜ ํ›„ CodeDeploy Agent ์„ค์น˜

 



$ sudo apt-get install ruby
$ sudo ./install auto
$ sudo service codedeploy-agent status # ์„ค์น˜ ํ™•์ธ & codedeploy-agent๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒƒ ํ™•์ธ

status๊ฐ€ ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ active(running)์ด ๋œฌ๋‹ค๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป~

 

์ธ์Šคํ„ด์Šค ๋ถ€ํŒ…์‹œ Codedeploy-agent๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘ ๋˜๋„๋ก shell script ์ž‘์„ฑ์„ ํ•ด์ฃผ์–ด์•ผํ•จ

 



$ sudo vim /etc/init.d/codedeploy-startup.sh

i๋กœ ํŽธ์ง‘ ๋ชจ๋“œ ์ง„์ž…

 



#!/bin
sudo service codedeploy-agent restart

esc -> :wq ์ €์žฅํ›„ quit

 



$ sudo chmod +x /etc/init.d/codedeploy-startup.sh

8.  appsepc.yml ํŒŒ์ผ ์ถ”๊ฐ€

๋ฐฐํฌํ•  ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๊ฒฝ๋กœ์— appspec.yml ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

appspec.yml ํŒŒ์ผ : Codedeploy๊ฐ€ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์–‘ ํŒŒ์ผ

 

CodeDeploy๊ฐ€ EC2์— ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ฎ๊ธฐ๊ณ  ๋‚˜๋ฉด, EC2์—์„œ ์ด๋ฃจ์–ด์งˆ ์ž‘์—…์„ ํ•ด๋‹น ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

appsepc.yml ํŒŒ์ผ

 



version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/build
    overwrite: yes

permissions:
  - object: /home/ubuntu
    pattern: '**'
    owner: ubuntu
    group: ubuntu

hooks:
  AfterInstall:
    - location: scripts/after-deploy.sh
      timeout: 300
      runas: ubuntu

destination : CodeDeploy๊ฐ€ EC2์— ๋ฐฐํฌํ•  ์œ„์น˜๋ฅผ destination์— ์ง€์ •ํ•œ๋‹ค.

AfterInstall :

   - location : ํ”„๋กœ์ ํŠธ๊ฐ€ ์˜ฎ๊ฒจ์ง€๊ณ  ๋‚œ ํ›„์— ์ด๋ฃจ์–ด์งˆ ์ž‘์—…์€ scripts/after-deploy.sh์— ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

after-deploy.sh ํŒŒ์ผ ์ถ”๊ฐ€

๋ฐฐํฌํ•  ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๊ฒฝ๋กœ์— scripts ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— after-deploy.sh ํŒŒ์ผ ์ถ”๊ฐ€

ํŒŒ์ผ ์•ˆ์˜ ๋ช…๋ น์–ด๋“ค์€ EC2์— ๋ฐฐํฌ๊ฐ€ ๋๋‚œ ํ›„ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋“ค์ด๋‹ค.

 

scripts/after-deploy.sh 

 



#!/bin/bash
REPOSITORY=/home/ubuntu/build

cd $REPOSITORY

sudo /usr/bin/yarn
sudo /usr/bin/yarn db:pull //prisma ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ๋งŒ
sudo /usr/bin/yarn generate //prisma ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ๋งŒ - ํ•ด๋‹น๋ช…๋ น์–ด๋Š” ์œ„์˜ scripts์˜ ๋ช…๋ น์–ด์ž„
sudo /usr/bin/pm2 start dist

9.  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: [main]

jobs:
  build-and-deploy:
    runs-on: ubuntu-20.04

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

    steps:
      - name: โœ… ์ฒดํฌ์•„์›ƒ source code.
        uses: actions/checkout@v3

      - name: โš™๏ธ ${{ matrix.node-version }} ๋ฒ„์ „์˜ ๋…ธ๋“œ๋กœ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

      - name: โš™๏ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
        working-directory: ./
        run: |
          pwd
          touch .env
          echo DATABASE_URL=${{ secrets.DATABASE_URL }} >> .env
          cat .env

      - name: โœจ ํŒจํ‚ค์ง€ ์„ค์น˜
        working-directory: ./
        run: yarn
        
      - name: โœจ ๋นŒ๋“œ ๊ณผ์ •์„ ์‹œ์ž‘
        working-directory: ./
        run: yarn run build
        
      - name: ๐Ÿ“ฆ ๋นŒ๋“œํ•œ ์ฝ”๋“œ๋ฅผ ์••์ถ•
        run: zip -r hara.zip ./dist ./scripts ./appspec.yml ./.env ./package.json ./prisma

      - name: ๐ŸŒŽ AWS์— ์ ‘์†
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: ๐Ÿฆ– S3์— ์••์ถ•๋œ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์—…๋กœ๋“œ
        run: aws s3 cp --region ap-northeast-2 ./hara.zip s3://hara-build/deploy/

      - name: ๐Ÿš€ AWS codeDeploy๋กœ ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘
        run: aws deploy create-deployment
          --application-name hara-codedeploy
          --deployment-config-name CodeDeployDefault.OneAtATime
          --deployment-group-name dev
          --s3-location bucket=hara-build,bundleType=zip,key=deploy/hara.zip

- zip file : ๋ช…์‹œํ•œ ํŒŒ์ผ, ํด๋”๋“ค์„ hara.zip ํŒŒ์ผ๋กœ ์••์ถ•

- AWS configure credentials : S3์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ IAM ์‚ฌ์šฉ์ž ํ‚ค ๊ฐ’์„ ๋“ฑ๋ก

- upload to S3 : S3์— hara.zip ์••์ถ•ํŒŒ์ผ์„ ์˜ฎ๊ฒจ์คŒ

- deploy with AWS codeDeploy : AWS CodeDeploy๊ฐ€ ์‹คํ–‰

- s3-location bucket=hara-build,bundleType=zip,key=deploy/hara.zip ์ด ๊ณณ์—์„œ ์••์ถ• ํŒŒ์ผ์„ ํ’€์–ด์„œ CodeDeploy์™€ ์—ฐ๊ฒฐ๋œ EC2 ์ธ์Šคํ„ด์Šค์— ๋ฐฐํฌํ•œ๋‹ค.

 

๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด after-deploy.sh ํŒŒ์ผ์˜ ๋ช…๋ น์–ด๋“ค์ด ์‹คํ–‰๋˜๋ฉด์„œ ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘๋จ.

 

ec2์„œ๋ฒ„์—์„œ pm2 logs๋ฅผ ํ•˜๋ฉด ์‹คํ–‰์ด ๋˜๋กœ๋กฑ ๋˜๋ฉด์„œ ์ž๋™๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋จ ..

##์ถ”๊ฐ€

์ง€๊ธˆ ์œ„์˜ deploy.yml ํŒŒ์ผ๋งŒ ์ƒ์„ฑํ•˜๋‹ˆ, pull_request๋ถ€๋ถ„๋“ค์€ ํ™•์ธ์ด ์•ˆ๋˜์—ˆ๋‹ค.

BUT deploy.ymlํŒŒ์ผ์—

on:
     pull_request:
          branches: [main]

์ด ๋ถ€๋ถ„๋“ค์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด, pull_request๊ฐ€ ๋“ค์–ด์˜จ ์•„์ง ๋ฉ”์ธ์— ๋จธ์ง€๋˜์ง€์•Š์€ ํŒŒ์ผ๋“ค๋„ s3์— ์ง‘ํŒŒ์ผ๋กœ ์ €์žฅ๋˜์–ด ๋ฐฐํฌ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ.
  

์œ„์˜ ๋ถ€๋ถ„๋“ค์„ ๋ณด์™„ํ•˜๊ณ ์ž,

pull_request ๋‚ ๋ฆฌ๋Š” ๋ถ€๋ถ„๋“ค๋„ build๊ฐ€ ์ œ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ build.ymlํŒŒ์ผ์„ ์ƒ์„ฑํ•จ.

 

build.yml

 



name: build

on:
  pull_request: 
    branches: [main]
  
jobs:
  build-check:
    runs-on: ubuntu-20.04

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

    steps:
      - name: โœ… ์ฒดํฌ์•„์›ƒ source code.
        uses: actions/checkout@v3

      - name: โš™๏ธ ${{ matrix.node-version }} ๋ฒ„์ „์˜ ๋…ธ๋“œ๋กœ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

      - name: โš™๏ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
        working-directory: ./
        run: |
          pwd
          touch .env
          echo DATABASE_URL=${{ secrets.DATABASE_URL }} >> .env
          cat .env
      
      - name: โœจ ํŒจํ‚ค์ง€ ์„ค์น˜
        working-directory: ./
        run: yarn
        
      - name: โœจ ๋นŒ๋“œ ๊ณผ์ •์„ ์‹œ์ž‘
        working-directory: ./
        run: yarn run build

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด pull_requestํ• ๋•Œ ํ™•์ธํ•ด์ฃผ๋Š” CI๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค :)

 

-์ถ”์‹ 

๋ช‡์‹œ๊ฐ„๋™์•ˆ ์‚ฝ์งˆ์„ ๊ฐ™์ด ํ•ด์ค€ ๋˜‘๋˜‘๋ฃจํ”ผ ๊ฐ€์˜์ด์™€ ์˜†์—์„œ ๊ณ„์† ๋„์™€์ฃผ๊ณ  ํ˜ผ์ž์„œ ํด๋ผ ๋ถ€ํƒ์„ ๋‹ค ๋“ค์–ด์ค€ ์˜ˆ๋ฆฐ์–ธ๋‹ˆ์—๊ฒŒ .. ๊ฐ์‚ฌ์˜ ํŽธ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค ..๐Ÿซถ

์•Œ๋ผ๋ทฐ ์ชฝ์ชฝ .. 2022.01.10 

 

๊ผญ ํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์‹ ์„ธ๊ณ„์ž…๋‹ˆ๋‹ค.

728x90