[springboot-webserivce] EC2 서버 프로젝트 배포
Updated:
[2020.12.28] 부터 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 통해 스프링 공부를 시작했다.
공부한 내용을 글로 정리하려고 한다.
그래야 나중에 다시 찾아보며 공부 할 수 있을테니까 !!
🚀 EC2 서버에 프로젝트 배포하기
[Spring] AWS EC2 서버환경구축 를 통해 프로젝트를 배포 할 서버를 구축하였으니
이제 서버에 프로젝트를 배포 할 시간이다.
먼저 EC2 서버에 접속 한 뒤 $ git clone 레파지토리 주소 를 통해 코드를 전부 가져오자.
$ ls -la 를 통해 레파지토리를 잘 가져왔는지 확인하고
$ ./gradlew test 를 통해 EC2 서버에서도 테스트가 잘 돌아가는지 먼저 확인한다.
테스트가 정상적으로 통과되었기 때문에 이 프로젝트를 배포해도 문제가 없다.
코드가 수정 되는 경우 $ 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 파일을 복사해 실행시키는 구조이다.
이전 버전 프로젝트가 실행 중 이었다면 위 예시처럼 kill 을 통해 죽인 뒤 새로운 버전을 실행시킨다.
$ cat nohup.out 을 보게 되면 이 곳에서 각종 로그를 확인 할 수 있다.
이후 $ curl localhost:8080 을 입력해 index.html 내용이 보이면 배포에 성공한 것 이다.
마지막으로 EC2 퍼블릭 DNS 주소:8080 으로 접속하게 되면 프로젝트가 잘 배포된 것을 알 수 있다.
⛺️ 정리
쉘 스크립트를 이용하여 배포 과정을 자동으로 처리했다.
로컬이 아닌 다른 서버에 프로젝트를 배포하는 경우는 처음이어서 정말 재미있었다.
이제 프로젝트가 RDS 를 사용하도록 변경하고 Travis CI 를 통해 Push 만 하여도 자동으로 배포까지 해주게 구축하면 끝난다.
Leave a comment