기존에 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으로 실행해보면 잘 돌아갑니다
저도 자동배포 스크립트는 사용한지 얼마 안되었는데 사용하기 전과 사용한후의 개발의 질이 달라집니다 !!!!! 여러분들도 꼭 사용해보시길 바랄게용 ㅎㅎ
'기타' 카테고리의 다른 글
aws EC2에 Node pm2 nginx 설치후 배포하기 (0) | 2023.08.03 |
---|---|
aws 인스턴스 고정 IP (탄력적 IP) 생성하기 (0) | 2023.08.03 |
aws ec2 서버 생성하기 (0) | 2023.08.03 |
git 명령어 모음 (0) | 2023.08.02 |
JWT(JSON Web Token) 토큰이란?? (0) | 2023.04.07 |