Back-End/Springboot와 AWS로 혼자 구현하는 웹 서비스

Chapter 08. EC2 서버에 프로젝트를 배포해 보자 (2)

yeonx 2022. 4. 7. 00:43
728x90

8.2 배포 스크립트 만들기

 

배포 : 작성한 코드를 실제 서버에 반영하는 것

  • git clone 혹은 git pull을 통해 새 버전의 프로젝트 받음
  • Gradle이나 Maven을 통해 프로젝트 테스트와 빌드
  • EC2 서버에서 해당 프로젝트 실행 및 재실행

이러한 과정을 배포할 때마다 개발자가 하나하나 명령어를 실행하는 것은 불편함이 많음

-> 그래서 이를 쉘 스크립트로 작성해 스크립트만 실행

 

* 쉘 스크립트 : .sh라는 파일 확장자를 가진 파일 / 리눅스에서 기본적으로 사용할 수 있는 스크립트 파일의 한 종류

* 빔 : 리눅스 환경과 같이 GUI(원도우와 같이 마우스를 사용할 수 있는 환경)가 아닌 환경에서 사용할 수 있는 편집 도구

 

 

일단 ~/app/step1에 deploy.sh 파일을 하나 생성

vim ~/app/step1/deploy.sh

그리고 다음과 같은 코드 추가

① REPOSITORY=/home/ec2-user/app/step1
 - 프로젝트 디렉토리 주소는 스크립트 내에서 자주 사용하는 값이기 때문에 이를 변수로 저장
 - 마찬가지로 PROJECT_NAME=springboot-study-pri도 동일하게 변수로 저장한다.
 - 쉘에서는 타입 없이 선언하여 저장
 - 쉘에서는 $ 변수명으로 변수를 사용할 수 있다.

② cd $REPOSITORY/$PROJECT_NAME/
 - 제일 처음 git clone 받았던 디렉토리로 이동
 - 바로 위의 쉘 변수 설명을 따라 /home/ec2-user/app/step1/springboot-study-pri 주소로 이동

③ git pull
 - 디렛토리 이동 후 , master 브랜치의 최신 내용을 받음

④ ./gradlew build
 - 프로젝트 내부의 gradlew로 build를 수행

⑤ cp ./build/libs/*.jar$REPOSITORY
 - build의 결과물인 jar 파일을 복사해 jar 파일을 모아둔 위치로 복사

⑥ CURRENT_PID=$(pgrep -f springboot-webservice)
 - 기존에 수행 중이던 스프링 부트 애플리케이션을 종료
 - pgrep은 process id만 추출하는 명령어
 - -f 옵션은 프로세스 이름으로 찾음

⑦ if ~else ~fi
 - 현재 구동 중인 프로세스가 있는지 없는지를 판단해서 기능을 수행
 - process id 값을 보고 프로세스가 있으면 해당 프로세스를 종료

⑧ JAR_NAME=$(ls -tr $REPOSITORY / | grep jar | tail -n 1)
 - 새로 실행할 jar 파일명을 찾음
 - 여러 jar 파일이 생기기 때문에 tail -n로 가장 나중의 jar 파일(최신 파일)을 변수에 저장

⑨ nohup java -jar $REPOSITORY/$JAR_NAME 2>&1 &
 - 찾은 jar 파일 명으로 해당 jar 파일을 nohup으로 실행
 - 스프링 부트의 장점으로 특별히 외장 톰캣으로 설치할 필요가 없음
 - 내장 톰캣을 사용해 jar파일만 있으면 바로 웹 애플리케이션 서버를 실행할 수 있음
 - 일반적으로 자바를 실행하라 때는 java -jar라는 명령어를 사용하지만, 이렇게 하면 사용자가 터미널 접속을 끊을 때 애플리케이션도 같이 종료됨
 - 애플리케이션 실행자가 터미널을 종료해도 애플리케이션은 계속 구동될 수 있도록 nohup 명령어를 사용

 

chmod +x ./deploy.sh

스크립트에 실행 권한 추가 및 확인

 

./deploy.sh

스크립트를 실행

위와 같은 로고가 출력되며 애플리케이션이 실행됨.

 

 

 

nohup.out파일을 열어 로그를 살펴보자

nohup.out은 실행되는 애플리케이션에서 출력되는 모든 내용을 갖고 있음

vim nohup.out

 

실행 후 nohup.out 제일 아래로 가면 ClientRegistationRepository를 찾을 수 없다는 에러가 발생한다.

 

그 이유를 다음 절에서 알아보자

 

 

 

 

출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 [이동욱 지음]