Profile picture

[Shell-Script] 스프링 부트 배포 쉘 스크립트

JaehyoJJAng2023년 04월 21일

개요

AWS에서 프로젝트를 배포하는 과정은 프로젝트 소스코드가 수정될 때마다 똑같은 일을 반복해야 함.


  • 프로젝트 배포 과정
    • git pull로 프로젝트 업데이트
    • gradle 프로젝트 빌드
    • ec2 인스턴스 서버에서 프로젝트 실행 및 배포

위 과정을 자동화 시킬 수 있다면 매우 편리할 것 이다.
위 과정을 자동화 하는 작업을 쉘 스크립트로 작성해보도록 하자.


스크립트

var.sh

먼저 var.sh 파일을 생성하여 사용할 환경 변수들을 해당 파일에 정의해주자

#!/bin/bash
GITHUB_ID="codingspecialist"
PROJECT_NAME="aws-v2-last"
PROJECT_VERSION="0.0.2"
JAR_FILE="${PROJECT_NAME}-${PROJECT_VERSION}.jar"
PROJECT_PID="$(ps aux | grep ${PROJECT_NAME} | grep -v "grep" | awk '{print $2}' )"
JAR_PATH="${HOME}/git/${PROJECT_NAME}/build/libs/${JAR_FILE}"
LOG_PATH="${HOME}/git/server_log"
SERVER_IP="http://13.125.254.51:8080/"

export GITHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export JAR_FILE
export PROJECT_PID
export JAR_PATH
export LOG_PATH
export SERVER_IP

deploy.sh

배포에 필요한 쉘 스크립트를 작성해보도록 하자

#!/bin/bash

# 1. source environment variable
source "$(find ${HOME} -name "var.sh" 2>/dev/null)"
echo "1. environment variable setting complete"

# 2. cron delete
touch "${HOME}/cron_delete"
crontab "${HOME}/cron_delete"
rm -rf "${HOME}/cron_delete"
echo "2. cron delete complete"

# 3. server checking
if [[ -n "${PROJECT_PID}" ]]
then
  # 프로젝트가 동작하고 있는 경우 프로젝트 종료
  kill -KILL "${PROJECT_PID}"
  echo "3. project kill complete (${PROJECT_PID})"
else
  # 최초 배포
  # 3-1 apt update
  sudo apt-get update -y 1>/dev/null
  echo "3-1. apt update complete"

  # 3-2 jdk install
  sudo apt-get install -y openjdk-11-jdk 1>/dev/null
  echo "3-2. jdk install complete"

  # 3-3 timezone setting
  sudo timedatectl set-timezone $(timedatectl list-timezones | grep -i "seoul")
  echo "3-3. timezone setting complete"
fi

# 4. project folder delete
if [[ -d "${HOME}/git/${PROJECT_NAME}" ]]
then
  rm -rf "${HOME}/git/${PROJECT_NAME}"
  echo "4. project folder delete complete"
fi

# 5. git clone
git clone https://github.com/"${GITHUB_ID}/${PROJECT_NAME}.git"
sleep 5
echo "5. git clone complete [${PROJECT_NAME}.git}]"

# 6. gradlew +x
sudo chmod +x "${HOME}/git/${PROJECT_NAME}/gradlew"
echo "6. gradlew +x complete"

# 7. project build
cd "${HOME}/git/${PROJECT_NAME}"
bash gradlew build
echo "7. gradlew build complete"

# 8. start ${PROJECT_NAME}.jar
if [[ ! -d "${LOG_PATH}" ]]
then
  mkdir "${LOG_PATH}"
fi
nohup java -jar "${JAR_PATH}" 1>"${LOG_PATH}/log.out" 2>"${LOG_PATH}/err.log" &
echo "${JAR_PATH}"
echo "8. start .jar"

스크립트 설명

순서대로 간단히 설명하면 아래와 같다.

# var.sh

#!/bin/bash
GITHUB_ID="codingspecialist"
PROJECT_NAME="aws-v2-last"
PROJECT_VERSION="0.0.2"
JAR_FILE="${PROJECT_NAME}-${PROJECT_VERSION}.jar"
PROJECT_PID="$(ps aux | grep ${PROJECT_NAME} | grep -v "grep" | awk '{print $2}' )"
JAR_PATH="${HOME}/git/${PROJECT_NAME}/build/libs/${JAR_FILE}"
LOG_PATH="${HOME}/git/server_log"
SERVER_IP="http://13.125.254.51:8080/"

export GITHUB_ID
export PROJECT_NAME
export PROJECT_VERSION
export JAR_FILE
export PROJECT_PID
export JAR_PATH
export LOG_PATH
export SERVER_IP

deploy.sh에서 사용할 변수명을 var.sh 스크립트에서 정의하였다


# 1. source environment variable
source "$(find ${HOME} -name "var.sh" 2>/dev/null)"
echo "1. environment variable setting complete"

환경변수를 읽어온다


# 2. cron delete
touch "${HOME}/cron_delete"
crontab "${HOME}/cron_delete"
rm -rf "${HOME}/cron_delete"
echo "2. cron delete complete"

기존에 설정된 크론탭 설정을 초기화한다


# 3. server checking
if [[ -n "${PROJECT_PID}" ]]
then
  # 프로젝트가 동작하고 있는 경우 프로젝트 종료
  kill -KILL "${PROJECT_PID}"
  echo "3. project kill complete (${PROJECT_PID})"
else
  # 최초 배포
  # 3-1 apt update
  sudo apt-get update -y 1>/dev/null
  echo "3-1. apt update complete"

  # 3-2 jdk install
  sudo apt-get install -y openjdk-11-jdk 1>/dev/null
  echo "3-2. jdk install complete"

  # 3-3 timezone setting
  sudo timedatectl set-timezone $(timedatectl list-timezones | grep -i "seoul")
  echo "3-3. timezone setting complete"
fi

프로젝트가 실행 중인 경우 프로세스를 죽인다.
그게 아닌 경우 배포에 필요한 패키지 및 타임존 셋팅을 진행한다


# 4. project folder delete
if [[ -d "${HOME}/git/${PROJECT_NAME}" ]]
then
  rm -rf "${HOME}/git/${PROJECT_NAME}"
  echo "4. project folder delete complete"
fi

프로젝트 폴더가 존재하는 경우 삭제한다


# 5. git clone
git clone https://github.com/"${GITHUB_ID}/${PROJECT_NAME}.git"
sleep 5
echo "5. git clone complete [${PROJECT_NAME}.git}]"

프로젝트를 클론한다


# 6. gradlew +x
sudo chmod +x "${HOME}/git/${PROJECT_NAME}/gradlew"
echo "6. gradlew +x complete"

# 7. project build
cd "${HOME}/git/${PROJECT_NAME}"
bash gradlew build
echo "7. gradlew build complete"

gradlew 실행 권한 부여 및 gradlew 프로젝트 빌드


# 8. start ${PROJECT_NAME}.jar
if [[ ! -d "${LOG_PATH}" ]]
then
  mkdir "${LOG_PATH}"
fi
nohup java -jar "${JAR_PATH}" 1>"${LOG_PATH}/log.out" 2>"${LOG_PATH}/err.log" &
echo "${JAR_PATH}"
echo "8. start .jar"

프로젝트 실행


Loading script...