Skip to content
Open

kk #3

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
276 changes: 276 additions & 0 deletions .github/workflows/flutter-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
name: 🚀 Flutter CD - 프로덕션 배포

# 🎯 트리거 조건: 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
Loading