현대오토에버 모빌리티 SW 스쿨 웹/앱 SpringBoot 프로젝트 AWS EC2 배포하기3
현대오토에버 모빌리티 SW 스쿨 웹/앱 SpringBoot 프로젝트 AWS EC2 배포하기2
저번 aws EC2 배포 글에서는 스프링부트 서버와 연결하는 과정까지 진행했다. 이번에는 mysql과 연결해 보는 과정을 진행하려 한다. 현대오토에버 모빌리티 sw 스쿨 웹/앱 SpringBoot 프로젝트 AWS EC2
jxxng-syykk.tistory.com
이전에 스프링부트 서버와 mysql을 연결하는 것까지 진행했었다. 이번에는 github actions를 통해 EC2 서버에 코드를 배포하고 애플리케이션을 실행하는 과정을 자동화해보려 한다.
- aws실행 및 인스턴스 생성 후 연결
sudo passwd
su <- sudo로 로그인
##############################################
파일공간확인
df -h
스왑 파일은 4GB(128MB x 32)
sudo dd if=/dev/zero of=/home/swapfile bs=128M count=32
❤️ ##스왑 파일은 2GB(128MB x 16)
sudo dd if=/dev/zero of=/home/swapfile bs=128M count=16
스왑 파일의 읽기 및 쓰기 권한을 업데이트cd $
cd ..
chmod 600 swapfile
Linux 스왑 영역을 설정$
mkswap swapfile
스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록$
sudo swapon swapfile
프로시저가 성공적인지 확인$
sudo swapon -s/etc/fstab
free -h 확인
total used free shared buff/cache available
Mem: 957Mi 364Mi 183Mi 892Ki 572Mi 593Mi
Swap: 2.0Gi 0B 2.0Gi
###################################
파일을 편집하여 부팅 시 스왑 파일을 시작$
sudo vi /etc/fstab
파일 끝에 다음 줄을 새로 추가하고 파일을 저장한 다음 종료/
swapfile swap swap defaults 0 0
##############################################
$ sudo apt update
$ sudo apt install openjdk-17-jdk -y
$ java -version # 잘 설치됐는 지 확인
##############################################
date //시간확인
sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
##########################
sudo apt install mysql-server
sudo mysql -u root -p
show databases;
create database hanyong5;
use mysql
alter user 'root'@'localhost' identified with mysql_native_password by '1234';
FLUSH PRIVILEGES;
exit
##############################################
$ git clone {git repository clone 주소}
##############################################
$ cd {프로젝트 경로}
$ ./gradlew clean build
$ ./gradlew bootwar
$ chmod +x gradlew
$ cd build/libs
$ nohup java -jar ________.war & cd
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
##############################################
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
$ sudo fuser -k -n tcp 8080 # 8080번 포트에 실행되고 있는 프로세스 종료
일단 인스턴스를 생성하고 이전과 똑같은 과정을 거쳐준다.
스왑 공간에 스왑 파일 생성하고 mysql설치 및 설정, java설치 그리고 git clone을 진행 후 배포를 진행한다.
처음에는 전체 파일이 저장되어 있는 폴더에서 github actions를 진행했을 때 계속 오류가 났다. 그래서 배포할 프로젝트의 폴더 안에 있는 파일들을 따로 빼고 거기서. github > workflows를 만들어 진행을 했다.
name: Deploy To EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: SSH로 EC2에 접속하기
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
cd /home/ubuntu/2024deploy
git config --global --add safe.directory /home/ubuntu/2024deploy
sudo git pull origin main
sudo ./gradlew bootwar
sudo fuser -k -n tcp 8080
nohup java -jar build/libs/*SNAPSHOT.war > /dev/null 2>&1 &
그리고. yml파일을 위와 같이 적어주었다.
appleboy/ssh-action이라는 GitHub Actions 플러그인을 사용해 SSH를 통해 EC2 서버에 접속한다. 이 플러그인은 EC2 서버에 명령을 전달하는 데 사용된다.
- SSH 접속에 필요한 정보
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
위 정보들은 다음 사진처럼 깃허브 settings에서 secrets and variables의 actions에서 설정할 수 있다.
EC2_HOST → ip주소
EC2_USERNAME → ubuntu
EC2_PRIVATE_KEY → 키페어 생성 후 복붙 (키페어 생성 후 보관해놔야 함)
- 배포 스크립트
script: |
cd /home/ubuntu/2024deploy
git config --global --add safe.directory /home/ubuntu/2024deploy
sudo git pull origin main
sudo ./gradlew bootwar
sudo fuser -k -n tcp 8080
nohup java -jar build/libs/*SNAPSHOT.war > /dev/null 2>&1 &
먼저 서버에서 배포할 프로젝트가 있는 디렉터리로 이동 후 git안전 디렉터리 설정을 진행해 준다. main브랜치에서 pull을 진행하고. war파일로 빌드를 진행한다. 혹시라도 8080 포트를 사용하고 있으면 종료하고 백그라운드로 패키징 된. war파일을 실핸한다.
위 설정을 해줌으로써 EC2 서버에 코드를 배포하고 애플리케이션을 실행하는 과정을 자동화할 수 있다.
기존의 코드에서는 /foods 요청을 통해 모든 리스트들을 확인할 수 있었다.
코드를 변경하고 commit & push를 진행한다. 위 설정을 통해 변경되 코드를 배포하고 실행시키는 과정을 자동화시켰기 때문에 바로 변경된 코드의 결과를 확인할 수 있다.
push 할 때마다 커밋 메시지를 제목으로 workflow들이 github actions에 생성되는 모습을 확인할 수 있다.
/foods -> /foodview로 변경했기 때문에 기존의 foods에서는 오류가 나고 foodview를 통해 확인할 수 있다.
- 마무리
이전에 직접했던 모든 과정을 github actions를 통해 자동화시켰기 때문에 훨씬 편하게 배포를 진행할 수 있게 되었다.