개발자의 서재
Chapter.08-1 : AWS EC2 서버에 프로젝트를 배포해 보자(git pull, 배포 스크립트 만들기) 본문
Chapter.08-1 : AWS EC2 서버에 프로젝트를 배포해 보자(git pull, 배포 스크립트 만들기)
ironmask431 2022. 2. 27. 19:36
"스프링부트와 AWS로 혼자 구현하는 웹 서비스" 라는 책을 바탕으로 학습목적의 프로젝트를 진행하고 있습니다.
소스 : https://github.com/ironmask431/springboot_aws_01
apter.08 : EC2 서버에 프로젝트를 배포해 보자
8.1 EC2에 프로젝트 Clone 받기
1.EC2에 깃 설치
sudo yum install git
2.설치 후 확인
git --version
3. git clone 으로 프로젝트를 저장할 디렉토리 생성, 이동
mkdir /app
cd app
mkdir /step1
cd step1
4. 깃허브에서 프로젝트의 https url 복사
5. git clone 실행
git clone 복사한 주소
6. 프로젝트가 정상 다운로드 되었는지 확인
7. gradlew 에 실행 권한 추가
chmod +x ./gradlew
8. gradlew build 와 test를 실행하여 빌드와 테스트가 정상처리 되는지 확인.
./gradlew build
./gradlew test
- gradlew build 와 test 시
"Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)"
오류가 발생하여 아래 방법으로 해결함.
https://ironmask43.tistory.com/23
8.2 배포 스크립트 만들기
작성한 코드를 실제 서버에 반영하는 것을 배포라고 합니다.
배포는 다음의 과정을 모두 포괄하는 의미 입니다.
- git clone 또는 git pull 을 통해 새 버전의 프로젝트를 받음.
- Gradle 이나 Maven을 통해 프로젝트 테스트와 빌드
- EC2서버에서 해당 프로젝트 실행 및 재실행
배포 마다 하나하나 명령어를 실행하는 것을 불편하므로, 이를 쉘스크립트로 작성해
스크립트 하나만 실행하면 위의 과정이 차례대로 진행되도록 하겠습니다.
1. /app/step1 경로에 deploy.sh 파일 생성
vim ~/app/step1/deploy.sh
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step1
PROJECT_NAME=springboot_aws_01
cd $REPOSITORY/$PROJECT_NAME/
echo "> git pull"
git pull
echo "> 프로젝트 build 시작"
./gradlew build
echo "> step1 디렉토리로 이동"
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 $REPOSITORY/$JAR_NAME 2>&1 &
* REPOSITORY=/home/ec2-user/app/step1
프로젝트 경로를 변수로 별도 저장함.
쉘에서는 $변수명으로 사용 할 수 있음.
* cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
build 후 결과물인 build/libs/ 폴더의 jar파일을 $REPOSITORY 경로로 복사함.
* CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)
현재 구동중인 스프링부트 애플리케이션의 pid를 확인
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 파일을 nohup 으로 실행함.
스프링부트의 장점으로 특별히 외장 톰캣을 설치 할 필요없음.
jar 파일만 있으면 바로 웹애플리케이션 서버를 실행할 수 있다.
java -jar 명령어로 자바프로그램을 실행 할 수도있지만, 그런 경우 터미널을 종료하면 프로그램도 종료됨.
nohup 명령어를 앞에 사용하면 사용자가 터미널을 종료해도 프로그램 실행이 게속 유지됨.
2. 생성한 스크립트 파일에 실행권한 추가
chmod +x ./deploy.sh
3. 쉘스크립트 실행
./deploy.sh
4. nohup 실행 로그파일의 로그확인
tail -f nohup.out
에러가 발생해서 애플리케이션 구동이 실패한 것을 확인 할 수 있습니다.
8.3 외부 Security 파일 등록하기
실패한 이유는 OAuth2 소셜로그인을 하기위한 ClientRegistrationRepository 를 생성하려면 clientId 와 clientSecret
가 필수인데, 로컬 pc에서 구동할때는 application-oauth.properties 파일이 있어서 문제가 없었지만,
이 파일은 .gitignore 로 git push 제외 대상이라 깃허브에는 해당 파일이 없기때문입니다.
해당파일은 보안문제로 git 에 올릴 수 없기 때문에 서버에 별도로 이 파일을 생성하여 가지고 있도록 하겠습니다.
1. app/ 경로로 이동하여 application-oauth.properties 생성
(내용은 로컬pc의 application-oauth.properties 내용을 그대로 복사)
vim application-oauth.properties
2. deploy.sh 수정
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,/home/ec2-user/app/application-oauth.properties \
$REPOSITORY/$JAR_NAME 2>&1 &
* Dspring.config.location
스프링 설정 파일 위치를 지정합니다.
기본옵션을 담고 있는 application.properties 와 OAuth 설정을 담고 있는 application-oauth.properties 의
위치를 지정합니다.
classpath:/ 는 jar 안에 있는 resources 폴더 경로를 의미합니다.
application-oauth.properties 는 jar 외부에 있기때문에 절대경로로 표시합니다.
("\" 는 쉘스크립트 안에서 한문장을 2줄이상으로 표현할때 마지막에 줄바꿈용으로 사용,
위치를 잘못쓰면 no such file or directory 등의 오류발생.. )
3. 수정 후 deploy.sh 재실행, 로그확인
./deploy.sh
tail -f nohup.log
'SpringBootProject > SpringBoot_ Oauth_AWS' 카테고리의 다른 글
Chapter.09 : 게시판 기능 보완하기 (0) | 2022.03.04 |
---|---|
Chapter.08-2 : AWS EC2 서버에 프로젝트를 배포해 보자(RDS DB와 연결, 소셜로그인 도메인정보 수정) (0) | 2022.03.01 |
Chapter.07 : AWS에 DB환경을 만들어보자 - AWS RDS (0) | 2022.02.25 |
Chapter.06 : AWS 서버 환경을 만들어보자 - AWS EC2 (0) | 2022.02.19 |
Chapter.05-2 : 스프링 시큐리티와 OAuth 2.0 으로 로그인 구현하기(코드 개선 + 테스트) (0) | 2022.02.18 |