10월 7일 - 스프링 부트 배포 스크립트

Yullgiii·2024년 10월 7일
0

[AWS] 스프링 부트 배포 스크립트 생성

AWS에서 프로젝트를 배포할 때는 프로젝트 수정마다 동일한 배포 과정을 반복해야 한다. 이를 자동화하면 시간을 절약하고, 더 효율적으로 관리할 수 있다. 필요한 쉘 스크립트를 작성해 배포 자동화 방법을 알아보자.

프로젝트 배포 과정

  • git pull로 프로젝트 업데이트
  • Gradle 프로젝트 빌드
  • EC2 인스턴스에서 프로젝트 실행 및 배포

이 모든 단계를 자동화하기 위해 deploy.sh 스크립트를 생성하고 다음과 같이 작성한다.

#!/bin/bash

REPOSITORY=/home/ec2-user/app/{clone한 프로젝트 저장한 경로}
PROJECT_NAME={프로젝트명}

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"
git pull

echo "> 프로젝트 Build 시작"
./gradlew build

echo "> step1 디렉토리로 이동"
cd $REPOSITORY

echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
        echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않는다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"

nohup java -jar \
       -Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
       -Dspring.profiles.active=real \
       $REPOSITORY/$JAR_NAME 2>&1 &

참고: 스크립트에 포함된 경로는 사용자 환경에 따라 달라질 수 있으니 반드시 확인 후 설정한다.

스크립트 순서 설명

REPOSITORY=/home/ec2-user/app/{clone한 프로젝트 저장한 경로}
PROJECT_NAME={프로젝트명}

프로젝트명과 프로젝트 경로를 변수로 저장해 자주 사용하는 값을 쉽게 참조하도록 한다.

echo "> Git Pull"
git pull

echo "> 프로젝트 Build 시작"
./gradlew build

echo "> step1 디렉토리로 이동"
cd $REPOSITORY

echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

프로젝트의 변경사항을 EC2 서버에 반영하기 위해 git pull로 업데이트를 진행하고, 이후 프로젝트를 빌드한 후 생성된 .jar 파일을 지정된 경로로 복사해준다.

CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
        echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않는다."
else
        echo "> kill -15 $CURRENT_PID"
        kill -15 $CURRENT_PID
        sleep 5
fi

구동 중인 프로젝트가 있으면 종료한 후 새로운 배포를 진행한다. pgrep 명령어로 현재 실행 중인 애플리케이션의 pid를 가져와, 존재하면 종료(kill -15)하는 방식으로 동작한다.


echo "> JAR Name: $JAR_NAME"
nohup java -jar \
       -Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties \
       -Dspring.profiles.active=real \
       $REPOSITORY/$JAR_NAME 2>&1 &

nohup 명령어로 터미널 종료 후에도 애플리케이션이 계속 구동되도록 한다. -Dspring.config.location 옵션은 .gitignore로 제외된 보안 파일들과 jar 내부 properties 파일을 적용하기 위한 경로 설정이다.

예시 경로: application-oauth.propertiesapplication-real-db.properties는 EC2 서버에 절대경로로 설정하여 프로젝트 외부에 존재한다.

So...

이제 프로젝트에 수정사항이 생기면, EC2 서버에서 deploy.sh 스크립트를 실행하여 자동으로 배포할 수 있다. 이러한 자동화로 배포의 효율성을 높이고, EC2 서버에서의 배포 작업을 보다 간편하게 처리할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글