Skip to content

Merge pull request #593 from 100-hours-a-week/docs/swagger #454

Merge pull request #593 from 100-hours-a-week/docs/swagger

Merge pull request #593 from 100-hours-a-week/docs/swagger #454

Workflow file for this run

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 }}