해당 내용은 이동욱님 저서 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'를 공부하며 정리한 내용입니다.
과거 스프링 프레임워크로 구현한 프로젝트를 tomcat으로 EC2에서 배포하는 포스팅을 작성했습니다.
스프링부트에는 tomcat이 내장되어있어 따로 tomcat+war의 조합이 아닌 jar 파일 만으로 배포가 가능합니다.
이번 포스팅에서는 AWS EC2에 war파일 배포하기 포스팅에서 작성한 내용과 동일한 부분은 스킵하고 이후의 내용부터 다루려고 합니다.
이전 포스팅의 소제목 '프로젝트 소스 가져오기'와 '.gitignore에 등록했던 파일 만들기'를 선수행한 후 아래의 내용을 따라가주세요.
./gradlew test
소스코드를 내려 받은 이후 테스트를 수행하여 서버 환경에서의 테스트 결과를 확인합니다.
저는 처음 이과정에서 수많은 오류를 겪었습니다.
혹시 이 과정에서 오류가 발생한다면 ./gradlew test를 성공하기까지...와 AWS EC2 램 늘리기(feat.스왑) 포스팅의 내용을 확인해주세요!
만약 gradlew의 권한이 없다는 오류 메세지가 나오면 다음 명령어로 권한을 추가한 뒤에 다시 테스트를 수행합니다.
chmod +x ./gradlew
./gradlew build
소스코드를 build하여 jar 파일을 생성하는 명령어입니다.
빌드가 수행되면 build/libs/ 에 jar 파일이 생성됩니다.
DB 등 개발 환경과 배포 환경이 상이한 부분이 있을 수 있습니다.
이러한 부분은 properties를 생성하고 application.properties에서 이를 group으로 관리할 수 있습니다.
이전에 작성했던 SpringBoot 배포를 위한 .properties 설정하기 포스팅을 참고하여 필요한 properties 파일을 생성해주세요.
nohup java -jar [파일명].jar 2>&1 &
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ubuntu/app/springBoot/application-oauth.properties,/home/ubuntu/app/springBoot/application-real-db.properties \
-Dspring.profiles.active=real \
[파일명].jar 2>&1 &
여타 과정은 둘째치고 jar 파일을 수행시키는 명령어만 해도 몇 줄이 되다보니 이건 반드시 shell 파일로 자동화를 시켜야겠다는 생각이 들었습니다.
git pull -> build -> 파일 이동 -> 프로세스 확인 -> jar 실행의 순서로 진행 되도록 구현했습니다.
자주 사용하는 경로는 변수에 담아놓고 이용했습니다.
#!/bin/bash
REPOSITORY=~/app/springBoot
PROJECT_NAME=SpringBootProject
TODAY=$(date "+%Y%m%d")
cd $REPOSITORY/$PROJECT_NAME
echo "> Git Pull"
git pull origin main
echo "> 프로젝트 Build 시작"
./gradlew build
echo "> spirngBoot 디렉토리로 이동"
cd $REPOSITORY
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f $PROJECT_NAME)
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 백업"
OLD_JAR_NAME=$(ls -tr $REPOSITORY/ | grep jar | tail -n 1)
mv -i $OLD_JAR_NAME backup/$TODAY$OLD_JAR_NAME
echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
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/ubuntu/app/springBoot/application-oauth.properties,/home/ubuntu/app/springBoot/application-real-db.properties \
-Dspring.profiles.active=real \
$REPOSITORY/$JAR_NAME 2>&1 &
#!/bin/bash
pgrep -f
if [ -z XXX ]
kill -15
-
참고