diff --git a/.claude/skills/flutter/SKILL.md b/.claude/skills/flutter/SKILL.md index c84e8cb..80f79d0 100644 --- a/.claude/skills/flutter/SKILL.md +++ b/.claude/skills/flutter/SKILL.md @@ -250,6 +250,8 @@ await storage.deleteAll(); - [ ] **구조 보완 시**: `app.dart` 분리, `core/{constants,theme,storage}` 생성. 공통 위젯은 `lib/shared/widgets/` 에 둔다(이동 완료). - [ ] **권장 패키지**: 모델(`freezed`/`json_serializable`)·라우팅(`go_router`) 도입 시 `pubspec.yaml` 추가 후 `flutter pub get`. - [ ] **analyze/test**: 커밋 전 `flutter analyze` (Warning 0) + `flutter test` 통과. + CI(`ci-flutter.yml`)는 **flutter/ 가 바뀐 커밋에서만** 자동 실행된다 (SDK 다운로드가 느려 분리). + 다른 시점에 검사가 필요하면 Actions 탭의 "Run workflow" 로 수동 실행한다. - [ ] **린트로 강제되는 항목**: `dynamic` 호출·`print`·`const` 누락·await 누락·작은따옴표·import 정렬 (`analysis_options.yaml`). - [ ] **env**: `flutter/.env.example` → `.env` 복사 후 `API_URL` 설정 (Android 에뮬레이터는 `10.0.2.2`). `.env` 는 `pubspec.yaml` 의 asset 이라 **없으면 `flutter analyze` 가 경고**한다. diff --git a/.github/workflows/ci-flutter.yml b/.github/workflows/ci-flutter.yml new file mode 100644 index 0000000..af51cf8 --- /dev/null +++ b/.github/workflows/ci-flutter.yml @@ -0,0 +1,55 @@ +name: CI (Flutter) + +# Flutter 는 기본 CI 에서 분리되어 있다. +# +# 이유: SDK 다운로드로 매 실행마다 수 분이 걸리는데, +# backend/frontend 만 고친 커밋에서는 검사할 것이 없다. +# +# 언제 도는가: +# - flutter/ 아래 파일이 바뀐 푸시·PR (= 실제로 Flutter 를 쓸 때 자동으로) +# - Actions 탭의 "Run workflow" 버튼으로 수동 실행 +# +# 모바일 앱을 아예 쓰지 않는 프로젝트라면 이 파일을 지우면 된다. + +on: + push: + branches: [main] + paths: + - 'flutter/**' + - '.github/workflows/ci-flutter.yml' + pull_request: + paths: + - 'flutter/**' + - '.github/workflows/ci-flutter.yml' + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + flutter: + name: Flutter (analyze · test) + runs-on: ubuntu-latest + defaults: + run: + working-directory: flutter + steps: + - uses: actions/checkout@v4 + + - uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + # .env 는 pubspec 의 asset 이라 없으면 analyze 가 경고를 낸다 + - name: Prepare .env + run: cp .env.example .env + + - run: flutter pub get + + - name: Analyze + run: flutter analyze + + - name: Test + run: flutter test diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 125a6f1..40346fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,32 +95,6 @@ jobs: - name: Test run: npm run test:unit -- --run - flutter: - name: Flutter (analyze · test) - runs-on: ubuntu-latest - defaults: - run: - working-directory: flutter - steps: - - uses: actions/checkout@v4 - - - uses: subosito/flutter-action@v2 - with: - channel: stable - cache: true - - # .env 는 pubspec 의 asset 이라 없으면 analyze 가 경고를 낸다 - - name: Prepare .env - run: cp .env.example .env - - - run: flutter pub get - - - name: Analyze - run: flutter analyze - - - name: Test - run: flutter test - error-codes-sync: name: 에러 코드 SSOT 동기화 검사 runs-on: ubuntu-latest diff --git a/ci/README.md b/ci/README.md index 167212d..6d91390 100644 --- a/ci/README.md +++ b/ci/README.md @@ -59,15 +59,26 @@ GitHub Actions 는 잡이 VM 위에서 직접 돌기 때문에 관례가 다르 ## 리소스 참고 -`ci.yml` 은 네 개의 잡을 실행합니다. +워크플로는 두 개로 나뉘어 있습니다. + +**`ci.yml`** — 모든 푸시·PR 에서 실행 - `backend` — postgres 서비스 컨테이너를 띄워 단위 테스트와 e2e 를 실행 - `frontend` — lint·type-check·테스트 -- `flutter` — **매 실행마다 Flutter SDK 를 내려받아 수 분 소요** - `error-codes-sync` — 에러 코드 생성 파일 드리프트 검사 -서버 사양이 넉넉하지 않다면 처음에는 `flutter` 잡을 빼고 시작해도 됩니다. -나머지 세 개만으로도 대부분의 회귀는 걸립니다. +**`ci-flutter.yml`** — **기본적으로 돌지 않는다** + +Flutter 는 SDK 다운로드로 매 실행 수 분이 걸리는데, backend/frontend 만 고친 커밋에서는 +검사할 것이 없다. 그래서 다음 경우에만 실행된다. + +- `flutter/` 아래 파일이 바뀐 푸시·PR — **실제로 Flutter 를 쓰기 시작하면 자동으로 동작한다** +- Actions 탭의 **Run workflow** 버튼으로 수동 실행 + +모바일 앱을 쓰지 않는 프로젝트라면 `ci-flutter.yml` 을 지우면 된다. + +> 러너는 기본적으로 잡을 **하나씩** 처리한다. 전체 시간을 줄이려면 러너를 여러 개 띄우거나 +> `act_runner` 설정에서 동시 실행 수를 늘린다. ## 주의