Skip to content

Merge pull request #2 from Const-Project/feature/init-project-structure #1

Merge pull request #2 from Const-Project/feature/init-project-structure

Merge pull request #2 from Const-Project/feature/init-project-structure #1

Workflow file for this run

# 워크플로우의 이름
name: Spring Boot CI/CD with AWS
# 워크플로우가 실행될 조건 정의
on:
push:
branches: [ develop ] # develop 브랜치에 push 이벤트가 발생했을 때 실행
# OIDC 토큰 요청을 위한 권한 설정 (필수)
permissions:
id-token: write
contents: read
jobs:
# 'build-and-deploy' 라는 이름의 작업 정의
build-and-deploy:
# 이 작업은 GitHub가 제공하는 최신 Ubuntu 가상머신에서 실행
runs-on: ubuntu-latest
# 작업 내에서 실행될 단계들
steps:
# 1. 소스 코드 체크아웃
- name: Checkout Source Code
uses: actions/checkout@v4
# 2. JDK 17 설치 (Corretto 배포판 사용)
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'corretto'
# 3. Gradle 실행 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# 4. Gradle로 빌드 및 단위 테스트 실행
# 'build' 명령어는 'test' 작업을 포함하므로, 단위 테스트가 자동으로 실행됩니다.
- name: Build with Gradle
run: ./gradlew build
# 5. AWS 자격 증명 설정 (OIDC 방식)
- name: Configure AWS credentials using OIDC
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: ${{ secrets.AWS_REGION }}
# 6. Amazon ECR에 로그인
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
# 7. Docker 이미지 빌드, 태깅, ECR에 푸시
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: cp_main_be # 1단계에서 생성한 ECR 리포지토리 이름
IMAGE_TAG: ${{ github.sha }} # Git 커밋 해시를 이미지 태그로 사용하여 버전을 관리
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
docker push --all-tags $ECR_REGISTRY/$ECR_REPOSITORY
# 8. EC2에 접속하여 배포 스크립트 실행
- name: Deploy to EC2 instance
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# 1. 배포 서버에서 최신 버전의 'latest' 태그 이미지를 pull
docker pull ${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:latest
# 2. 기존에 실행 중인 컨테이너가 있다면 중지하고 삭제 (무중단 배포를 위해서는 blue-green 전략 등이 필요)
if [ $(docker ps -a -q -f name=spring-app-container) ]; then
docker stop spring-app-container
docker rm spring-app-container
fi
# 3. 새 컨테이너를 실행
# (중요!) 아래의 DB 관련 환경변수들은 EC2 서버에 미리 설정되어 있어야 합니다. (예: /etc/environment 파일)
docker run -d --name spring-app-container -p 80:8080 \
-e DB_URL=$DB_URL \
-e DB_USERNAME=$DB_USERNAME \
-e DB_PASSWORD=$DB_PASSWORD \
-e SPRING_PROFILES_ACTIVE=prod \
${{ steps.login-ecr.outputs.registry }}/${{ env.ECR_REPOSITORY }}:latest