Profile picture

[Shell Script] 스프링 부트(Spring Boot) 배포 자동화 스크립트

JaehyoJJAng2023년 04월 26일

개요

AWS의 EC2 환경에서 자바 환경설정 및 jar 빌드 및 배포까지

한 번에 아우르는 쉘 스크립트를 작성해보자.


스크립트 작성

1. deploy.sh

#!/bin/bash

# 1. source env variable
source "$(find . -name 'var.sh' 2>/dev/null)"
echo "1. env variable setting complete"

# 2. cron delete
touch cron_delete
crontab cron_delete
rm -rf cron_delete
echo "2. cron delete complete"

# 3. server checking
if [[ -n "${PROJECT_PID}" ]]
then
    # 프로젝트가 동작하고 있는 경우 프로세스 KILL
    echo "3. project kill complete (${PROJECT_PID})"
    kill -KILL "${PROJECT_PID}"
else
    # 최초 배포

    # 3-1 apt update
    sudo apt-get update 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
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 5
echo "5. git clone complete [${PROJECT_NAME}.git]"

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

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

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

# 9. Check Web Page
STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${SERVER_IP})
if [[ ! "${STATUS}" -eq 200 ]]
then
    echo -e "\n================== WARNING =================="
    echo "page status code is not 200"
    echo -e "==================              ==================\n"
fi
echo "9. web page check complete"

# 10. cron registration
touch "${HOME}/crontab_new"
echo "* * * * * ${HOME}/check-and-restart.sh" 1>${HOME}/crontab_new
crontab "${HOME}/crontab_new"
rm -rf "${HOME}/crontab_new"
echo "10. cron registration complete"

2. var.sh

#!/bin/bash

GITHUB_ID="codingspecialist"
PROJECT_NAME="aws-test"
PROJECT_VERSION="demo-0.0.1-SNAPSHOT"
JAR_FILE="${PROJECT_VERSION}.jar"
PROJECT_PID="$(pgrep -f ${JAR_FILE})"
JAR_PATH="${HOME}/${PROJECT_NAME}/build/libs/${JAR_FILE}"
LOG_PATH="${HOME}/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 SERVER_IP

3. check-and-restart.sh

#!/bin/bash

source "${HOME}/var.sh"

if [[ ! -n "${PROJECT_PID}" ]]
then
  nohup java -jar "${JAR_PATH}" 1>"${HOME}/server_log/log.out" 2>"${HOME}/server_log/err.out" &
fi

cron 등록하기

  • cron 등록 스크립트를 deploy.sh 파일에 추가하자.

1. deploy.sh

# 1. env variable setting
..

# 2. cron delete
..

# 3. server checking
..

# 4. project folder delete
..

# 5. git clone
..

# 6. gradlew +x
..

# 7. build
..

# 8. start jar
..

# 9. cron registration
touch "${HOME}/crontab_new"
echo "* * * * * ${HOME}/check-and-restart.sh" 1>"${HOME}/crontab_new"
crontab "${HOME}/crontab_new"
rm -rf "${HOME}/crontab_new"
echo "9. cron registration complete"

2. check-and-restart.sh

  • var.sh 에서 선언한 환경 변수가 필요하므로 source를 통하여 가져오기

check-and-restart.sh

#!/bin/bash

source "${HOME}/var.sh"

if [[ ! -n "${PROJECT_PID}" ]]
then
  nohup java -jar -Dspring.profiles.active=prod "${JAR_PATH}" 1>"${HOME}/server_log/log.out" 2>"${HOME}/server_log/err.log" &
fi

EC2에 배포하기

위 빌드 스크립트를 압축한 후 깃허브 레포지토리에 업로드 -> EC2 가상 머신에서 git pull -> 스크립트 실행 -> 자동 배포 끗!


1. build 스크립트 압축

  • 새로운 EC2 환경에서 해당 스크립트 파일들을 압축 푼 후 바로 빌드가 가능할 수 있도록 이전에 작성해둔 스크립트 파일들을 tar 명령어를 이용하여 압축

  • tar -c : 압축 생성
  • tar -v : 압축 로그 화면에 출력
  • tar -f {압축파일명} : 압축 파일 이름 지정
  • tar -x : 압축 해제

tar 테스트용 파일 생성

mkdir tar_test
touch a.txt; touch b.txt

파일 압축

tar -cvf test_tar.tar a.txt b.txt

파일 압축해제

tar -xvf test_tar.tar 

빌드 스크립트 압축하기

tar -cvf deploy.tar check-and-restart.sh deploy.sh var.sh


2. 새로운 EC2 생성

  • aws-v2-last
  • 인스턴스 유형
    • t2.micro 선택
  • 키페어
    • 기존 키 페어 선택
      • awslearner_keypar
  • 네트워크 설정
    • 기존 네트워크 보안 그룹 선택
      • launch-wizard-1
  • 보안 그룹에 8080 포트 허용

3. deploy.tar 압축 해제

  • 위에서 생성한 머신으로 SSH 접속
  • 내 프라이빗 레포에 있는 aws-v2 프로젝트 clone
  • deploy.tar 압축 해제

프로젝트 clone

git clone https://github.com/JaehyoJJAng/AWS-Deploy-EasyupClass.git

파일 압축해제

tar -xvf deploy.tar

스크립트에 실행 권한 부여

chmod 700 deploy.sh check-and-restart.sh

4. 프로젝트 빌드

  1. 위에서 압축 푼 deploy.sh 실행
  2. 에러 없이 정상적으로 build 되는지 확인
bash ./deploy.sh

1. env variable setting complete
2. cron delete complete
3. project kill complete (6456)
Cloning into 'aws-v2'...
remote: Enumerating objects: 37, done.
remote: Counting objects: 100% (37/37), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 37 (delta 4), reused 35 (delta 2), pack-reused 0
Unpacking objects: 100% (37/37), 61.46 KiB | 5.12 MiB/s, done.
5. git clone complete
6. gradlew u+x complete

BUILD SUCCESSFUL in 15s
6 actionable tasks: 6 executed
7. gradlew build complete
8. start server complete
9. cron registration complete

실행 확인

$ netstat -nltp | grep "java"

tcp6       0      0 :::8080                 :::*                    LISTEN      21532/java
tcp6       0      0 127.0.0.1:43947         :::*                    LISTEN      21127/java

정상적으로 서비스 되고 있음!..


Loading script...