@@ -13,7 +13,14 @@ concurrency:
1313
1414env :
1515 SENTRY_AUTH_TOKEN : ${{ secrets.SENTRY_AUTH_TOKEN }}
16+ MAESTRO_VERSION : ' 1.39.0'
1617 RN_SENTRY_POD_NAME : RNSentry
18+ IOS_APP_ARCHIVE_PATH : sentry-react-native-sample.app.zip
19+ ANDROID_APP_ARCHIVE_PATH : sentry-react-native-sample.apk.zip
20+ REACT_NATIVE_SAMPLE_PATH : samples/react-native
21+ IOS_DEVICE : ' iPhone 16'
22+ IOS_VERSION : ' 18.1'
23+ ANDROID_API_LEVEL : ' 30'
1724
1825jobs :
1926 diff_check :
6673 - uses : ruby/setup-ruby@v1
6774 if : ${{ matrix.platform == 'ios' || matrix.platform == 'macos' }}
6875 with :
69- working-directory : ${{ matrix.platform == 'ios' && ' samples/react-native' || ' samples/react-native-macos' }}
76+ working-directory : ${{ matrix.platform == 'ios' && env.REACT_NATIVE_SAMPLE_PATH || ' samples/react-native-macos' }}
7077 ruby-version : ' 3.3.0' # based on what is used in the sample
7178 bundler-cache : true # runs 'bundle install' and caches installed gems automatically
7279 cache-version : 1 # cache the installed gems
@@ -106,7 +113,7 @@ jobs:
106113
107114 - name : Build Android App
108115 if : ${{ matrix.platform == 'android' }}
109- working-directory : samples/react-native /android
116+ working-directory : ${{ env.REACT_NATIVE_SAMPLE_PATH }} /android
110117 run : |
111118 if [[ ${{ matrix.rn-architecture }} == 'new' ]]; then
112119 perl -i -pe's/newArchEnabled=false/newArchEnabled=true/g' gradle.properties
@@ -119,11 +126,14 @@ jobs:
119126 fi
120127 [[ "${{ matrix.build-type }}" == "production" ]] && CONFIG='Release' || CONFIG='Debug'
121128 echo "Building $CONFIG"
129+ [[ "${{ matrix.build-type }}" == "production" ]] && TEST_TYPE='release' || TEST_TYPE='debug'
130+ echo "Building $TEST_TYPE"
131+
122132 ./gradlew ":app:assemble$CONFIG" -PreactNativeArchitectures=x86
123133
124134 - name : Build iOS App
125135 if : ${{ matrix.platform == 'ios' }}
126- working-directory : samples/react-native /ios
136+ working-directory : ${{ env.REACT_NATIVE_SAMPLE_PATH }} /ios
127137 run : |
128138 [[ "${{ matrix.build-type }}" == "production" ]] && CONFIG='Release' || CONFIG='Debug'
129139 echo "Building $CONFIG"
@@ -160,9 +170,153 @@ jobs:
160170 | tee xcodebuild.log \
161171 | xcbeautify --quieter --is-ci --disable-colored-output
162172
173+ - name : Archive iOS App
174+ if : ${{ matrix.platform == 'ios' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }}
175+ run : |
176+ cd ${{ env.REACT_NATIVE_SAMPLE_PATH }}/ios/DerivedData/Build/Products/Release-iphonesimulator
177+ zip -r \
178+ ${{ github.workspace }}/${{ env.IOS_APP_ARCHIVE_PATH }} \
179+ sentryreactnativesample.app
180+
181+ - name : Archive Android App
182+ if : ${{ matrix.platform == 'android' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' }}
183+ run : |
184+ mv ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android/app/build/outputs/apk/release/app-release.apk app.apk
185+ zip -j \
186+ ${{ env.ANDROID_APP_ARCHIVE_PATH }} \
187+ app.apk
188+
189+ - name : Upload iOS APP
190+ if : ${{ matrix.platform == 'ios' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }}
191+ uses : actions/upload-artifact@v4
192+ with :
193+ name : sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-${{ matrix.platform }}
194+ path : ${{ env.IOS_APP_ARCHIVE_PATH }}
195+ retention-days : 1
196+
197+ - name : Upload Android APK
198+ if : ${{ matrix.platform == 'android' && matrix.rn-architecture == 'new' && matrix.build-type == 'production' }}
199+ uses : actions/upload-artifact@v4
200+ with :
201+ name : sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.platform }}
202+ path : ${{ env.ANDROID_APP_ARCHIVE_PATH }}
203+ retention-days : 1
204+
163205 - name : Upload logs
164206 if : ${{ always() }}
165207 uses : actions/upload-artifact@v4
166208 with :
167209 name : build-sample-${{ matrix.rn-architecture }}-${{ matrix.platform }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-logs
168- path : samples/react-native/${{ matrix.platform }}/*.log
210+ path : ${{ env.REACT_NATIVE_SAMPLE_PATH }}/${{ matrix.platform }}/*.log
211+
212+ test :
213+ name : Test ${{ matrix.platform }} ${{ matrix.build-type }}
214+ runs-on : ${{ matrix.runs-on }}
215+ needs : [diff_check, build]
216+ if : ${{ needs.diff_check.outputs.skip_ci != 'true' }}
217+ strategy :
218+ # we want that the matrix keeps running, default is to cancel them if it fails.
219+ fail-fast : false
220+ matrix :
221+ include :
222+ - platform : ios
223+ runs-on : macos-15
224+ rn-architecture : ' new'
225+ ios-use-frameworks : ' no-frameworks'
226+ build-type : ' production'
227+
228+ - platform : android
229+ runs-on : ubuntu-latest
230+ rn-architecture : ' new'
231+ build-type : ' production'
232+
233+ steps :
234+ - uses : actions/checkout@v4
235+
236+ - name : Install Maestro
237+ uses :
dniHze/maestro-test-action@bda8a93211c86d0a05b7a4597c5ad134566fbde4 # [email protected] 238+ with :
239+ version : ${{env.MAESTRO_VERSION}}
240+
241+ - name : Download iOS App Archive
242+ if : ${{ matrix.platform == 'ios' }}
243+ uses : actions/download-artifact@v4
244+ with :
245+ name : sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-${{ matrix.platform }}
246+ path : ${{ env.REACT_NATIVE_SAMPLE_PATH }}
247+
248+ - name : Download Android APK
249+ if : ${{ matrix.platform == 'android' }}
250+ uses : actions/download-artifact@v4
251+ with :
252+ name : sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.platform }}
253+ path : ${{ env.REACT_NATIVE_SAMPLE_PATH }}
254+
255+ - name : Unzip iOS App Archive
256+ if : ${{ matrix.platform == 'ios' }}
257+ working-directory : ${{ env.REACT_NATIVE_SAMPLE_PATH }}
258+ run : unzip ${{ env.IOS_APP_ARCHIVE_PATH }}
259+
260+ - name : Unzip Android APK
261+ if : ${{ matrix.platform == 'android' }}
262+ working-directory : ${{ env.REACT_NATIVE_SAMPLE_PATH }}
263+ run : unzip ${{ env.ANDROID_APP_ARCHIVE_PATH }}
264+
265+ - name : Enable Corepack
266+ run : |
267+ 268+ corepack enable
269+ - uses : actions/setup-node@v4
270+ with :
271+ node-version : 18
272+ cache : ' yarn'
273+ cache-dependency-path : yarn.lock
274+
275+ - name : Install JS Dependencies
276+ run : yarn install
277+
278+ - name : Setup KVM
279+ if : ${{ matrix.platform == 'android' }}
280+ shell : bash
281+ run : |
282+ # check if virtualization is supported...
283+ sudo apt install -y --no-install-recommends cpu-checker coreutils && echo "CPUs=$(nproc --all)" && kvm-ok
284+ # allow access to KVM to run the emulator
285+ echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
286+ | sudo tee /etc/udev/rules.d/99-kvm4all.rules
287+ sudo udevadm control --reload-rules
288+ sudo udevadm trigger --name-match=kvm
289+
290+ - name : Boot ${{ env.IOS_DEVICE }} with iOS ${{ env.IOS_VERSION }}
291+ uses : futureware-tech/simulator-action@dab10d813144ef59b48d401cd95da151222ef8cd # pin@v4
292+ if : ${{ matrix.platform == 'ios' }}
293+ with :
294+ model : ${{ env.IOS_DEVICE }}
295+ os_version : ${{ env.IOS_VERSION }}
296+
297+ - name : Run iOS Tests
298+ if : ${{ matrix.platform == 'ios' }}
299+ working-directory : ${{ env.REACT_NATIVE_SAMPLE_PATH }}
300+ run : yarn test-ios
301+
302+ - name : Run Android Tests on API ${{ env.ANDROID_API_LEVEL }}
303+ if : ${{ matrix.platform == 'android' }}
304+ uses :
reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d # [email protected] 305+ with :
306+ api-level : ${{ env.ANDROID_API_LEVEL }}
307+ force-avd-creation : false
308+ disable-animations : true
309+ disable-spellchecker : true
310+ target : ' aosp_atd'
311+ channel : canary # Necessary for ATDs
312+ emulator-options : >
313+ -no-window
314+ -no-snapshot-save
315+ -gpu swiftshader_indirect
316+ -noaudio
317+ -no-boot-anim
318+ -camera-back none
319+ -camera-front none
320+ -timezone US/Pacific
321+ working-directory : ${{ env.REACT_NATIVE_SAMPLE_PATH }}
322+ script : yarn test-android
0 commit comments