🎯 배포 & 테스트 자동화 해보자구!
이번에 CStar(퀴즈 애플리케이션 프로젝트 이름) 프로젝트는 배포까지 경험해볼 생각으로 도전했다.
그럼 배포를 해봐야겠지..?
어차피 배포할거 빠르게 배포하고, 개발을 진행하면서 지속적으로 배포하면 좋겠다고 생각했기 때문에 개발 초기단계 부터 배포 과정을 거치기로 했다.
일전에 테스트가 많아지고 PR/코드리뷰/병합을 할때마다 테스트 수동실행에 불편함을 느껴서 Github Actions를 통해 테스트 자동화를 적용시켜본 적이 있었다.
이번에도 마찬가지로 이슈/PR/코드리뷰와 함께 프로젝트를 진행하기 때문에 테스트 자동화를 진행했다.
추가적으로 배포 과정 또한 자동화를 시켜켜서, 조금은 편하게(?) 지속적으로 배포해볼 생각이다.
(배포 서버를 수동으로 접속해서,,, 수동으로 실행파일을 전송시켜주고, 수동으로 실행파일을 실행시켜야 하는,,, 일련의 무서운 작업들(..?) 익히 들어서 알고있습니다.. ㅋㅋ!!)
🎯 테스트 자동화
테스트 자동화를 위해 github flow를 작성해 주었다.
test.yml 스크립트는 아래와 같다.
name: test
on:
pull_request:
branches: [ main, develop ]
workflow_dispatch:
jobs:
test:
name: 테스트
runs-on: ubuntu-22.04
steps:
- name: 레포지토리를 체크아웃
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: JDK 21 설치
uses: actions/setup-java@v4
with:
java-version: 21
distribution: temurin
- name: 빌드 및 테스트
run: ./gradlew clean build
테스트는 main 브랜치와 develop 브랜치로 PR을 올리는 시점에 수행되도록 했다.
현재 프로젝트는 간단하게 아래의 브랜치 전략을 사용하는데, develop가 메인 개발 브랜치이기 때문에 테스트를 수행해야했고, main 브랜치또한 배포브랜치이기 때문에 테스트를 돌려볼 필요가 있다고 생각했다.
※ 추가적으로 레포지토리 체크아웃 부분의 fetch-depth 옵션은 github 코드에서 관리중인 커밋내역들이 있는데, 이걸 전부 가져올건지 몇몇 최신 커밋만 가져올건지 등을 설정하는 부분이다. 코드량이 많아지면 github actions 테스트 수행시간도 오래걸릴 수 있기 때문에 해당 속성을 필요한 정도로만 설정해도 좋을 것 같다.
❓ 테스트할 때 사용하는 데이터베이스는 어떻게 하셨어요?? 🤔🤔
일전에는 통합 테스트 환경설정을 위해 github actions에서 docker mysql을 띄우는 스크립트를 작성했었다.
하지만 이렇게 하면 github actions 스크립트도 길어지는 느낌이고, 무엇보다 개발 환경에서 로컬 mysql, 테스트 mysql을 각각 띄워줘야 한다는 불편함이 있었다.
그래서 이번에는 테스트 컨테이너라는 도구를 활용 해서 테스트할때에만 적절한 포트로 컨테이너화된 mysql을 실행시키고, 테스트가 끝났을 때에는 자동으로 컨테이너를 종료하도록 세팅하였다.
(최종적으로 MySQL과 Redis를 테스트 컨테이너로 구동시켰고, 한번 세팅한 이후로는 비교적 편하게 테스트를 실행할 수 있었다!!)
https://java.testcontainers.org/
🎯 배포 자동화
배포자동화는 아래와 같은 플로우로 간단히 구성하였습니다.
(컨테이너 다루는데에 익숙했고, 구축 방법이 간단해 개발 초기에 빠르게 구축할 수 있었기 때문)
1. 애플리케이션 jar 파일(실행파일)을 이미지화 시키고, AWS ECR이라는 이미지 저장소에 저장한다.
2. EC2에 접속해서 ECR에 있는 1번에서 저장한 이미지를 가져온다.
3. 해당 이미지를 컨테이너화 시켜서 구동한다.
이제 배포를 위해 위의 과정을 실행하기 위해 클릭하거나 터미널에 명령어를 실행해주면 되는데.. (내가..직접..?!)
이런 모든 일련의 과정들을 github actions에게 위임할 수 있다. (이것이 배포 자동화..?)
배포 자동화 도구에는 여러가지가 있지만 github actions가 지금은 가장 단순하고 배우고 적용하는것도 쉽고 자료도 많은 것 같다.
(별도의 프로그램 설치도 안해도됨 하핫..!)
배포 스크립트 더보기
먼저 아래처럼 기본적으로 코등를 옮기고, 비밀리에 관리중인 배포 application.yml도 추가해서 github actions 컴퓨터에게 전달해준다.
그리고 아래처럼 ECR에 접근해서 이미지를 푸시하고, EC2에 접근해서 ECR로부터 이미지를 받고, 컨테이너로 실행시키는 스크립트를 작성한다.
- name: AWS Resource에 접근할 수 있게 AWS credentials 설정(GitHub Actions -> ECR)
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: ECR 로그인
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Docker 이미지 생성
run: docker build -t cstar-backend-server .
- name: Docker 이미지에 Tag 붙이기(이미지 이름은 ECR 레포지토리 주소랑 일치해야함)
run: docker tag cstar-backend-server ${{ steps.login-ecr.outputs.registry }}/cstar-backend-server:latest
- name: ECR에 Docker 이미지 Push하기
run: docker push ${{ steps.login-ecr.outputs.registry }}/cstar-backend-server:latest
- 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: |
docker stop cstar-backend-container || true
docker rm cstar-backend-container || true
docker pull ${{ steps.login-ecr.outputs.registry }}/cstar-backend-server:latest
docker run -d --name cstar-backend-container -p 80:8080 ${{ steps.login-ecr.outputs.registry }}/cstar-backend-server:latest
이렇게 백엔드 애플리케이션을 배포했고, 실제로 잘 동작한다..!! 두둥
마지막으로 간단히 리액트로 작성한 프론트엔드 로직은 S3파일에, MySQL은 RDS에 배포했고,,, 그 결과는... 프로젝트 마무리 블로그에 올리겠습니다. 하하하ㅏ하
🎯 느낀점
우선은 한번 성공적으로 작성해놓은 플로우는 PR을 올리고 병합할때 발생하는 오류나 놓쳤던 부분들을 멋지게(?) 잘 잡아주었다.
실제로 github actions에서 돌아가는 테스트가 실패함으로써 놓쳤던 부분들을 발견했던 경우가 꽤 많아서 도움이 정.말. 많이 되었다.
배포 자동화도 초기에 구성을 해놨기 때문에 구현할때마다 꾸준히 배포를 진행해보면서 애플리케이션을 즐겨볼 예정이다!!
마지막으로 실제 서버를 올려보니 필요하다고 생각되는 부분이 많았다.. (ex 모니터링) 내 서버 살아있는거 맞지..?
이런부분들 잘 느끼고 학습해볼 내용으로 남겨두자
'프로젝트 > CStar' 카테고리의 다른 글
[프로젝트] Redis 를 Queue로 활용했을때 성능 & 동시성 체크해보자 (0) | 2024.09.04 |
---|---|
[프로젝트] Busy Waiting 어떻게 개선해볼 수 있을까? (0) | 2024.09.02 |
[프로젝트] 이슈 & PR 템플릿 (1) | 2024.09.01 |
[프로젝트] 퀴즈 웹 애플리케이션 테이블/아키텍처 고민하기 (2) | 2024.08.17 |
[프로젝트] 프로젝트 기획하기(CStar 퀴즈 웹 애플리케이션) (0) | 2024.08.17 |