Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 119 additions & 0 deletions .github/workflows/flutter-ci.yml
Original file line number Diff line number Diff line change
@@ -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
Loading