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로 혼자 구현하는 웹 서비스 [이동욱 지음]
'Back-End > Springboot와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
Chapter 09. 코드가 푸시되면 자동으로 배포해 보자 - Travis CI 배포 자동화 (1) (0) | 2022.04.29 |
---|---|
Chapter 08. EC2 서버에 프로젝트를 배포해 보자 (3) (0) | 2022.04.29 |
Chapter 08. EC2 서버에 프로젝트를 배포해 보자 (1) (0) | 2022.04.03 |
Chapter 07. AWS에 데이터베이스 환경을 만들어보자 - AWS RDS (3) (0) | 2022.04.03 |
Chapter 07. AWS에 데이터베이스 환경을 만들어보자 - AWS RDS (2) (0) | 2022.04.02 |