프로젝트 기간 : 4일
인원 : 5명
역할 분배 : CI/CD 2명 / 웹 개발 3명
담당 역할 : CI/CD
프로젝트 내용 : 기존 서버리스 기반의 서비스 - 서버 기반의 자동화 서비스 전환
프로젝트 시간이 촉박했던 만큼 WBS를 적극 활용하여 서로간에 큰 도움이 되었다.
아키텍쳐
기존 정적 웹 호스팅을 담당하던 S3를 EC2 서버로 대체하였다.
Spring,React 기반으로 만들어진 프론트,백엔드 프로젝트를 깃허브 레포지토리에 푸시하면
Git Actions를 통해 Build를 시작하고 Zip 형태로 Build한 데이터를 저장한다.
CodDeploy에서는 저장된S3의 데이터를 이용하고 설정한 EC2 인스턴스에 Docker 컨테이너 상태로 프론트 (React) 백엔드 (Spring) 서버를 실행하게 한다.
Github의 main branch에서 해당하는 레포지토리의 .github/workflows에서 .yml 파일을 생성해 주었다. ( Github Action에 해당하는 내용)
메인 브랜치에서 push 이벤트가 발생할때 GitAction을 통해 아래 내용이 동작하게 된다.
변수로 BUCKET_NAME과 CODEDEPLOY APP NAME,GROUP NAME을 설정해 주었다.
jobs에서는 우분투를 선택해 주었고 자바 17버전을 사용하였다.
여러가지 빌드,자격인증,권한,도커를 실행할 application.yml 등을 만들어주거나 설정해 주었다.
이외에 Dockerfile deploy.sh appspec.sh등 베포 과정에서 여러가지를 만들고 수정 하였다.
name: Build and Deploy Spring Boot to AWS EC2
on:
push:
branches: [ "main" ]
env:
PROJECT_NAME: zooTopic
BUCKET_NAME: tcat-spring
CODE_DEPLOY_APP_NAME: RealLastZinMakFinal
DEPLOYMENT_GROUP_NAME: RealLastZinMakFinal123
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Java JDK 17
uses: actions/setup-java@v1
with:
java-version: 17
distribution: 'temurin'
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Install Node.js and npm
run: |
sudo apt update
sudo apt install nodejs npm
shell: bash
- name: Create and start a new React app
run: |
npx create-react-app my-zootopic-front-main
ls
sudo chmod +x ./my-zootopic-front-main
shell: bash
- name: Make application.yml
- name: Grant execute permission for gradlew
run: sudo chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: |
ls -al
mkdir deploy
cp ./appspec.yml ./deploy/
cp ./Dockerfile ./deploy/
cp ./scripts/deploy.sh ./deploy/
cp ./build/libs/*.jar ./deploy/
cp ./reactDockerfile ./deploy/
cp -r ./my-zootopic-front-main ./deploy/
rm -r ./my-zootopic-front-main
sudo zip -r -qq ./spring-build.zip ./deploy
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Upload to S3
run: |
aws s3 cp \
--region ap-northeast-2 \
./spring-build.zip s3://tcat-spring
- name: Code Deploy
run: |
aws deploy create-deployment --application-name RealLastZinMakFinal \
--deployment-config-name CodeDeployDefault.OneAtATime \
--deployment-group-name RealLastZinMakFinal123 \
--s3-location bucket=tcat-spring,bundleType=zip,key=spring-build.zip
깃 액션, CodeDeploy의 과정이 성공적으로 수행되어 도커는 서버를 컨테이너로 띄운것 까지 확인 할수 있었다.
4일이라는 짧은 시간동안 이번 프로젝트를 진행하며 많은 트러블 슈팅을 경험하였다.
Trouble Shooting
-- 스프링 버전 이슈 - 프론트 팀원과 사전 협의 이후 진행 했음에도 GitAction에서 오류가 발생하여
자바 JDK 개발 키트 버전 변경으로 해결하였다.
-- 각종 yml 이슈 -- React에 대한 지식이 없는 상태로 진행하여 Spring 백엔드와 Rest Api를 통한 통신과 배포 자동화까지 여러가지 시행 착오를 겪었다.
-- Code Deploy 이슈 -- 대부분이 정확하지 않은 경로 설정에 대한 이슈였다.
-- Git Action 이슈 -- S3와 Code Deploy 그리고 자격증명 Build Gradle에서 이슈가 발생 했었다.
S3와 Code Deploy의 경우는 GitAction으로 실행하는 main.yml 변수 설정을 통해 해결하였다.
자격증명의 경우 해당Git 레포지토리의 Secrets and variables Actions
에서 Repository secrets을 설정해 이곳에서 참조하도록 설정해 해결 하였다.
-- 촉박한 시간 이슈
Blue Green 베포방식을 사용하여 무중단 베포를 구상하였으나
Docker Compose 파일 작성
docker-compose.blue.yml,docker-compose.green.yml, deploy.sh 수정을 시간 내에 맞추지 못할것 같아 과감하게 제외하였다.