Merge pull request #4 from Const-Project/feature/ci-cd-modify #6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 워크플로우의 이름 | |
| 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: | | |
| # 하드코딩된 값으로 테스트 | |
| ECR_REGISTRY="${{ steps.login-ecr.outputs.registry }}" | |
| ECR_REPOSITORY="cp_main_be" | |
| AWS_REGION="${{ secrets.AWS_REGION }}" | |
| echo "ECR_REGISTRY: $ECR_REGISTRY" | |
| echo "ECR_REPOSITORY: $ECR_REPOSITORY" | |
| echo "AWS_REGION: $AWS_REGION" | |
| # AWS CLI 설정 | |
| aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY | |
| # 1. 이미지 pull | |
| docker pull $ECR_REGISTRY/$ECR_REPOSITORY:latest | |
| # 2. 기존 컨테이너 정리 | |
| if [ $(docker ps -a -q -f name=spring-app-container) ]; then | |
| docker stop spring-app-container | |
| docker rm spring-app-container | |
| fi | |
| # 환경변수 로드 | |
| source /etc/environment | |
| # 3. 새 컨테이너 실행 | |
| 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 \ | |
| -e R2_ENDPOINT="${{ secrets.R2_ENDPOINT }}" \ | |
| -e R2_BUCKET="${{ secrets.R2_BUCKET }}" \ | |
| -e R2_ACCESS_KEY="${{ secrets.R2_ACCESS_KEY }}" \ | |
| -e R2_SECRET_KEY="${{ secrets.R2_SECRET_KEY }}" \ | |
| $ECR_REGISTRY/$ECR_REPOSITORY:latest |