1- name : Android example apps build check
1+ name : Example apps build check
22on :
33 push :
44 branches :
1212 if : github.repository == 'software-mansion/react-native-executorch' && github.event.pull_request.draft != true
1313 runs-on : ubuntu-latest
1414 outputs :
15- apps : ${{ steps.matrix.outputs.apps }}
15+ android_apps : ${{ steps.matrix.outputs.android_apps }}
16+ ios_apps : ${{ steps.matrix.outputs.ios_apps }}
1617 steps :
1718 - name : Checkout
1819 uses : actions/checkout@v6
@@ -23,10 +24,10 @@ jobs:
2324 uses : dorny/paths-filter@v3
2425 with :
2526 filters : |
26- shared: & shared
27- - .github/workflows/build-android.yml
28- - .github/actions /build-android-app/**
29- - packages/react-native-executorch/{android, scripts,third-party}/**
27+ # Cross-platform shared infrastructure
28+ core-shared: &core-shared
29+ - .github/workflows /build-apps.yml
30+ - packages/react-native-executorch/{scripts,third-party}/**
3031 - packages/react-native-executorch/{package.json,tsconfig.json}
3132 - packages/react-native-executorch/common/{ada,runner}/**
3233 - packages/react-native-executorch/common/rnexecutorch/{Error,ErrorCodes,Log}.h
@@ -38,66 +39,105 @@ jobs:
3839 - packages/react-native-executorch/src/modules/{BaseModule.ts,general/**}
3940 - packages/react-native-executorch/src/hooks/{general/**,useModule.ts,useModuleFactory.ts}
4041 - "{package.json,yarn.lock}"
41- expo-shared: &expo-shared
42- - *shared
42+ # Platform-specific shared
43+ android-shared: &android-shared
44+ - .github/actions/build-android-app/**
45+ - packages/react-native-executorch/android/**
46+ ios-shared: &ios-shared
47+ - .github/actions/build-ios-app/**
48+ - packages/react-native-executorch/ios/**
49+ - packages/react-native-executorch/react-native-executorch.podspec
50+ # Resource fetchers
51+ expo-fetcher: &expo-fetcher
4352 - packages/expo-resource-fetcher/**
53+ bare-fetcher: &bare-fetcher
54+ - packages/bare-resource-fetcher/**
55+ # Per-app package paths (TS modules + C++ models for the app's domain)
4456 llm-pkg: &llm-pkg
4557 - packages/react-native-executorch/common/rnexecutorch/TokenizerModule.{cpp,h}
4658 - packages/react-native-executorch/common/rnexecutorch/models/llm/**
4759 - packages/react-native-executorch/src/modules/natural_language_processing/{LLMModule,TokenizerModule}.ts
4860 - packages/react-native-executorch/src/hooks/natural_language_processing/{useLLM,useTokenizer}.ts
4961 - packages/react-native-executorch/src/controllers/LLMController.ts
50- llm:
51- - *expo-shared
52- - *llm-pkg
53- - apps/llm/**
54- computer-vision:
55- - *expo-shared
62+ cv-pkg: &cv-pkg
5663 - packages/react-native-executorch/common/rnexecutorch/models/VisionModel.{cpp,h}
5764 - packages/react-native-executorch/common/rnexecutorch/models/{classification,instance_segmentation,object_detection,ocr,semantic_segmentation,style_transfer,text_to_image,vertical_ocr}/**
5865 - packages/react-native-executorch/src/{modules,hooks}/computer_vision/**
5966 - packages/react-native-executorch/src/controllers/{BaseOCRController,OCRController,VerticalOCRController}.ts
60- - apps/computer-vision/**
61- speech:
62- - *expo-shared
67+ speech-pkg: &speech-pkg
6368 - packages/react-native-executorch/common/pfft/**
6469 - packages/react-native-executorch/common/rnexecutorch/TokenizerModule.{cpp,h}
6570 - packages/react-native-executorch/common/rnexecutorch/models/{speech_to_text,text_to_speech,voice_activity_detection}/**
6671 - packages/react-native-executorch/src/modules/natural_language_processing/{SpeechToTextModule,TextToSpeechModule,VADModule,TokenizerModule}.ts
6772 - packages/react-native-executorch/src/hooks/natural_language_processing/{useSpeechToText,useTextToSpeech,useVAD,useTokenizer}.ts
68- - apps/speech/**
69- text-embeddings:
70- - *expo-shared
73+ text-embeddings-pkg: &text-embeddings-pkg
7174 - packages/react-native-executorch/common/rnexecutorch/TokenizerModule.{cpp,h}
7275 - packages/react-native-executorch/common/rnexecutorch/models/embeddings/**
7376 - packages/react-native-executorch/src/modules/natural_language_processing/{TextEmbeddingsModule,TokenizerModule}.ts
7477 - packages/react-native-executorch/src/modules/computer_vision/ImageEmbeddingsModule.ts
7578 - packages/react-native-executorch/src/hooks/natural_language_processing/{useTextEmbeddings,useTokenizer}.ts
7679 - packages/react-native-executorch/src/hooks/computer_vision/useImageEmbeddings.ts
80+ # Per-app bundle: core + fetcher + pkg + app dir
81+ llm-app: &llm-app
82+ - *core-shared
83+ - *expo-fetcher
84+ - *llm-pkg
85+ - apps/llm/**
86+ computer-vision-app: &computer-vision-app
87+ - *core-shared
88+ - *expo-fetcher
89+ - *cv-pkg
90+ - apps/computer-vision/**
91+ speech-app: &speech-app
92+ - *core-shared
93+ - *expo-fetcher
94+ - *speech-pkg
95+ - apps/speech/**
96+ text-embeddings-app: &text-embeddings-app
97+ - *core-shared
98+ - *expo-fetcher
99+ - *text-embeddings-pkg
77100 - apps/text-embeddings/**
78- bare-rn:
79- - *shared
101+ bare-rn-app: &bare-rn-app
102+ - *core-shared
103+ - *bare-fetcher
80104 - *llm-pkg
81- - packages/bare-resource-fetcher/**
82105 - apps/bare-rn/**
106+ # Final per-platform per-app filters (the only ones the matrix consumes)
107+ llm-android: [*llm-app, *android-shared]
108+ llm-ios: [*llm-app, *ios-shared]
109+ computer-vision-android: [*computer-vision-app, *android-shared]
110+ computer-vision-ios: [*computer-vision-app, *ios-shared]
111+ speech-android: [*speech-app, *android-shared]
112+ speech-ios: [*speech-app, *ios-shared]
113+ text-embeddings-android: [*text-embeddings-app, *android-shared]
114+ text-embeddings-ios: [*text-embeddings-app, *ios-shared]
115+ bare-rn-android: [*bare-rn-app, *android-shared]
116+ bare-rn-ios: [*bare-rn-app, *ios-shared]
83117
84- - name : Compute matrix
118+ - name : Compute matrices
85119 id : matrix
86120 run : |
121+ all='["llm","computer-vision","speech","text-embeddings","bare-rn"]'
87122 if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
88- echo 'apps=["llm","computer-vision","speech","text-embeddings","bare-rn"]' >> "$GITHUB_OUTPUT"
123+ echo "android_apps=$all" >> "$GITHUB_OUTPUT"
124+ echo "ios_apps=$all" >> "$GITHUB_OUTPUT"
89125 else
90- echo "apps=${{ steps.filter.outputs.changes }}" >> "$GITHUB_OUTPUT"
126+ changes='${{ steps.filter.outputs.changes }}'
127+ android_apps=$(echo "$changes" | jq -c '[.[] | select(endswith("-android")) | sub("-android$"; "")]')
128+ ios_apps=$(echo "$changes" | jq -c '[.[] | select(endswith("-ios")) | sub("-ios$"; "")]')
129+ echo "android_apps=$android_apps" >> "$GITHUB_OUTPUT"
130+ echo "ios_apps=$ios_apps" >> "$GITHUB_OUTPUT"
91131 fi
92132
93- build :
133+ build-android :
94134 needs : detect-changes
95- if : needs.detect-changes.outputs.apps != '[]' && needs.detect-changes.outputs.apps != ''
135+ if : needs.detect-changes.outputs.android_apps != '[]' && needs.detect-changes.outputs.android_apps != ''
96136 runs-on : ubuntu-latest
97137 strategy :
98138 fail-fast : false
99139 matrix :
100- app : ${{ fromJSON(needs.detect-changes.outputs.apps ) }}
140+ app : ${{ fromJSON(needs.detect-changes.outputs.android_apps ) }}
101141 concurrency :
102142 group : android-${{ matrix.app }}-${{ github.ref }}
103143 cancel-in-progress : true
@@ -111,3 +151,25 @@ jobs:
111151 with :
112152 app-path : apps/${{ matrix.app }}
113153 expo-prebuild : ${{ matrix.app == 'bare-rn' && 'false' || 'true' }}
154+
155+ build-ios :
156+ needs : detect-changes
157+ if : needs.detect-changes.outputs.ios_apps != '[]' && needs.detect-changes.outputs.ios_apps != ''
158+ runs-on : macos-latest
159+ strategy :
160+ fail-fast : false
161+ matrix :
162+ app : ${{ fromJSON(needs.detect-changes.outputs.ios_apps) }}
163+ concurrency :
164+ group : ios-${{ matrix.app }}-${{ github.ref }}
165+ cancel-in-progress : true
166+ steps :
167+ - name : Checkout
168+ uses : actions/checkout@v6
169+ with :
170+ submodules : recursive
171+ - name : Build iOS app
172+ uses : ./.github/actions/build-ios-app
173+ with :
174+ app-path : apps/${{ matrix.app }}
175+ expo-prebuild : ${{ matrix.app == 'bare-rn' && 'false' || 'true' }}
0 commit comments