1- # Per-app build matrix gated by `dorny/paths-filter`. Adding a new model
2- # directory, controller, or top-level module under packages/react-native-executorch/
3- # probably means updating the filter block below — `core-shared` if it affects every
1+ # Per-app build matrix. Filter definitions live in scripts/build-app-filters.yml
2+ # and are evaluated by scripts/detect-changed-filters.ts against the diff of the
3+ # current push (not the cumulative PR diff). Adding a new model directory,
4+ # controller, or top-level module under packages/react-native-executorch/
5+ # probably means updating that filter file — `core-shared` if it affects every
46# app, or one of the per-app `<app>-pkg` anchors otherwise. CI runs
57# `scripts/check-ci-filter-coverage.ts` (in ci.yml's lint job) to flag uncovered
68# files so this stays accurate.
@@ -24,110 +26,49 @@ jobs:
2426 steps :
2527 - name : Checkout
2628 uses : actions/checkout@v6
29+ with :
30+ # Enough history for `git diff $before..$head` against the previous
31+ # push. PR series rarely exceed this; if they do, the script falls
32+ # back to fetching the missing SHA on demand.
33+ fetch-depth : 100
34+
35+ - name : Setup
36+ if : github.event_name != 'workflow_dispatch'
37+ uses : ./.github/actions/setup
2738
2839 - name : Detect changed apps
2940 id : filter
3041 if : github.event_name != 'workflow_dispatch'
31- uses : dorny/paths-filter@v3
32- with :
33- # Diff against the previous commit (synchronize/push) or the PR base
34- # (opened/reopened/ready_for_review). Without this, dorny defaults to
35- # the PR base on every push, so each commit re-evaluates the
36- # cumulative PR diff and pulls every app whose filter ever matched
37- # into the matrix — even when the latest push only touched one app.
38- base : ${{ github.event.before || github.event.pull_request.base.sha }}
39- filters : |
40- # Cross-platform shared infrastructure
41- core-shared: &core-shared
42- - .github/workflows/build-apps.yml
43- - packages/react-native-executorch/{scripts,third-party}/**
44- - packages/react-native-executorch/{package.json,tsconfig.json}
45- - packages/react-native-executorch/common/{ada,runner}/**
46- - packages/react-native-executorch/common/rnexecutorch/{Error,ErrorCodes,Log}.h
47- - packages/react-native-executorch/common/rnexecutorch/RnExecutorchInstaller.{cpp,h}
48- - packages/react-native-executorch/common/rnexecutorch/{data_processing,host_objects,jsi,metaprogramming,tests,threads,utils}/**
49- - packages/react-native-executorch/common/rnexecutorch/models/BaseModel.{cpp,h}
50- - packages/react-native-executorch/src/{common,constants,errors,native,types,utils}/**
51- - packages/react-native-executorch/src/index.ts
52- - packages/react-native-executorch/src/modules/{BaseModule.ts,general/**}
53- - packages/react-native-executorch/src/hooks/{general/**,useModule.ts,useModuleFactory.ts}
54- - "{package.json,yarn.lock}"
55- # Platform-specific shared
56- android-shared: &android-shared
57- - .github/actions/build-android-app/**
58- - packages/react-native-executorch/android/**
59- ios-shared: &ios-shared
60- - .github/actions/build-ios-app/**
61- - packages/react-native-executorch/ios/**
62- - packages/react-native-executorch/react-native-executorch.podspec
63- # Resource fetchers
64- expo-fetcher: &expo-fetcher
65- - packages/expo-resource-fetcher/**
66- bare-fetcher: &bare-fetcher
67- - packages/bare-resource-fetcher/**
68- # Per-app package paths (TS modules + C++ models for the app's domain)
69- llm-pkg: &llm-pkg
70- - packages/react-native-executorch/common/rnexecutorch/TokenizerModule.{cpp,h}
71- - packages/react-native-executorch/common/rnexecutorch/models/llm/**
72- - packages/react-native-executorch/common/rnexecutorch/models/privacy_filter/**
73- - packages/react-native-executorch/src/modules/natural_language_processing/{LLMModule,PrivacyFilterModule,TokenizerModule}.ts
74- - packages/react-native-executorch/src/hooks/natural_language_processing/{useLLM,usePrivacyFilter,useTokenizer}.ts
75- - packages/react-native-executorch/src/controllers/LLMController.ts
76- cv-pkg: &cv-pkg
77- - packages/react-native-executorch/common/rnexecutorch/models/VisionModel.{cpp,h}
78- - packages/react-native-executorch/common/rnexecutorch/models/{classification,instance_segmentation,object_detection,ocr,pose_estimation,semantic_segmentation,style_transfer,text_to_image,vertical_ocr}/**
79- - packages/react-native-executorch/src/{modules,hooks}/computer_vision/**
80- - packages/react-native-executorch/src/controllers/{BaseOCRController,OCRController,VerticalOCRController}.ts
81- speech-pkg: &speech-pkg
82- - packages/react-native-executorch/common/pfft/**
83- - packages/react-native-executorch/common/rnexecutorch/TokenizerModule.{cpp,h}
84- - packages/react-native-executorch/common/rnexecutorch/models/{speech_to_text,text_to_speech,voice_activity_detection}/**
85- - packages/react-native-executorch/src/modules/natural_language_processing/{SpeechToTextModule,TextToSpeechModule,VADModule,TokenizerModule}.ts
86- - packages/react-native-executorch/src/hooks/natural_language_processing/{useSpeechToText,useTextToSpeech,useVAD,useTokenizer}.ts
87- text-embeddings-pkg: &text-embeddings-pkg
88- - packages/react-native-executorch/common/rnexecutorch/TokenizerModule.{cpp,h}
89- - packages/react-native-executorch/common/rnexecutorch/models/embeddings/**
90- - packages/react-native-executorch/src/modules/natural_language_processing/{TextEmbeddingsModule,TokenizerModule}.ts
91- - packages/react-native-executorch/src/modules/computer_vision/ImageEmbeddingsModule.ts
92- - packages/react-native-executorch/src/hooks/natural_language_processing/{useTextEmbeddings,useTokenizer}.ts
93- - packages/react-native-executorch/src/hooks/computer_vision/useImageEmbeddings.ts
94- # Per-app bundle: core + fetcher + pkg + app dir
95- llm-app: &llm-app
96- - *core-shared
97- - *expo-fetcher
98- - *llm-pkg
99- - apps/llm/**
100- computer-vision-app: &computer-vision-app
101- - *core-shared
102- - *expo-fetcher
103- - *cv-pkg
104- - apps/computer-vision/**
105- speech-app: &speech-app
106- - *core-shared
107- - *expo-fetcher
108- - *speech-pkg
109- - apps/speech/**
110- text-embeddings-app: &text-embeddings-app
111- - *core-shared
112- - *expo-fetcher
113- - *text-embeddings-pkg
114- - apps/text-embeddings/**
115- bare-rn-app: &bare-rn-app
116- - *core-shared
117- - *bare-fetcher
118- - *llm-pkg
119- - apps/bare-rn/**
120- # Final per-platform per-app filters (the only ones the matrix consumes)
121- llm-android: [*llm-app, *android-shared]
122- llm-ios: [*llm-app, *ios-shared]
123- computer-vision-android: [*computer-vision-app, *android-shared]
124- computer-vision-ios: [*computer-vision-app, *ios-shared]
125- speech-android: [*speech-app, *android-shared]
126- speech-ios: [*speech-app, *ios-shared]
127- text-embeddings-android: [*text-embeddings-app, *android-shared]
128- text-embeddings-ios: [*text-embeddings-app, *ios-shared]
129- bare-rn-android: [*bare-rn-app, *android-shared]
130- bare-rn-ios: [*bare-rn-app, *ios-shared]
42+ run : |
43+ set -e
44+ ZERO=0000000000000000000000000000000000000000
45+ if [ "${{ github.event_name }}" = "pull_request" ]; then
46+ BEFORE="${{ github.event.before }}"
47+ HEAD_SHA="${{ github.event.pull_request.head.sha }}"
48+ if [ -z "$BEFORE" ] || [ "$BEFORE" = "$ZERO" ]; then
49+ BASE_SHA="${{ github.event.pull_request.base.sha }}"
50+ else
51+ BASE_SHA="$BEFORE"
52+ fi
53+ else
54+ BEFORE="${{ github.event.before }}"
55+ HEAD_SHA="${{ github.sha }}"
56+ if [ -z "$BEFORE" ] || [ "$BEFORE" = "$ZERO" ]; then
57+ BASE_SHA="$(git rev-parse origin/main^ 2>/dev/null || git rev-parse HEAD^)"
58+ else
59+ BASE_SHA="$BEFORE"
60+ fi
61+ fi
62+ echo "Diffing $BASE_SHA..$HEAD_SHA"
63+ # Ensure both SHAs are reachable; fetch deeper if shallow clone is missing one.
64+ if ! git cat-file -e "$BASE_SHA" 2>/dev/null || ! git cat-file -e "$HEAD_SHA" 2>/dev/null; then
65+ git fetch --no-tags --depth=500 origin "$BASE_SHA" "$HEAD_SHA" 2>/dev/null \
66+ || git fetch --no-tags --unshallow origin 2>/dev/null \
67+ || true
68+ fi
69+ CHANGES=$(npx ts-node scripts/detect-changed-filters.ts "$BASE_SHA" "$HEAD_SHA")
70+ echo "Matched filters: $CHANGES"
71+ echo "changes=$CHANGES" >> "$GITHUB_OUTPUT"
13172
13273 - name : Compute matrices
13374 id : matrix
0 commit comments