docs: 코드 품질 개선 보고서 작성 📊 #66
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: 🚀 Flutter CD - 프로덕션 배포 | ||
|
Check failure on line 1 in .github/workflows/flutter-cd.yml
|
||
| # 🎯 트리거 조건: main 브랜치 push 시에만 배포 실행 | ||
| on: | ||
| push: | ||
| branches: [main] | ||
| paths: | ||
| - 'sejong_catch-frontend/**' | ||
| - '.github/workflows/flutter-cd.yml' | ||
| # 수동 트리거도 가능 (응급 상황용!) | ||
| workflow_dispatch: | ||
| inputs: | ||
| deploy_environment: | ||
| description: '배포 환경 선택' | ||
| required: true | ||
| default: 'production' | ||
| type: choice | ||
| options: | ||
| - production | ||
| - staging | ||
| # 🔧 환경 변수 | ||
| env: | ||
| FLUTTER_VERSION: '3.24.0' | ||
| WORKING_DIRECTORY: ./sejong_catch-frontend | ||
| JAVA_VERSION: '17' | ||
| jobs: | ||
| # 🏁 사전 검증 (한번 더 체크!) | ||
| pre_flight_check: | ||
| name: 🛡️ 배포 사전 검증 | ||
| runs-on: ubuntu-latest | ||
| defaults: | ||
| run: | ||
| working-directory: ${{ env.WORKING_DIRECTORY }} | ||
| steps: | ||
| - name: 📥 코드 체크아웃 | ||
| uses: actions/checkout@v4 | ||
| - name: ⚡ Flutter 환경 설정 | ||
| uses: subosito/flutter-action@v2 | ||
| with: | ||
| flutter-version: ${{ env.FLUTTER_VERSION }} | ||
| channel: 'stable' | ||
| cache: true | ||
| - name: 📦 의존성 설치 | ||
| run: flutter pub get | ||
| - name: 🔍 코드 분석 (마지막 점검!) | ||
| run: | | ||
| echo "🔍 최종 코드 분석을 시작합니다..." | ||
| flutter analyze | ||
| if [ $? -eq 0 ]; then | ||
| echo "✅ 코드가 완벽합니다! 배포 준비 완료! 🚀" | ||
| else | ||
| echo "❌ 코드에 문제가 있어요! 배포를 중단합니다! 🚨" | ||
| exit 1 | ||
| fi | ||
| - name: 🧪 테스트 실행 (마지막 검증!) | ||
| run: | | ||
| echo "🧪 최종 테스트를 시작합니다..." | ||
| flutter test | ||
| if [ $? -eq 0 ]; then | ||
| echo "🎉 모든 테스트 통과! 배포해도 좋아요! ✅" | ||
| else | ||
| echo "💥 테스트 실패! 배포 취소! 🛑" | ||
| exit 1 | ||
| fi | ||
| # 🤖 Android 릴리즈 빌드 | ||
| build_android: | ||
| name: 🤖 Android 릴리즈 빌드 | ||
| runs-on: ubuntu-latest | ||
| needs: pre_flight_check | ||
| defaults: | ||
| run: | ||
| working-directory: ${{ env.WORKING_DIRECTORY }} | ||
| steps: | ||
| - name: 📥 코드 체크아웃 | ||
| uses: actions/checkout@v4 | ||
| - name: ☕ Java 환경 설정 | ||
| uses: actions/setup-java@v4 | ||
| with: | ||
| distribution: 'temurin' | ||
| java-version: ${{ env.JAVA_VERSION }} | ||
| - name: ⚡ Flutter 환경 설정 | ||
| uses: subosito/flutter-action@v2 | ||
| with: | ||
| flutter-version: ${{ env.FLUTTER_VERSION }} | ||
| channel: 'stable' | ||
| cache: true | ||
| - name: 📦 의존성 설치 | ||
| run: flutter pub get | ||
| # 🔐 Android 서명 설정 (Secrets 사용) | ||
| - name: 🔐 Android 키스토어 설정 | ||
| if: ${{ github.event.inputs.deploy_environment != 'staging' }} | ||
| run: | | ||
| if [ -n "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" ]; then | ||
| echo "🔐 키스토어를 설정합니다..." | ||
| echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 -d > android/app/keystore.jks | ||
| echo "✅ 키스토어 설정 완료!" | ||
| else | ||
| echo "⚠️ 키스토어가 설정되지 않았습니다. Debug 빌드로 진행합니다." | ||
| fi | ||
| env: | ||
| ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} | ||
| - name: 🏗️ Android APK 빌드 | ||
| run: | | ||
| echo "🤖 Android 릴리즈 빌드를 시작합니다..." | ||
| if [ -n "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" ]; then | ||
| echo "🔒 서명된 릴리즈 APK를 빌드합니다..." | ||
| flutter build apk --release | ||
| else | ||
| echo "🔓 Debug APK를 빌드합니다..." | ||
| flutter build apk --debug | ||
| fi | ||
| echo "✅ Android 빌드 완료!" | ||
| - name: 🏗️ Android AAB 빌드 (Play Store용) | ||
| if: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} | ||
| run: | | ||
| echo "📦 Android App Bundle을 빌드합니다..." | ||
| flutter build appbundle --release | ||
| echo "✅ AAB 빌드 완료!" | ||
| - name: 📊 Android 빌드 업로드 | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: android-release-${{ github.sha }} | ||
| path: | | ||
| ${{ env.WORKING_DIRECTORY }}/build/app/outputs/flutter-apk/*.apk | ||
| ${{ env.WORKING_DIRECTORY }}/build/app/outputs/bundle/release/*.aab | ||
| retention-days: 30 | ||
| # 🌐 Web 릴리즈 빌드 | ||
| build_web: | ||
| name: 🌐 Web 릴리즈 빌드 | ||
| runs-on: ubuntu-latest | ||
| needs: pre_flight_check | ||
| defaults: | ||
| run: | ||
| working-directory: ${{ env.WORKING_DIRECTORY }} | ||
| steps: | ||
| - name: 📥 코드 체크아웃 | ||
| uses: actions/checkout@v4 | ||
| - name: ⚡ Flutter 환경 설정 | ||
| uses: subosito/flutter-action@v2 | ||
| with: | ||
| flutter-version: ${{ env.FLUTTER_VERSION }} | ||
| channel: 'stable' | ||
| cache: true | ||
| - name: 📦 의존성 설치 | ||
| run: flutter pub get | ||
| - name: 🌐 Web 릴리즈 빌드 | ||
| run: | | ||
| echo "🌐 웹 릴리즈 빌드를 시작합니다..." | ||
| flutter build web --release --web-renderer canvaskit | ||
| echo "✅ Web 빌드 완료! 브라우저에서 만나요! 💻" | ||
| - name: 📊 Web 빌드 업로드 | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: web-release-${{ github.sha }} | ||
| path: ${{ env.WORKING_DIRECTORY }}/build/web/ | ||
| retention-days: 30 | ||
| # 🚀 GitHub Pages 배포 (선택적) | ||
| - name: 🚀 GitHub Pages 배포 | ||
| if: ${{ github.event.inputs.deploy_environment != 'staging' }} | ||
| uses: peaceiris/actions-gh-pages@v3 | ||
| with: | ||
| github_token: ${{ secrets.GITHUB_TOKEN }} | ||
| publish_dir: ${{ env.WORKING_DIRECTORY }}/build/web | ||
| cname: sejong-catch.dev # 커스텀 도메인 (선택적) | ||
| # 📦 GitHub Release 생성 | ||
| create_release: | ||
| name: 📦 GitHub Release 생성 | ||
| runs-on: ubuntu-latest | ||
| needs: [build_android, build_web] | ||
| if: ${{ github.event.inputs.deploy_environment != 'staging' }} | ||
| steps: | ||
| - name: 📥 코드 체크아웃 | ||
| uses: actions/checkout@v4 | ||
| - name: 📥 Android 빌드 다운로드 | ||
| uses: actions/download-artifact@v4 | ||
| with: | ||
| name: android-release-${{ github.sha }} | ||
| path: ./android-release/ | ||
| - name: 📥 Web 빌드 다운로드 | ||
| uses: actions/download-artifact@v4 | ||
| with: | ||
| name: web-release-${{ github.sha }} | ||
| path: ./web-release/ | ||
| - name: 📝 릴리즈 노트 생성 | ||
| id: release_notes | ||
| run: | | ||
| VERSION="v$(date +'%Y.%m.%d')-${{ github.run_number }}" | ||
| echo "VERSION=$VERSION" >> $GITHUB_OUTPUT | ||
| cat > release_notes.md << 'EOF' | ||
| ## 🎉 세종 캐치 새 버전 출시! | ||
| ### 🚀 주요 변경사항 | ||
| - Flutter ${{ env.FLUTTER_VERSION }} 기반 최신 빌드 | ||
| - 크림슨 레드 테마 적용 | ||
| - 성능 최적화 및 버그 수정 | ||
| ### 📱 다운로드 | ||
| - **Android**: APK 파일을 다운로드하여 설치 | ||
| - **Web**: GitHub Pages에서 바로 사용 | ||
| ### 🔧 기술 정보 | ||
| - Build SHA: ${{ github.sha }} | ||
| - Build Date: $(date +'%Y-%m-%d %H:%M:%S KST') | ||
| - Environment: Production | ||
| --- | ||
| 🍗 **배포 완료!** 이제 치킨 시켜도 될 것 같네요! | ||
| EOF | ||
| - name: 🏷️ GitHub Release 생성 | ||
| uses: softprops/action-gh-release@v1 | ||
| with: | ||
| tag_name: ${{ steps.release_notes.outputs.VERSION }} | ||
| name: "🚀 세종 캐치 ${{ steps.release_notes.outputs.VERSION }}" | ||
| body_path: release_notes.md | ||
| draft: false | ||
| prerelease: false | ||
| files: | | ||
| ./android-release/**/*.apk | ||
| ./android-release/**/*.aab | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| # 🎊 배포 완료 알림 | ||
| deployment_success: | ||
| name: 🎉 배포 완료! | ||
| runs-on: ubuntu-latest | ||
| needs: [build_android, build_web, create_release] | ||
| if: always() | ||
| steps: | ||
| - name: 🎊 성공 축하 메시지 | ||
| if: ${{ needs.build_android.result == 'success' && needs.build_web.result == 'success' }} | ||
| run: | | ||
| echo "🎉🎉🎉 세종 캐치 배포가 성공적으로 완료됐습니다! 🎉🎉🎉" | ||
| echo "📱 Android APK: 릴리즈에서 다운로드 가능" | ||
| echo "🌐 Web: GitHub Pages에서 접속 가능" | ||
| echo "🍗 배포 축하 치킨 타임! 고생하셨어요!" | ||
| echo "🎯 버전: ${{ github.sha }}" | ||
| - name: 🚨 배포 실패 알림 | ||
| if: ${{ needs.build_android.result == 'failure' || needs.build_web.result == 'failure' }} | ||
| run: | | ||
| echo "💥💥💥 배포에 실패했습니다! 💥💥💥" | ||
| echo "🔍 로그를 확인하고 문제를 해결해주세요!" | ||
| echo "☕ 디버깅 타임... 화이팅!" | ||
| exit 1 | ||