1️⃣ Sping Boot 프로젝트 세팅 및 간단한 코드를 작성한다
2️⃣ Github에 프로젝트를 올린다
3️⃣ EC2에 들어가서 기본 환경 구성
✅ EC2 구성하기
✅ 보안그룹 8080번 포트 열기
✅ JDK 설치
✅ Git clone을 활용하여 프로젝트 다운받기
✅ EC2에서 clone 받은 서버가 잘 작동하는지 확인하기
$ cd {프로젝트 경로}
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar &
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
4️⃣ 실제 코드가 업데이트 될 때 어떤 과정을 거쳐서 배포하는지 짚어보기
✅ 내 로컬 컴퓨터에 새로운 코드 작성 -> Commit 찍은 뒤 Github push -> EC2에 들어가서 Git Pull 받기 -> 빌드 후 재배포하기
빌드 후 재배포 하는 코드
$ sudo lsof -i:8080 # 8080번 포트에 Spring Boot가 실행되고 있는 지 확인
$ sudo fuser -k -n tcp 8080 # 8080번 포트에 실행되고 있는 프로세스 종료
$ ./gradlew clean build
$ cd build/libs
$ nohup java -jar ________.jar &
5️⃣ 매번 Github 계정과 비밀번호를 치는 과정 없애기 (생략가능)
$ git config --global credential.helper store
$ git pull origin main
# Github 계정 및 비밀번호 입력
$ git pull origin main # 더 이상 비밀번호를 안 묻는 걸 확인할 수 있다.
위 과정을 진행하면, ~/.git-credentials
에 로그인 정보를 저장해둠으로써 EC2에 접근할 수 있는 모든 사용자가 내 계정 정보를 확인할 수 있게된다.
6️⃣ 지금까지 했던 코드 배포 과정 자동화하기
✅ .github/workflows/deploy.yml 작성하기
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_stop: true
script: |
cd /home/ubuntu/instagram-server
git pull origin main
./gradlew clean build
sudo fuser -k -n tcp 8080 || true
nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 &
appleboy/ssh-action
의 공식 문서✅ Github에 Secret값 넣어주기
✅ Github에 Push해서 Github Actions 잘 작동하는지 확인하기
✅ 실제 서버로 접속해서 잘 작동하는지 확인하기
7️⃣ application.yml
파일 넣는 과정 자동화시키기
✅ 현업 프로젝트에서는 민감한 값을 보관하기위해 application.yml 로 분리하는 경우가 많다
✅ 배포할 때 application.yml를 따로 넣는 과정을 자동화 해보자
.gitignore에 application.yml 추가
-> application.yml 파일 생성
-> Github에 resources 폴더가 push 되도록 임의의 파일 하나 만들어주기
-> Github Actions 코드 수정하기
-> Github에 Secret 값 넣어주기
-> 실제 EC2에 application.yml 파일도 같이 배포 잘 됐는지 체크하기
8️⃣ ⭐️테스트 코드 실패하면 CI/CD 과정일 실패하는 지 확인하기⭐️
✅ ./gradlew clean build
의 과정에서 테스트 코드 실행 과정이 포함되어있다
✅ 이때 CI/CD 과정에서 테스트 실패시 자동 배포가 진행되지 않고 중단되는지 확인해야한다