졸업 프로젝트 시작에 앞서, ci/cd 설정을 하였다.

Spring Boot 코드 작성
↓
GitHub Actions가 빌드
↓
Docker 이미지 생성
↓
Docker Hub에 업로드
↓
EC2에서 최신 이미지 pull
↓
EC2 안에서 컨테이너 실행
↓
사용자가 서버 접속
Amazon Elastic Compute Cloud
안전하고 크기 조정이 가능한 컴퓨팅 파워를 클라우드에서 제공하는 웹서비스
=> 컴퓨팅을 빌려쓰는 서비스
전 세계 어디서나 가용 영역에서 인스턴스를 시작할 수 있음
EC2는 인스턴스, EBS, AMI, 보안그룹으로 구성된다.


앞서 생성한 EC2에 연결하여 rds 생성
보통 프로젝트에서 Docker를 쓰는 이유는 다음과 같다
docker run 한 줄로 어디서든 같은 환경에서 애플리케이션 실행 가능FROM eclipse-temurin:21-jdk
WORKDIR /app
COPY build/libs/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
version: "3.8"
services:
app:
image: ${DOCKERHUB_USERNAME}/git-turl-backend:latest
ports:
- "8080:8080"
environment:
DB_URL: ${DB_URL}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
JWT_SECRET: ${JWT_SECRET}
restart: always
환경변수 설정

.github/workflows/deploy.yml
name: Spring Boot Docker CI/CD
on:
push:
branches: [ "main", "develop" ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 코드 가져오기
uses: actions/checkout@v4
- name: JDK 21 설치
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Gradle 실행 권한 부여
run: chmod +x ./gradlew
- name: Spring Boot jar 빌드
run: ./gradlew clean bootJar -x test
- name: Docker Hub 로그인
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker 이미지 빌드 및 Push
run: |
docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/git-turl-backend:latest .
docker push ${{ secrets.DOCKERHUB_USERNAME }}/git-turl-backend:latest
- name: EC2 서버에서 .env 생성 + 최신 이미지 배포
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
mkdir -p ~/app
cat > ~/app/.env <<EOF
DB_URL=${{ secrets.DB_URL }}
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
JWT_SECRET=${{ secrets.JWT_SECRET }}
DOCKERHUB_USERNAME=${{ secrets.DOCKERHUB_USERNAME }}
EOF
cd ~/app
if docker compose version > /dev/null 2>&1; then
docker compose --env-file .env pull
docker compose --env-file .env down
docker compose --env-file .env up -d
else
docker-compose --env-file .env pull
docker-compose --env-file .env down
docker-compose --env-file .env up -d
fi
docker image prune -f
배포 경로로 스웨거가 실행된다
