스크립트 작성으로 배포 효율성 개선하기 2

Sol's·2023년 5월 16일
0

Aws 무중단 배포

목록 보기
15/28

재배포를 고려한 cron종료

이전에 작성한 deploy.sh파일에 crontab종료 설정을 하겠습니다.

crontab에 PID를 1분마다 감시하면서 서버가 종료되었다면 재시작하는 로직을 작성할 것입니다.
서버가 종료되었을때 crontab이 동작하여 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. 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 받아야 합니다.

  • deploy.sh
# ...

# 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로 설정되어있기때문에 배포환경에 맞게다시 맞춰주어야 합니다.

crontab 설정

1분마다 서버가 종료된것을 확인하여 종료되었다면, 재실행을하는 스크립트입니다.

  • check-and-restart.sh
#!/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가 없으면 참이기 때문에 프로세스가 종료되었다면 서버를 실행시킵니다.

develop.sh 실행해보기

./deploy.sh

위 명령어로 시작해 보겠습니다.

전 과정이 잘 수행되었습니다!

전체 스크립트

  • 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"
  • var.sh
#!/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
  • check-and-restart.sh
#!/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
profile
배우고, 생각하고, 행동해라

0개의 댓글