이전에 작성한 deploy.sh
파일에 crontab
종료 설정을 하겠습니다.
crontab에 PID를 1분마다 감시하면서 서버가 종료되었다면 재시작하는 로직을 작성할 것입니다.
서버가 종료되었을때 crontab이 동작하여 PID를 조회하면 로직이 꼬이게 되기 때문에 삭제를 해주고
재배포 후에 다시 설정하도록 하겠습니다.
#!/bin/bash
# 1. env variable
source ./var.sh
echo "1. env variable setting complete"
# 2. cron delete
touch crontab_delete
crontab crontab_delete
rm crontab_delete
echo "2. crondelete complete"
# 3. server checking
if [ -n "${PROJECT_PID}" ]; then
# re deploy
kill -9 $PROJECT_PID
echo "3. project kill complete"
else
# first deploy
# 3-1 apt update
sudo apt-get -y update 1>/dev/null
echo "3-1. apt update complete"
# 3-2 jdk install
sudo apt-get -y install openjdk-11-jdk 1>/dev/null
echo "3-2. jdk install complete"
# 3-3 timezone
sudo timedatectl set-timezone Asia/Seoul
echo "3-3. timezone setting complete"
fi
재배포 스크립트입니다.
여태까지 진행했던 apt install을 처음 배포때 해주었고 만약 이미 프로젝트가 존재한다면
재배포를 해주면 되기때문에 apt는 다시 설치할 필요가 없습니다.
if [ -n " ${PROJECT_PID} " ]; then
위 명령어에서 -n
옵션은 문자열의 길이가 0이 아니라면 True를 반환합니다.
따라서 PROJECT_PID변수에 값이 담겨있다면 참이됩니다.
최초 배포시에는 git에서 다운받은 폴더가 아무것도 없었지만, 재배포 시에는 기존 폴더가 있기때문에
기존 폴더를 삭제하고 프로젝트를 clone 받아야 합니다.
# ...
# 4. project folder delete
rm -rf ${HOME}/${PROJECT_NAME}
echo "4. project folder delete complete"
# 5. git clone
git clone https://github.com/${GITHUB_ID}/${PROJECT_NAME}.git
sleep 3s
echo "5. git clone complete"
# 6. gradlew +x
chmod u+x ${HOME}/${PROJECT_NAME}/gradlew
echo "6. gradlew u+x complete"
# 7. build
cd ${HOME}/${PROJECT_NAME}
./gradlew clean build
echo "7. gradlew build complete"
# 8. start jar
nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>${HOME}/log.out 2>${HOME}/err.out &
echo "8. start server complete"
# 9. cron registration
touch crontab_new
echo "* * * * * ${HOME}/check-and-restart.sh" 1>>crontab_new
# register the others... you use >> (append)
crontab crontab_new
rm crontab_new
echo "9. cron registration complete"
sleep 3s
: clone할떄 프로젝트를 안전하게 받기 위한 시간입니다.
apt
명령어는 동기식이지만, git clone
은 동기식인지, 비동기인지 모르기 때문에 sleep
을 걸어두었습니다.
-jar Dspring.profiles.active=prod
: 프로젝트의 dev파일에서 포트가 8081로 설정되어있기때문에 배포환경에 맞게다시 맞춰주어야 합니다.
1분마다 서버가 종료된것을 확인하여 종료되었다면, 재실행을하는 스크립트입니다.
#!/bin/bash
source ./var.sh
if [ -z "$PROJECT_PID" ]; then
nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>${HOME}/log.out 2>${HOME}/err.out &
fi
-z
: 문자열의 길이가 0이면 참입니다. 즉, SPRING_PID가 없으면 참이기 때문에 프로세스가 종료되었다면 서버를 실행시킵니다.
./deploy.sh
위 명령어로 시작해 보겠습니다.
전 과정이 잘 수행되었습니다!
#!/bin/bash
# 1. env variable
source ./var.sh
echo "1. env variable setting complete"
# 2. cron delete
touch crontab_delete
crontab crontab_delete
rm crontab_delete
echo "2. cron delete complete"
# 3. server checking
if [ -n "${PROJECT_PID}" ]; then
# re deploy
kill -9 $PROJECT_PID
echo "3. project kill complete"
else
# first deploy
# 3-1 apt update
sudo apt-get -y update 1>/dev/null
echo "3-1. apt update complete"
# 3-2 jdk install
sudo apt-get -y install openjdk-11-jdk 1>/dev/null
echo "3-2. jdk install complete"
# 3-3 timezone
sudo timedatectl set-timezone Asia/Seoul
echo "3-3. timezone setting complete"
fi
# 4. project folder delete
rm -rf ${HOME}/${PROJECT_NAME}
echo "4. project folder delete complete"
# 5. git clone
git clone https://github.com/${GITHUB_ID}/${PROJECT_NAME}.git
sleep 3s
echo "5. git clone complete"
# 6. gradlew +x
chmod u+x ${HOME}/${PROJECT_NAME}/gradlew
echo "6. gradlew u+x complete"
# 7. build
cd ${HOME}/${PROJECT_NAME}
./gradlew clean build
echo "7. gradlew build complete"
# 8. start jar
nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>${HOME}/log.out 2>${HOME}/err.out &
echo "8. start server complete"
# 9. cron registration
touch crontab_new
echo "* * * * * ${HOME}/check-and-restart.sh" 1>>crontab_new
# register the others... you use >> (append)
crontab crontab_new
rm crontab_new
echo "9. cron registration complete"
#!/bin/bash
GITHUB_ID="ReadnThink"
PROJECT_NAME="aws-v2"
PROJECT_VERSION="0.0.1"
PROJECT_PID="$(pgrep -f ${PROJECT_NAME}-${PROJECT_VERSION}.jar)"
JAR_PATH="${HOME}/${PROJECT_NAME}/build/libs/${PROJECT_NAME}-${PROJECT_VERSION}.jar"
export GUTHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export PROJECT_PID
export JAR_PATH
#!/bin/bash
source ./var.sh
if [ -z "$PROJECT_PID" ]; then
nohup java -jar -Dspring.profiles.active=prod ${JAR_PATH} 1>${HOME}/log.out 2>${HOME}/err.out &
fi