백엔드/AWS

[AWS] EC2를 이용한 서버 구축 5 (Git과 배포 스크립트를 통한 프로젝트 배포)

mike705114 2024. 7. 6. 21:03

저번 시간에는 파일질라를 통해 프로젝트 파일을 수동으로 빌드하여 배포를 해보았습니다.

 

이번에는 깃허브 ssh url을 통해 더욱 쉽게 배포를 해보겠습니다!

 

AWS에 접속

먼저 AWS에 접속하여 줍니다.

$ ssh -i [pem 키페어 주소] ubuntu@[탄력적 ip 주소]

 

SSH Key 생성

.ssh 디렉토리로 이동합니다

$ cd ~/.ssh

 

이제 키페어를 ssh key를 생성해봅시다!

$ ssh-keygen -t rsa -C [깃허브 계정 이메일]

 

SSH Key Git 연동

생성된 ssh key를 깃허브에 추가해줍니다.

 

$ cat id_rsa.pub

 

먼저  cat id_rsa.pub를 치게되면

 

이렇게 ssh-rsa ~~~~~ 깃허브 메일 주소가 나오는데 이걸 복사 해줍니다

 

※ 참고로 git bash에서 복사는 Ctrl + Insert, 붙여넣기는 Shift + Insert 입니다.

 

https://github.com/settings

 

GitHub: Let’s build from here

GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and fea...

github.com

 

Github 로그인 -> Settings -> SSH and GPG keys를 클릭합니다.

 

New SSH key를 클릭한 후에 아까 생성하고 복사해 뒀던 SSH Key를 넣어주시면 됩니다! 

 

Git Clone

자 이제 SSH Key도 다 입력을 완료했으니 깃허브를 통해 프로젝트를 EC2에 clone 해봅시다~

 

 

복사하고 싶은 프로젝트에 SSH탭에서 나온 주소를 복사합니다!

 

그후 git bash로 돌아와서 clone하고싶은 디렉토리로 이동 후에

 $ git clone [복사한 SSH 주소]

 

이렇게 추가가 된 것을 알 수 있습니다.

 

  • 먼저 프로젝트에 맞는 자바 버전이 적용 되었는지 확인을 합니다!
  • clone된 프로젝트에 들어갑니다! 
$ cd [프로젝트명]
  • build를 합니다
$ ./gradlew build

여기서 permission denied라고 뜨면 당황하지 마세요!!!!

gradlew를 실행할 수 있는 권한이 없기 때문입니다.

$ chmod +x gradlew

 

다시 ./gradlew build를 하면 성공!

 

 

빌드가 완료되면 build/libs 디렉토리가 생성되고

프로젝트명-0.0.1-SNAPSHOT.jar 파일이 생성 되는 것을 알 수 있습니다.

java -jar [파일명].jar

 

배포 스크립트 만들기

 

배포 스크립트를 왜 만들까요???

 

만약 프로젝트에 변경사항을 서버에 적용하고 싶을 때 배포 스크립트를 쓰지 않으면

아래 명령어들을 일일히 번거롭게 쳐야 합니다!

 

git pull -> build 시작 -> build 디렉토리 이동 -> build 파일 복사 -> 실행 중인 pid 확인 -> 있으면 종료

-> 변경한 프로젝트 배포...

 

하지만 이 명령어들을 스크립트로 만들어서 ./depoly.sh를 실행하게되면 간단하게 변경사항을 적용할 수 있습니다!!!!

 

자 먼저 변경사항이 있는 프로젝트에 들어갑니다!

※ 깃에 변경사항이 push가 되어있어야 합니다.

 

$ nano ./deploy.sh

deploy.sh라는 쉘 스크립트를 만듭니다.

 

아래 REPOSITORY와 PROJECT_NAME에 본인의 파일 경로와, 프로젝트 이름을 입력해줍니다!

#!/bin/bash

REPOSITORY=/home/ubuntu
PROJECT_NAME=thymeleaf-basic

cd $REPOSITORY/$PROJECT_NAME

echo "> Git Pull"
git pull

echo "> 프로젝트 Build 시작"
./gradlew clean build

echo "> step1 디렉토리 이동"
cd $REPOSITORY

echo "> Build 파일 복사"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/

echo "> 현재 구동적인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f ${PROJECT_NAME}.*.jar)

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 &

 

작성 완료하고 나오면 deploy.sh 파일이 생기는 것을 알 수 있습니다.

 

$ ./deploy.sh

 

자 이제 스크립트르 실행하면 ~~~ 에러가 뜹니다!!! :(

당황하지 말고 아까 gradlew 실행권한을 부여한 것처럼 실행 권한을 추가해줍니다!

$ chmod +x ./deploy.sh

 

 

그 다음 다시 실행 해보면...

 

기존에 실행되던 서버를 죽이고, 깃으로부터 PULL해온 변경사항을 추가한 JAR파일을 새로 배포됩니다.

 

아래 사진을 보시면 수정된 코드가 배포 된 것을 알 수 있습니다

 

참고

https://velog.io/@leeeeeyeon/EC2-%EC%84%9C%EB%B2%84%EC%97%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%B0%B0%ED%8F%AC%ED%95%B4-%EB%B3%B4%EC%9E%90

 

다음 포스팅에서는 디비연결을 해볼게요 그럼 이만!!!