feat: 상품 좋아요 및 좋아요 취소 기능 구현 #50
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: Java CI/CD with Gradle & Docker | |
| on: | |
| push: | |
| branches: [ "prod" ] | |
| pull_request: | |
| branches: [ "prod" ] | |
| workflow_dispatch: | |
| permissions: | |
| contents: write # Docker 이미지 푸시 및 배포 시 사용 | |
| jobs: | |
| CI-CD: | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| working-directory: ./ | |
| steps: | |
| # 1) 소스 체크아웃 | |
| - uses: actions/checkout@v4 | |
| # 2) JDK 17 세팅 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'corretto' | |
| # 3) Gradle 캐싱 | |
| - name: Gradle Caching | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| ${{ runner.os }}-gradle- | |
| # 4) Gradle 빌드 | |
| - name: Build with Gradle | |
| run: ./gradlew build -DPROD_SERVER_URL=${{ secrets.PROD_SERVER_URL }} -Pspring.profiles.active=prod | |
| # 5) QEMU & Buildx 세팅 (멀티 아키텍처 빌드용) | |
| - name: Set up QEMU | |
| uses: docker/setup-qemu-action@v3 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| # 6) Docker Hub 로그인 | |
| - name: Docker Login | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| # 7) 멀티‑아키텍처 이미지 빌드 & 푸시 | |
| - name: Build & Push (amd64 + arm64) | |
| if: github.ref == 'refs/heads/prod' | |
| run: | | |
| docker buildx build \ | |
| --platform linux/amd64,linux/arm64 \ | |
| -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest \ | |
| --push . | |
| # 8) EC2 배포 | |
| - name: Deploy to prod | |
| uses: appleboy/[email protected] | |
| id: deploy-prod | |
| if: contains(github.ref, 'prod') | |
| with: | |
| host: ${{ secrets.PROD_EC2_HOST }} | |
| username: ${{ secrets.EC2_USERNAME }} | |
| key: ${{ secrets.EC2_PRIVATE_KEY }} | |
| script: | | |
| sudo docker stop ${{ secrets.DOCKER_REPOSITORY }} || true | |
| sudo docker rm ${{ secrets.DOCKER_REPOSITORY }} || true | |
| sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest | |
| sudo docker run -d -p 8080:8080 \ | |
| -e SPRING_PROFILES_ACTIVE=prod \ | |
| -e DB_HOST=${{ secrets.DB_HOST }} \ | |
| -e DB_NAME=${{ secrets.DB_NAME }} \ | |
| -e DB_PORT=${{ secrets.DB_PORT }} \ | |
| -e DB_USERNAME=${{ secrets.DB_USERNAME }} \ | |
| -e DB_PASSWORD=${{ secrets.DB_PASSWORD }} \ | |
| -e REDIS_HOST=${{ secrets.REDIS_HOST }} \ | |
| -e REDIS_PORT=${{ secrets.REDIS_PORT }} \ | |
| -e REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }} \ | |
| -e KAKAO_AUTH_URL=${{ secrets.KAKAO_AUTH_URL }} \ | |
| -e KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }} \ | |
| -e SERVER_URL=${{ secrets.PROD_SERVER_URL }} \ | |
| -e MONGODB_USERNAME=${{ secrets.MONGODB_USERNAME }} \ | |
| -e MONGODB_PASSWORD=${{ secrets.MONGODB_PASSWORD }} \ | |
| -e MONGODB_HOST=${{ secrets.MONGODB_HOST }} \ | |
| -e MONGODB_PORT=${{ secrets.MONGODB_PORT }} \ | |
| -e MONGODB_DATABASE=${{ secrets.MONGODB_DATABASE }} \ | |
| -e MONGODB_AUTH_SOURCE=${{ secrets.MONGODB_AUTH_SOURCE }} \ | |
| -e KAFKA_HOST=${{ secrets.KAFKA_HOST }} \ | |
| -e AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }} \ | |
| -e AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} \ | |
| -e AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }} \ | |
| -e AWS_REGION=${{ secrets.AWS_REGION }} \ | |
| -e GEMINI_API_KEY=${{ secrets.GEMINI_API_KEY }} \ | |
| --name ${{ secrets.DOCKER_REPOSITORY }} \ | |
| ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPOSITORY }}:latest | |
| sudo docker image prune -f |