Update README.md #27
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: CI/CD Pipeline | |
| on: | |
| push: | |
| branches: [ develop, main ] | |
| env: | |
| DOCKER_IMAGE: leeeunda/blockcloud-server | |
| jobs: | |
| build-and-test: | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 코드 체크아웃 | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.event.pull_request.head.sha }} | |
| # JDK 21 설정 | |
| - name: Set up JDK 21 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: 'temurin' | |
| java-version: '21' | |
| # Gradle 캐시 설정 | |
| - name: Cache Gradle | |
| uses: actions/cache@v3 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
| restore-keys: ${{ runner.os }}-gradle- | |
| # application.yml 생성 | |
| - name: Create application.yml files | |
| run: | | |
| mkdir -p src/main/resources | |
| echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application.yml | |
| echo "${{ secrets.APPLICATION_YML_DEV }}" > ./src/main/resources/application-dev.yml | |
| echo "${{ secrets.APPLICATION_YML_PROD }}" > ./src/main/resources/application-prod.yml | |
| echo "${{ secrets.APPLICATION_YML_SECRET }}" > ./src/main/resources/application-secret.yml | |
| # gradlew 실행 권한 부여 | |
| - name: Grant execute permission for gradlew | |
| run: chmod +x ./gradlew | |
| # Gradle 빌드 실행 | |
| - name: Build with Gradle | |
| run: ./gradlew clean build -x test | |
| # Docker Hub 로그인 | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| # Docker 이미지 빌드 및 푸시 | |
| - name: Build and Push Docker image | |
| run: | | |
| docker build -t ${{ secrets.DOCKER_USERNAME }}/blockcloud-server . | |
| docker push ${{ secrets.DOCKER_USERNAME }}/blockcloud-server | |
| deploy: | |
| needs: build-and-test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Deploy to EC2 (pull & replace container) | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USER }} | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| timeout: 60s | |
| command_timeout: 15m | |
| script: | | |
| set -euo pipefail | |
| IMAGE="${{ secrets.DOCKER_USERNAME }}/blockcloud-server:latest" | |
| echo "Pulling image: $IMAGE" | |
| docker pull "$IMAGE" | |
| # 기존 컨테이너 정리 | |
| docker stop blockcloud-app || true | |
| docker rm blockcloud-app || true | |
| # 새 컨테이너 실행 | |
| docker run -d \ | |
| --name blockcloud-app \ | |
| --restart unless-stopped \ | |
| --env-file /srv/app/.env \ | |
| -e SPRING_PROFILES_ACTIVE=prod \ | |
| -p 127.0.0.1:8080:8080 \ | |
| "$IMAGE" | |
| # 헬스체크 | |
| echo "🏥 헬스체크 시작 (최대 60초 대기)..." | |
| for i in {1..20}; do | |
| if curl -fsS http://127.0.0.1:8080/actuator/health >/dev/null 2>&1; then | |
| echo "✅ Application is UP and healthy!" | |
| echo "🎉 배포 성공!" | |
| exit 0 | |
| else | |
| echo "⏳ Waiting for application to start... (${i}/20)" | |
| sleep 3 | |
| fi | |
| done | |
| echo "❌ Application failed to start properly" | |
| echo "📊 컨테이너 상태:" | |
| docker ps -a | grep blockcloud-app || true | |
| echo "📋 컨테이너 로그:" | |
| docker logs --tail=100 blockcloud-app || true | |
| exit 1 |