name: Flutter 테스트 on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] workflow_dispatch: # 수동 실행 옵션 jobs: test: name: 테스트 실행 runs-on: ubuntu-latest timeout-minutes: 15 # CI 전체 타임아웃 설정 steps: - name: 코드 체크아웃 uses: actions/checkout@v3 - name: Flutter 설정 uses: subosito/flutter-action@v2 with: flutter-version: '3.10.0' channel: 'stable' cache: true - name: 의존성 설치 run: flutter pub get - name: 테스트 디렉토리 생성 run: mkdir -p test_diagnostics - name: 테스트 실행 권한 설정 run: | chmod +x ./scripts/run_tests.sh chmod +x ./scripts/reproduce_test.sh - name: Flutter 테스트 실행 id: run_tests continue-on-error: true run: ./scripts/run_tests.sh ci --verbose env: FLUTTER_TEST_IS_CI: true - name: 플래키 자동 재실행 (실패 시만) if: steps.run_tests.outcome == 'failure' run: | echo "1차 테스트 실패 - 플래키 자동 재실행 시작" chmod +x ./scripts/run_and_rerun_failed.sh # 전체 스위트를 재실행하며, 내부적으로 per-file 폴백을 수행 set +e ./scripts/run_and_rerun_failed.sh RERUN_STATUS=$? set -e if [ "$RERUN_STATUS" -eq 0 ]; then echo "재실행 성공 - 플래키로 간주하고 워크플로를 성공 처리합니다." echo "::set-output name=flaky_recovered::true" else echo "재실행 실패 - 실패를 유지합니다." exit 1 fi - name: 임시 flutter 테스트 로그 수집 (/tmp) if: always() shell: bash run: | echo "임시 flutter 테스트 로그를 test_diagnostics/로 복사합니다" mkdir -p test_diagnostics # run_and_rerun_failed.sh가 출력한 /tmp 로그를 수집 cp -v /tmp/flutter_test_*.log test_diagnostics/ 2>/dev/null || true cp -v /tmp/flutter_test_*.log.clean test_diagnostics/ 2>/dev/null || true # machine 리포터 로그 등 기타 진단 파일 수집 시도 cp -v /tmp/*flutter*test*.* test_diagnostics/ 2>/dev/null || true - name: 테스트 진단 정보 수집 if: failure() run: | echo "테스트 실패 - 진단 정보 수집 중..." ls -la test_diagnostics/ cat test_diagnostics/*.log || echo "로그 파일 없음" cat test_diagnostics/*.txt || echo "분석 파일 없음" - name: 테스트 진단 정보 업로드 if: always() uses: actions/upload-artifact@v3 with: name: test-diagnostics path: test_diagnostics/ retention-days: 7 if-no-files-found: ignore