[springboot-webserivce] EC2 서버 프로젝트 배포

Updated:

[2020.12.28] 부터 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 통해 스프링 공부를 시작했다.

공부한 내용을 글로 정리하려고 한다.

그래야 나중에 다시 찾아보며 공부 할 수 있을테니까 !!

🚀 EC2 서버에 프로젝트 배포하기

[Spring] AWS EC2 서버환경구축 를 통해 프로젝트를 배포 할 서버를 구축하였으니

이제 서버에 프로젝트를 배포 할 시간이다.

먼저 EC2 서버에 접속 한 뒤 $ git clone 레파지토리 주소 를 통해 코드를 전부 가져오자.

스크린샷 2021-01-19 오후 7 53 11

$ ls -la 를 통해 레파지토리를 잘 가져왔는지 확인하고

$ ./gradlew test 를 통해 EC2 서버에서도 테스트가 잘 돌아가는지 먼저 확인한다.

스크린샷 2021-01-19 오후 7 59 28

테스트가 정상적으로 통과되었기 때문에 이 프로젝트를 배포해도 문제가 없다.

코드가 수정 되는 경우 $ git pull 을 통해 최신버전으로 갱신 후 다시 배포하면 된다.

하지만 수정사항이 있을 때 마다 pull 을 하고 테스트를 하고 빌드를 한 뒤 배포를 하려면 정말 귀찮을 것 이다.

따라서 쉘 스크립트를 작성해 스크립트만 실행하면 앞선 과정을 자동으로 수행하게 하려고 한다.

📺 쉘 스크립트를 이용한 자동화

자동화를 하려고 하는 과정은 다음과 같다.

git pull → ./gradlew build → 현재 구동 중인 jar 프로그램 종료 → 방금 만든 jar 파일 실행

#!/bin/bash

REPOSITORY=/home/ec2-user/app/step3
PROJECT_NAME=springboot-webservice

cd $REPOSITORY/$PROJECT_NAME/

echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

./gradlew build

echo "> step 디렉토리로 이동"

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,/home/ec2-user/app/application-oauth.properties,/home/ec2-user/app/application-real-db.properties,classpath:/application-real.properties \
	-Dspring.profiles.active=real \
	$REPOSITORY/$JAR_NAME 2>&1 &

최신 버전을 가져오고 빌드를 한 뒤 jar 파일을 복사해 실행시키는 구조이다.

스크린샷 2021-01-19 오후 8 16 39

이전 버전 프로젝트가 실행 중 이었다면 위 예시처럼 kill 을 통해 죽인 뒤 새로운 버전을 실행시킨다.

$ cat nohup.out 을 보게 되면 이 곳에서 각종 로그를 확인 할 수 있다.

이후 $ curl localhost:8080 을 입력해 index.html 내용이 보이면 배포에 성공한 것 이다.

스크린샷 2021-01-19 오후 8 21 42

마지막으로 EC2 퍼블릭 DNS 주소:8080 으로 접속하게 되면 프로젝트가 잘 배포된 것을 알 수 있다.

⛺️ 정리

쉘 스크립트를 이용하여 배포 과정을 자동으로 처리했다.

로컬이 아닌 다른 서버에 프로젝트를 배포하는 경우는 처음이어서 정말 재미있었다.

이제 프로젝트가 RDS 를 사용하도록 변경하고 Travis CI 를 통해 Push 만 하여도 자동으로 배포까지 해주게 구축하면 끝난다.



Categories:

Updated:

Leave a comment