| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | 
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | 
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | 
| 26 | 27 | 28 | 29 | 30 | 31 | 
- 수학
- Nestjs
- dfs
- 백준
- socket
- type challenge
- 자바스크립트
- javascript
- 알고리즘
- 프로그래머스
- Node.js
- 크롤링
- Algorithm
- HTTP
- 레벨 1
- 문자열
- 프로그래머스 레벨 2
- Crawling
- typescript
- HTTP 완벽 가이드
- dp
- 쉬운 문제
- BFS
- 소켓
- ip
- 가천대
- 타입스크립트
- TCP
- 타입 챌린지
- 그래프
- Today
- Total
kakasoo
쉘 스크립트와 crontab을 활용한 배포 자동화 본문

나는 aws에서 프리티어로 제공된 ubuntu 서버를 사용하고 있었다. 나중에 메모리 부족으로 인해서 -어떤 문제였는지는 다른 글에서 설명하도록 하고- 결국 라즈베리파이로 옮기긴 했으나, 기본적인 골자는 똑같기 때문에 aws 기준으로 설명을 한다.
문제 배경 1
- local에서 작업을 한다.
- github에 push를 한 직후, ssh 또는 putty로 aws에 들어간다. * 여기부터는 local이 아니다.
- 이후 git fetch, git pull 등의 명령어로 새로운 코드 및 파일들을 가져온다.
- 새로이 배포를 한다.- npm install
- npm run build
- pm2로 만든 서버라면 NODE_ENV=production pm2 restart 0
- 나의 경우에는 nginx를 써서 배포했기 때문에 클라이언트는 build만 해두어도 됐다.
 
aws에서의 작업을 CMD 창에서 작성할 명령어로 표현하면 아래처럼 된다.
서버 측 명령어
# 서버의 경우
cd /home/폴더경로/server
git fetch
git pull
npm install
npm run build
# 서버를 실행시킨 적이 이전에 있었다면
NODE_ENV=production pm2 restart 0
# 서버를 새로 실행시키는 것이라면 restart 대신에 start 와 서버 빌드 경로를 작성한다.
NODE_ENV=production pm2 start ./dist/bin/www.js클라이언트 명령어
# client의 경우
cd /home/폴더경로/client
git fetch
git pull
npm install
npm run build
# nginx에서 빌드된 파일 위치를 지정해놓았기 때문에 여기까지만 작업하면 된다.
# 이번 글은 nginx를 설명하는 것이 아니기 때문에 관련 내용은 생략한다.매번 이러한 과정을 밟는 것은 상당한 시간이 걸린다. 그렇기 때문에 문제 배경에 나온 것을 자동화한다. 이는 쉘 스크립트라는 형태로 자동화를 할 건데, 이는 확장자가 .sh 이며 실행 시에는 ./fileName.sh의 형태로 작성하면 된다.
문제 해결
server.sh
# server 측 shell script
cd /home/ubuntu/github/server
git fetch
local=$(git rev-parse HEAD)
echo $local
target=$(git rev-parse origin/main)
echo $target
if [ $local != $target ]
then
        git stash
        git pull origin main
        echo '풀 완료'
        npm install
        npm run build
        pm2 stop 0
        NODE_ENV=production pm2 start ./dist/bin/www.js
ficlient.sh
cd /home/ubuntu/github/client
git fetch
local=$(git rev-parse HEAD)
echo $local
target=$(git rev-parse origin/main)
echo $target
if [ $local != $target ]
then
        git stash
        git pull origin main
        echo '풀 완료'
        npm install
        echo "npm install 완료"
        npm run build
        echo "빌드 완료"
fi두 스크립트 모두 같은 구조로 되어 있는데, 일단 파일의 경로가 다를 경우가 있을 수 있으므로, 해당 파일의 위치로 가게 한다. 그 다음 git fetch로 origin에서 데이터를 가져온다. 다음에는 local과 origin에서의 HEAD를 비교하여, 만약 이것이 다를 경우에는 아래의 명령어들을 실행한다.
여기서부터는 서버와 클라이언트가 배포되는 방식에 따라 코드가 달라질 수 있는데, 기본적으로는 혹여 서버나 클라이언트에서 직접 작업한 내용이 있을 수 있으므로 git stash로 모두 날려준다. 이는 git pull을 할 때 충돌이 나는 것을 방지한다. 다음은 새로운 모듈이 추가됐을 경우를 대비하여 npm install을 한 상태에서 build 명령을 한다.
서버의 경우에는 pm2 명령어를 추가로 작성해주었다. 중간 중간에 나오는 echo는 console 창에 문자열을 띄우는 명령어이다.
앞서 말했듯이 해당 폴더 경로에서 ./server.sh 또는 ./client.sh 라고 입력하면 저 명령어들을 순차적으로 실행하게 된다. 따라서 여러 번 타자를 칠 필요 없이 하나의 명령어로 실행될 수 있도록 단축할 수 있다.
문제 배경 2
- 쉘 스크립트로 자동화를 했지만, 결국 ssh나 putty를 써서 aws에 들어온 다음, 쉘 스크립트 실행 명령어를 입력해주어야 하는 상황은 그대로이다.
- 따라서 aws에서 쉘 스크립트를 정해진 시간마다 실행시키도록 한다.
문제 해결 2
이는 사실 쉘 스크립트를 사용하고 난 다음이라면 무척이나 간단하다. 나는 ubuntu에 기본적으로 같이 있을, crontab을 사용하였다. 해당 코드를 아래에 게시한다.
SHELL=/bin/bash
PATH=${PATH} # 이 부분에 대해서는 아래의 텍스트를 참고!
* * * * * /home/ubuntu/github/client/client.sh
* * * * * /home/ubuntu/github/server/server.sh
위의 별 기호들이 의미하는 것은 시간을 의미한다. 나의 경우에는 1분마다로 설정하였는데, 개발이 얼추 끝난 직후에는 굳이 1분마다 할 필요가 없다. 시간 간격으로 설정할 필요없이, 특정 시간 ( 사용자가 없을 밤 시간 대 )로 배포하게끔 하면 될 것이다.
PATH 라고 작성된 부분은 위 내용을 그대로 작성해서는 안 된다. echo ${PATH} 라고 작성하여 경로를 알아낸 다음에, 그 경로를 복사하여 넣어주자. 상당히 긴 텍스트가 나올 것이다.
결론
- 쉘 스크립트와 crontab의 기본적인 내용만 알고 있어도, 개발이 무척이나 편해진다.
- 초기에 설정을 해두면 이후 작업이 무척이나 편해지므로, 환경 설정 및 세팅에 시간을 아끼지 말자.
'프로그래밍' 카테고리의 다른 글
| 라즈베리파이로 집에 서버 설치하기 (0) | 2021.03.08 | 
|---|---|
| CRA npm run build 시 에러 발생 ( 일시적 해결 방법 ) (0) | 2021.03.07 | 
| 기본 코딩 컨벤션 (0) | 2020.10.15 | 
| [bash] bash와 shell script, 자동화 (0) | 2020.08.01 | 
| [github] 명령어 (0) | 2020.06.23 | 
