첫 번째는 Frontend 개발자가 작업할 때, Endpoint에 쉽게 접근할 수 있어야 했고, 두 번째는 Backend 개발자가 편리하게 코드를 build, 배포할 수 있어야 했다.
새로운 기술에 도전해보고 싶었던 내가 이 부분을 맡아 개발하게 되었다.
⭕ 해결 과정
CI/CD와 Server 배포는 다음과 같은 단계를 통해 완성되었다.
Back-End Framework인 Spring boot에서 기능 개발 후, GitHub Repository로 Push!
Push 요청이 실행되면 자동으로 Workflows 설정에 따라 GitHub Actions 실행
Workflows 1단계 : Project File build → Zip File 생성
Workflows 2단계 : 생성된 Zip File을 AWS S3 저장소에 업로드
Workflows 3단계 : AWS CodeDeploy에 배포 요청
Workflows 4단계 : CodeDeploy에서 S3에 있는 Zip File을 EC2에 배포
EC2 인스턴스 주소를 통해 Back-End Server에 접속 가능
1. 먼저, Server를 배포할 서비스인 AWS EC2 인스턴스를 생성해준다.
2. Back-End 개발자가 개발 완료 후, 팀 GitHub에 push를 한다.
3. 팀 GitHub의 Workflow에 적힌 순서에 따라 GitHub Actions가 CI/CD를 실행시킨다.
✍ WorkFlow File은 다음과 같이 작성하였다. 이 파일에는 자동 Build, Deploy를 위한 내용들이 적혀있다.
Steps 1. actions/checkout :Repository의 소스 코드를 GitHub Actions로 가져온다. Steps 2. actions/setup-java :Project Build를 위해 JDK를 설치한다. Steps 3. chmod +x ./gradlew :Build 하기 위해 권한을 부여한다. Steps 4. ./gradlew clean build :Build를 진행한다. Steps 5. zip -qq -r :Build한 file을 zip file로 압축한다. Steps 6. AWS credential :AWS의 S3, CodeDeploy, EC2 서비스를 이용하기 위한 인증키를 등록한다. Steps 7. Upload to S3 :S3에 압축한 zip file을 Upload 한다. Steps 8. chmod +x scripts/deploy.sh :deploy.sh file을 실행할 수 있는 권한을 부여한다. Steps 9. aws deploy create-deployment :S3에서 zip file을 찾아 새로운 배포를 수행한다.
4. Work Flow 순서에 따라, GitHub Actions는 JAVA Project를 Build 하기 위해 JDK를 설치한다.
5. 그리고 Build를 실행하여 Zip File을 생성한다.
6. AWS를 사용하여 배포를 진행할 것이기 때문에 AWS 인증 정보를 등록한다.
7. 인증 후, Build한 Zip File을 AWS S3에 업로드한다.
(S3는 정적 파일을 배포해주는 AWS 서비스이다.)
8. AWS Code Deploy를 통해 자동 배포를 하기 위하여 Github에 Script File을 작성해준다.
👉deploy.sh File
파일의 내용은 이전에 배포한 Project의 Process를 종료 시키고, Build 후 생성된 jar File을 nohup(백 그라운드)로 실행시킨다는 내용이다.
9. GitHub Actions에서 배포 Script 파일을 실행시켜 EC2 인스턴스에 최종 배포한다.
⭕ 실제 PUSH 후, Workflows를 따라 CI/CD가 이루어지는 모습
⭐ EC2에 실제 배포 확인
Ubuntu를 접속해보면 CI/CD한 jar file이 정상적으로 실행되고 있는 것을 확인할 수 있다.
Postman을 사용하여 Backend 배포 주소에 접속하면 정상적으로 통신이 되는 것을 확인할 수 있다.
🔆 성과
개발 시작 전 미리 구축해 놓은 CI/CD 덕분에 Back-End 팀은 수정 사항이 있을 시, 아주 빠르게 Deploy 할 수 있었고, Front-End 팀은 Update된 Server를 즉시 사용할 수 있어서 Project 진행 속도가 빨라졌다.
그리고 최근 개발한 기능을 실제 배포된 Server를 통해 바로 확인할 수 있어서 Project의 성취감도 늘어났다.