Merge pull request #593 from 100-hours-a-week/docs/swagger #454
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: Backend CI/CD | |
| on: | |
| pull_request: | |
| branches: ["develop", "main"] | |
| push: | |
| branches: ["develop", "main"] | |
| jobs: | |
| unit-test: # 단위 테스트를 수행하는 Job (develop 브랜치 PR 대상) | |
| name: Unit Test | |
| if: github.event_name == 'pull_request' && github.event.action != 'closed' | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| working-directory: ./ | |
| steps: | |
| - uses: actions/checkout@v3 # 소스코드 체크아웃 | |
| - name: Set up JDK 21 # Java 21 환경 설정 | |
| uses: actions/setup-java@v3 | |
| with: | |
| distribution: 'oracle' | |
| java-version: 21 | |
| - name: Grant Gradle permission # gradlew 실행 권한 부여 | |
| run: chmod +x ./gradlew | |
| - name: Cache Gradle dependencies # Gradle 캐시로 빌드 속도 향상 | |
| uses: actions/cache@v3 | |
| with: | |
| path: ~/.gradle/caches | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('build.gradle.kts', 'build.gradle') }} | |
| restore-keys: | | |
| ${{ runner.os }}-gradle- | |
| # 임시적으로 테스트 실행을 주석처리 | |
| # - name: Run Tests # 단위 테스트 실행 | |
| # run: ./gradlew test | |
| build-dev: # develop 브랜치에서 Docker 이미지 빌드 및 푸시 | |
| name: Build and Push Docker (dev) | |
| if: > | |
| (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/develop')) || | |
| (github.event_name == 'pull_request' && github.base_ref == 'develop' && github.event.action == 'closed' && github.event.pull_request.merged == true) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v3 # 소스코드 체크아웃 | |
| - name: Set GCP Secret Name | |
| id: set-env-vars | |
| run: | | |
| echo "${{ secrets.ENV_BE_DEV }}" > .env | |
| echo "SIGNOZ_INGESTION_KEY=${{ secrets.SIGNOZ_INGESTION_KEY }}" >> .env | |
| - name: Validate .env content | |
| run: | | |
| if [[ ! -s .env ]]; then | |
| echo ".env file EMPTY." | |
| exit 1 | |
| fi | |
| - name: Set up Docker Buildx # Docker Buildx 설정 | |
| uses: docker/setup-buildx-action@v3 | |
| with: | |
| driver: docker-container | |
| - name: Login to Docker Hub # Docker Hub 로그인 | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_TOKEN }} | |
| - name: Build and Push Docker Image # Docker 이미지 빌드 및 푸시 | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./Dockerfile | |
| push: true | |
| tags: | | |
| jchanho99/backend-develop:latest | |
| cache-from: type=gha,scope=build-backend-develop | |
| cache-to: type=gha,mode=max,scope=build-backend-develop | |
| build-prod: # main 브랜치에서 Docker 이미지 빌드 및 푸시 | |
| name: Build and Push Docker (prod) | |
| if: > | |
| (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/main')) || | |
| (github.event_name == 'pull_request' && github.base_ref == 'main' && github.event.action == 'closed' && github.event.pull_request.merged == true) | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| working-directory: ./ | |
| steps: | |
| - uses: actions/checkout@v3 # 코드 체크아웃 | |
| - name: Set GCP Secret Name based on branch | |
| id: set-env-vars | |
| run: | | |
| echo "${{ secrets.ENV_BE_PROD }}" > .env | |
| echo "SIGNOZ_INGESTION_KEY=${{ secrets.SIGNOZ_INGESTION_KEY }}" >> .env | |
| - name: Validate .env content | |
| run: | | |
| if [[ ! -s .env ]]; then | |
| echo ".env file EMPTY." | |
| exit 1 | |
| fi | |
| - name: Set up Docker Buildx # Docker Buildx 설정 | |
| uses: docker/setup-buildx-action@v3 | |
| with: | |
| driver: docker-container | |
| - name: Login to Docker Hub # Docker Hub 로그인 | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_TOKEN }} | |
| - name: Build and Push Docker Image to Docker Hub # Docker 이미지 빌드 및 푸시 | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| file: ./Dockerfile | |
| push: true | |
| tags: | | |
| jchanho99/backend-prod:latest | |
| cache-from: type=gha,scope=build-backend-prod | |
| cache-to: type=gha,mode=max,scope=build-backend-prod | |
| deploy-dev: | |
| name: BE Docker 배포 (Develop) | |
| needs: [build-dev] | |
| runs-on: ubuntu-latest | |
| outputs: | |
| status: ${{ steps.set-status.outputs.status }} | |
| steps: | |
| - uses: actions/checkout@v3 # 소스코드 체크아웃 | |
| - name: Deploy Backend (Develop) via SSH | |
| uses: appleboy/ssh-action@v1.0.3 | |
| with: | |
| host: ${{ secrets.SSH_HOST }} | |
| username: ${{ secrets.SSH_USER }} | |
| key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| script: | | |
| echo "백엔드 배포 중" | |
| sudo docker compose stop backend | |
| sudo docker compose rm -f backend | |
| sudo docker compose pull backend | |
| sudo docker compose up -d backend | |
| sudo docker compose ps | |
| - name: Set Status (Dev) | |
| id: set-status | |
| if: success() | |
| run: echo "status=success" >> "$GITHUB_OUTPUT" | |
| - name: Set Status (Dev Failure) | |
| if: failure() && steps.deploy-dev.outcome == 'failure' # deploy-step이 실패했을 때만 | |
| run: echo "status=failure" >> "$GITHUB_OUTPUT" | |
| notify: | |
| name: Discord Notification | |
| needs: [deploy-dev] | |
| if: | | |
| needs.deploy-dev.result != 'skipped' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Send Discord Message | |
| run: | | |
| MESSAGE="" | |
| # Dev 결과 처리 | |
| if [[ "${{ needs.deploy-dev.result }}" != 'skipped' ]]; then | |
| STATUS_DEV="${{ needs.deploy-dev.outputs.status }}" | |
| if [ "$STATUS_DEV" = "success" ]; then | |
| MESSAGE="${MESSAGE}✅ \`[FE dev]\` 배포 완료\n" | |
| elif [ "$STATUS_DEV" = "failure" ]; then | |
| MESSAGE="${MESSAGE}🚨 \`[FE dev]\` 배포 실패\n" | |
| fi | |
| fi | |
| # Prod 결과 처리 | |
| # if [[ "${{ needs.deploy-prod.result }}" != 'skipped' ]]; then | |
| # STATUS_PROD="${{ needs.deploy-prod.outputs.status }}" | |
| # if [ "$STATUS_PROD" = "success" ]; then | |
| # MESSAGE="${MESSAGE}✅ \`[FE prod]\` 배포 완료\n" | |
| # elif [ "$STATUS_PROD" = "failure" ]; then | |
| # MESSAGE="${MESSAGE}🚨 \`[FE prod]\` 배포 실패\n" | |
| # fi | |
| # fi | |
| if [ -z "$MESSAGE" ]; then | |
| MESSAGE="⚠️ 배포 상태 정보를 찾을 수 없습니다." | |
| fi | |
| curl -H "Content-Type: application/json" \ | |
| -X POST \ | |
| -d "{\"content\": \"$MESSAGE\"}" \ | |
| ${{ secrets.DISCORD_WEBHOOK_URL }} |