개요
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"
프로젝트 실행