기타

aws 스크립트 사용해 nest js 자동배포하기

호리둥절 2023. 8. 3. 16:08

기존에 ssh로 접속해 Git clone 받고 build 하고 install하고 pm2 start 하는 과정이 매우 번거롭게 느껴졌을텐데요.

이와 같이 반복되는 작업을 자동화하는 것은 정말로 효율적이며 시간을 절약할 수 있는 방법입니다.  스크립트 작성을 통해 단 코드 한줄로 배포해봅시다 !

 

1. 스크립트 파일 작성하기

프로젝트 하위 폴더에 scripts파일을 만들고 아래와 같이 deploy.sh를 만들고 앞서 발급받은 pem키도 같이 넣어주세요 

deploy.sh 작성하기

#!/bin/bash
PEM_PATH=./scripts/test.pem
if [ ! -f $PEM_PATH ]; then
    echo "DEPLOY_FAIL: not file exist \"$PEM_PATH\""
    exit 1;
fi

# 나중에 env 사용할때 주석해제
# ENV=.env.production
# if [ ! -f $ENV ]; then
#     echo "DEPLOY_FAIL: not file exist \"$ENV\""
#     exit 1;
# fi

# 프로젝트 빌드
npm run build

BUILD=$?
if [ $BUILD -eq 1 ]; then
    echo -e '\n======================================\n'
    echo 'BUILD FAILED : deploying is cancel'
    echo -e '\n======================================\n'
    exit 1;
fi

USER=ubuntu
HOST=[고정 아이피 입력]
DEPLOY_PATH=[프로젝트 저장하고싶은 폴더 입력]

SERVER=$USER@$HOST
REMOTE_PATH=$SERVER:$DEPLOY_PATH

# 원격 서버에서 기존의 배포 디렉토리 삭제 및 생성
ssh -i $PEM_PATH $SERVER "sudo rm -rf $DEPLOY_PATH/dist"
ssh -i $PEM_PATH $SERVER "sudo mkdir -p -m 777 $DEPLOY_PATH/dist"

# 로컬 머신의 파일들을 원격 서버로 전송
rsync -avz --progress -e "sudo ssh -i $PEM_PATH" dist/ $REMOTE_PATH/dist
rsync -avz --progress -e "sudo ssh -i $PEM_PATH" package* $REMOTE_PATH
rsync -avz --progress -e "sudo ssh -i $PEM_PATH" ecosystem.config.js $REMOTE_PATH
# 나중에 env 사용할때 주석해제
# rsync -avz --progress -e "sudo ssh -i $PEM_PATH" .env.production $REMOTE_PATH

# 필요한 파일 업로드 완료 메시지 출력
echo -e '\n======================================\n'
echo 'FILE UPLOAD DONE.'
echo -e '\n======================================\n'

# 원격 서버에서 프로젝트 의존성 설치
ssh -i $PEM_PATH $SERVER "npm --prefix $DEPLOY_PATH install"

# PM2를 사용하여 애플리케이션 실행 또는 재시작
ssh -i $PEM_PATH $SERVER "sudo pm2 startOrReload $DEPLOY_PATH/ecosystem.config.js"

# 배포 완료 메시지 출력
echo -e '\n======================================\n'
echo 'DEPLOY SUCCESS AND DONE.'
echo -e '\n======================================\n'

이해하시기 쉽도록 주석을 달아 놓았으니 스크립트를 처음 작성하시는 분들도 쉽게 이해하시리라 믿습니다

고정아이피와 , 폴더명은 꼭 본인에 환경에 맞게 작성해주시기 바랍니다.

 

startOrReload이미 실행 중인 프로세스가 있다면 해당 프로세스를 다시 시작하고, 없다면 새로운 프로세스를 시작합니다

sudo pm2 restart $DEPLOY_PATH/dist/main.js

를 대신 사용하셔도 무방하나 Restart는 명령어는 현재 실행 중인 프로세스를 중지한 뒤 다시 시작하기 때문에 startOrReload 쓰는것을 추천드립니다.

 

startOrReload 사용하기위해서 ecosystem.config.js 를 작성해보겠습니다.

2.ecosystem.config.js 작성하기

module.exports = {
    apps: [
        {
            name: '[애플리케이션 이름]',
            cwd: '[DEPLOY_PATH 와 같은 경로로 작성]',
            script: './dist/main.js',
            instances: 1,
            exec_mode: 'cluster',
            wait_ready: true,
            kill_timeout: 5000,
            
        }
    ]
};

애플리케이션과 경로를 꼭 작성해주세요 

3.package.json에 script 작성하기

"scripts": { "deploy": "bash ./scripts/deploy.sh"}

위와 같이 넣어주고

npm run deploy

 하면 자동배포가 완료됩니다~ 정말 코드 한줄로 배포가 가능하다니 정말 나이스하죠?

 

※ 혹시 pm2 관련해서 에러가 뜬다면 우분투 서버에 sudo로 전역상태로 pm2 설치해주시길 바랍니다

 sudo npm i -g pm2

4. 우분투에 접속하여 확인해보기

짜잔 ~~~ 잘 실행되고 있는걸 볼수 있습니다.

저는 개발서버를 3000번 포트로 지정했기때문에 http://<ip 주소>:3000으로 실행해보면 잘 돌아갑니다

 

저도 자동배포 스크립트는 사용한지 얼마 안되었는데 사용하기 전과 사용한후의 개발의 질이 달라집니다 !!!!! 여러분들도 꼭 사용해보시길 바랄게용 ㅎㅎ