diff --git a/.github/workflows/flutter-ci.yml b/.github/workflows/flutter-ci.yml new file mode 100644 index 0000000..909722b --- /dev/null +++ b/.github/workflows/flutter-ci.yml @@ -0,0 +1,119 @@ +name: flutter-ci + +# 모든 PR은 이 워크플로를 통과해야 머지된다. +# 로컬 통과는 검증으로 치지 않는다 — 이 저장소는 전역 ~/.gradle 설정과 +# 브랜치별 pubspec 불일치 때문에 "내 컴퓨터에서는 되는데" 상황을 이미 겪었다. + +on: + pull_request: + branches: [develop, main] + push: + branches: [develop, main] + workflow_dispatch: + +concurrency: + group: flutter-ci-${{ github.ref }} + cancel-in-progress: true + +env: + FLUTTER_VERSION: 3.44.8 + +jobs: + analyze-and-test: + name: 정적 분석 + 테스트 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: stable + cache: true + + - name: 의존성 설치 + run: flutter pub get + + - name: 코드 생성 결과가 최신인지 확인 + run: | + if grep -q "build_runner" pubspec.yaml; then + dart run build_runner build + # 생성물이 커밋된 것과 다르면 누군가 codegen을 빼먹은 것이다. + if ! git diff --exit-code --stat -- '*.g.dart' '*.freezed.dart'; then + echo "::error::생성 코드가 소스와 어긋난다. 'dart run build_runner build' 후 커밋할 것." + exit 1 + fi + else + echo "build_runner 미사용 — 건너뜀" + fi + + - name: 정적 분석 + # v1 코드에 남은 경고·info는 별도 이슈로 정리 중이므로 에러만 실패로 본다. + run: flutter analyze --no-fatal-infos --no-fatal-warnings + + - name: 테스트 + run: | + if [ -d test ] && [ -n "$(find test -name '*_test.dart' -print -quit)" ]; then + flutter test --reporter expanded + else + echo "테스트 파일이 아직 없다 — 건너뜀" + fi + + build-android: + name: Android 디버그 빌드 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + # Gradle 9.1 / AGP 8.13 조합은 JDK 17에서 검증했다. + distribution: temurin + java-version: '17' + + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: stable + cache: true + + - name: Firebase Android 설정 파일 생성 + # google-services.json은 gitignore 대상이라 저장소에 없다. + # 아래 값은 lib/firebase_options.dart에 이미 커밋된 공개 클라이언트 + # 식별자와 동일하다. oauth_client가 비어 있어 Google 로그인은 되지 + # 않지만, 빌드 검증에는 충분하다 (issue #12). + run: | + cat > android/app/google-services.json <<'JSON' + { + "project_info": { + "project_number": "746932050988", + "project_id": "techpicks-project", + "storage_bucket": "techpicks-project.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:746932050988:android:38c726866fc4693a8e8589", + "android_client_info": { "package_name": "com.example.techpicks" } + }, + "oauth_client": [], + "api_key": [ { "current_key": "AIzaSyCvUWkpyXTAkDNcv1F7o2z-QDRK-u_00f4" } ], + "services": { "appinvite_service": { "other_platform_oauth_client": [] } } + } + ], + "configuration_version": "1" + } + JSON + + - name: 의존성 설치 + run: flutter pub get + + - name: 디버그 APK 빌드 + run: flutter build apk --debug + + - uses: actions/upload-artifact@v4 + with: + name: app-debug-apk + path: build/app/outputs/flutter-apk/app-debug.apk + retention-days: 7 + if-no-files-found: error