개발자의 서재

Chapter.08-1 : AWS EC2 서버에 프로젝트를 배포해 보자(git pull, 배포 스크립트 만들기) 본문

SpringBootProject/SpringBoot_ Oauth_AWS

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 복사

깃 프로젝트 url 복사

5. git clone 실행 

git clone 복사한 주소

git clone 실행

6. 프로젝트가 정상 다운로드 되었는지 확인

프로젝트 소스 확인

7. gradlew 에 실행 권한 추가

chmod +x ./gradlew

 

8. gradlew build 와 test를 실행하여 빌드와 테스트가 정상처리 되는지 확인.

./gradlew build
./gradlew 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 

 

Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed) 오류

AWS EC2 서버에서 springboot git 프로젝트를 git clone 으로 다운받고 빌드를 실행하자 아래와 같은 오류가 발생 했다. ./gradlew build 구글링 결과 gradle 의 deamon 으로 off 하는것으로 해결이 되었다는 글..

ironmask43.tistory.com

 

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

./deploy.sh 실행 결과

4. nohup 실행 로그파일의 로그확인

tail -f nohup.out

nohup.log 파일 내용

에러가 발생해서 애플리케이션 구동이 실패한 것을 확인 할 수 있습니다. 

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

springboot application 정상 실행 메세지 확인

 

EC2 퍼블릭IP:8080 포트 접속시 페이지 정상 노출 확인

 

Comments