diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml new file mode 100644 index 0000000..084d573 --- /dev/null +++ b/.github/workflows/CD.yml @@ -0,0 +1,28 @@ +name: CD + +on: + workflow_run: + workflows: ["CI"] # CI 워크플로우의 이름을 기입 + types: + - completed + +jobs: + deploy: + environment: env + # build 잡이 성공한 뒤에만 실행되도록 의존성 설정 + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + + steps: + - name: SSH and Deploy + uses: appleboy/ssh-action@v0.1.10 + with: + host: ${{ secrets.EC2_HOST }} # EC2 호스트 (IP 또는 도메인) + username: ${{ secrets.EC2_USER }} + key: ${{ secrets.EC2_SSH_KEY }} + script: | + # Redis 컨테이너에서 flushall 명령 실행 (비대화형으로 실행) + docker exec redis-app redis-cli flushall + + # 배포 스크립트 실행 + ./deploy.sh diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..d81afaf --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,108 @@ +name: CI + +on: + push: + branches: [ "dev" ] + +jobs: + build: + environment: env + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies. + # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md + - name: Setup Gradle + uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 + + # 1. application.yml 생성 + - name: Create application.yml + run: | + mkdir -p src/main/resources + touch src/main/resources/application.yml + echo "server:" >> src/main/resources/application.yml + echo " port: 8080" >> src/main/resources/application.yml + + echo "spring:" >> src/main/resources/application.yml + echo " datasource:" >> src/main/resources/application.yml + echo " driver-class-name: com.mysql.cj.jdbc.Driver" >> src/main/resources/application.yml + echo " url: '${{ secrets.DB_URL }}'" >> src/main/resources/application.yml + echo " username: '${{ secrets.DB_USERNAME }}'" >> src/main/resources/application.yml + echo " password: '${{ secrets.DB_PASSWORD }}'" >> src/main/resources/application.yml + + echo " data:" >> src/main/resources/application.yml + echo " redis:" >> src/main/resources/application.yml + echo " host: '${{ secrets.REDIS_HOST }}'" >> src/main/resources/application.yml + echo " port: ${{ secrets.REDIS_PORT }}" >> src/main/resources/application.yml + + echo " jpa:" >> src/main/resources/application.yml + echo " hibernate:" >> src/main/resources/application.yml + echo " ddl-auto: update" >> src/main/resources/application.yml + echo " show-sql: true" >> src/main/resources/application.yml + echo " properties:" >> src/main/resources/application.yml + echo " hibernate:" >> src/main/resources/application.yml + echo " dialect: org.hibernate.dialect.MySQLDialect" >> src/main/resources/application.yml + echo " format_sql: true" >> src/main/resources/application.yml + + echo " mail:" >> src/main/resources/application.yml + echo " host: smtp.gmail.com" >> src/main/resources/application.yml + echo " port: 587" >> src/main/resources/application.yml + echo " username: '${{ secrets.MAIL_USERNAME }}'" >> src/main/resources/application.yml + echo " password: '${{ secrets.MAIL_PASSWORD }}'" >> src/main/resources/application.yml + echo " properties:" >> src/main/resources/application.yml + echo " mail.smtp.auth: true" >> src/main/resources/application.yml + echo " mail.smtp.starttls.enable: true" >> src/main/resources/application.yml + + echo "jwt:" >> src/main/resources/application.yml + echo " secret: '${{ secrets.JWT_SECRET }}'" >> src/main/resources/application.yml + + echo "kakao:" >> src/main/resources/application.yml + echo " api:" >> src/main/resources/application.yml + echo " key: '${{ secrets.KAKAO_API_KEY }}'" >> src/main/resources/application.yml + echo "application.yml 생성 완료" + + # 2. Build 및 Jacoco 리포트 생성 + - name: Build and Test with Jacoco + run: ./gradlew clean build test jacocoTestReport + + # 3. Jacoco HTML 리포트를 GitHub Actions Artifacts로 업로드 + - name: Upload Jacoco Report as Artifact + uses: actions/upload-artifact@v4 + with: + name: jacoco-report + path: build/reports/jacoco/test/html + + # 4. 테스트 결과 아티팩트 업로드 + - name: Upload Test Reports + uses: actions/upload-artifact@v4 + with: + name: test-reports + path: build/reports/tests/test + + # 5. Docker Hub 로그인 + - name: Docker Hub 로그인 + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + # 6. Docker 이미지를 빌드하고 푸시하는 작업입니다. + - name: Build and Push Docker Image + env: + DOCKERHUB_USERNAME: tmdfl36 + IMAGE_NAME: mapjiri + TAG: latest + run: | + docker buildx build --platform linux/amd64 -t $DOCKERHUB_USERNAME/$IMAGE_NAME:$TAG . + docker push $DOCKERHUB_USERNAME/$IMAGE_NAME:$TAG + +