Skip to content

Merge branch 'release/8.17.1' #14887

Merge branch 'release/8.17.1'

Merge branch 'release/8.17.1' #14887

name: Sample Application
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, labeled]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
MAESTRO_VERSION: "2.6.1"
MAESTRO_DRIVER_STARTUP_TIMEOUT: 180000 # Increase timeout from default 30s to 180s for CI stability
RN_SENTRY_POD_NAME: RNSentry
IOS_APP_ARCHIVE_PATH: sentry-react-native-sample.app.zip
ANDROID_APP_ARCHIVE_PATH: sentry-react-native-sample.apk.zip
REACT_NATIVE_SAMPLE_PATH: samples/react-native
IOS_DEVICE: "iPhone 16"
IOS_VERSION: ">=18.0"
ANDROID_API_LEVEL: "30"
jobs:
ready-to-merge-gate:
name: Ready-to-merge gate
uses: ./.github/workflows/ready-to-merge-workflow.yml
with:
is-pr: ${{ github.event_name == 'pull_request' }}
labels: ${{ toJson(github.event.pull_request.labels) }}
diff_check:
needs: [ready-to-merge-gate]
uses: ./.github/workflows/skip-ci.yml
detect-changes:
needs: [ready-to-merge-gate]
uses: ./.github/workflows/detect-changes.yml
with:
caller_event_name: ${{ github.event_name }}
caller_ref: ${{ github.ref }}
build-ios:
name: Build ${{ matrix.rn-architecture }} ios ${{ matrix.build-type }} ${{ matrix.ios-use-frameworks }}
runs-on: macos-26-xlarge
needs: [diff_check, detect-changes]
if: >-
${{
needs.diff_check.outputs.skip_ci != 'true'
&& needs.detect-changes.outputs.needs_sample_react_native == 'true'
&& (needs.detect-changes.outputs.sample_react_native == 'true' || needs.detect-changes.outputs.needs_ios == 'true')
}}
env:
SENTRY_DISABLE_AUTO_UPLOAD: "true"
strategy:
fail-fast: false
matrix:
rn-architecture: ["new"]
ios-use-frameworks: ["no-frameworks"]
build-type: ["dev", "production"]
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Enable Corepack
run: corepack enable
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
package-manager-cache: false
node-version: 22
cache: "yarn"
cache-dependency-path: yarn.lock
- uses: ruby/setup-ruby@9eb537ca036ebaed86729dcb9309076e4c5c3b74 # v1
with:
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
ruby-version: "3.3.0" # based on what is used in the sample
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
cache-version: 1 # cache the installed gems
- name: Setup Global Xcode Tools
run: which xcbeautify || brew install xcbeautify
- name: Install SDK Dependencies
run: yarn install
- name: Build SDK
run: yarn build
- name: Install App Pods
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: |
[[ "${{ matrix.build-type }}" == "production" ]] && export ENABLE_PROD=1 || export ENABLE_PROD=0
[[ "${{ matrix.rn-architecture }}" == "new" ]] && export ENABLE_NEW_ARCH=1 || export ENABLE_NEW_ARCH=0
[[ "${{ matrix.ios-use-frameworks }}" == "dynamic-frameworks" ]] && export USE_FRAMEWORKS=dynamic
./scripts/pod-install.sh
- name: Build iOS App
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
env:
# Fix for Xcode 26+ with MetalToolchain: use default Xcode toolchain to avoid
# missing Swift compatibility libraries (swiftCompatibility56, etc.)
# See: https://github.com/actions/runner-images/issues/13135
TOOLCHAINS: com.apple.dt.toolchain.XcodeDefault
run: |
[[ "${{ matrix.build-type }}" == "production" ]] && export CONFIG='Release' || export CONFIG='Debug'
./scripts/set-dsn-ios.mjs
./scripts/build-ios.sh
- name: Archive iOS App
if: ${{ matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }}
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: |
zip -r \
${{ github.workspace }}/${{ env.IOS_APP_ARCHIVE_PATH }} \
sentryreactnativesample.app
- name: Upload iOS APP
if: ${{ matrix.rn-architecture == 'new' && matrix.build-type == 'production' && matrix.ios-use-frameworks == 'no-frameworks' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-ios
path: ${{ env.IOS_APP_ARCHIVE_PATH }}
retention-days: 1
- name: Upload logs
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: build-sample-${{ matrix.rn-architecture }}-ios-${{ matrix.build-type }}-${{ matrix.ios-use-frameworks}}-logs
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/ios/*.log
build-android:
name: Build ${{ matrix.rn-architecture }} android ${{ matrix.build-type }}
runs-on: ubuntu-latest
needs: [diff_check, detect-changes]
if: >-
${{
needs.diff_check.outputs.skip_ci != 'true'
&& needs.detect-changes.outputs.needs_sample_react_native == 'true'
&& (needs.detect-changes.outputs.sample_react_native == 'true' || needs.detect-changes.outputs.needs_android == 'true')
}}
env:
SENTRY_DISABLE_AUTO_UPLOAD: "true"
strategy:
fail-fast: false
matrix:
rn-architecture: ["new"]
build-type: ["dev", "production"]
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Enable Corepack (NPM)
run: npm i -g corepack
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
package-manager-cache: false
node-version: 22
cache: "yarn"
cache-dependency-path: yarn.lock
- uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5
with:
java-version: "17"
distribution: "adopt"
- name: Gradle cache
uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6
- name: Install SDK Dependencies
run: yarn install
- name: Build SDK
run: yarn build
- name: Build Android App
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: |
export RN_ARCHITECTURE="${{ matrix.rn-architecture }}"
[[ "${{ matrix.build-type }}" == "production" ]] && export CONFIG='release' || export CONFIG='debug'
./scripts/set-dsn-aos.mjs
./scripts/build-android.sh -PreactNativeArchitectures=x86
- name: Check 16 KB native library alignment
# Only Sentry-owned libraries are checked: third-party/React Native
# libraries are aligned by their own build (RN ships arm64 at 16 KB but
# x86 at 4 KB, and CI builds x86), so a whole-APK check is not
# meaningful here. Guards against regressing #6394.
run: ./scripts/check-android-16kb-alignment.sh ${{ env.REACT_NATIVE_SAMPLE_PATH }}/app.apk 'libsentry'
- name: Archive Android App
if: ${{ matrix.rn-architecture == 'new' && matrix.build-type == 'production' }}
run: |
zip -j \
${{ env.ANDROID_APP_ARCHIVE_PATH }} \
${{ env.REACT_NATIVE_SAMPLE_PATH }}/app.apk \
${{ env.REACT_NATIVE_SAMPLE_PATH }}/app-androidTest.apk
- name: Upload Android APK
if: ${{ matrix.rn-architecture == 'new' && matrix.build-type == 'production' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: sample-rn-${{ matrix.rn-architecture }}-${{ matrix.build-type }}-android
path: ${{ env.ANDROID_APP_ARCHIVE_PATH }}
retention-days: 1
- name: Upload logs
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: build-sample-${{ matrix.rn-architecture }}-android-${{ matrix.build-type }}-no-frameworks-logs
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }}/android/*.log
build-macos:
name: Build legacy macos ${{ matrix.build-type }}
runs-on: macos-15-xlarge
needs: [diff_check, detect-changes]
if: >-
${{
needs.diff_check.outputs.skip_ci != 'true'
&& needs.detect-changes.outputs.needs_sample_react_native == 'true'
&& (needs.detect-changes.outputs.sample_react_native == 'true' || needs.detect-changes.outputs.needs_ios == 'true')
}}
env:
SENTRY_DISABLE_AUTO_UPLOAD: "true"
strategy:
fail-fast: false
matrix:
build-type: ["dev", "production"]
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Enable Corepack
run: corepack enable
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
package-manager-cache: false
node-version: 22
cache: "yarn"
cache-dependency-path: yarn.lock
- uses: ruby/setup-ruby@9eb537ca036ebaed86729dcb9309076e4c5c3b74 # v1
with:
working-directory: samples/react-native-macos
ruby-version: "3.3.0" # based on what is used in the sample
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
cache-version: 1 # cache the installed gems
- name: Setup Global Xcode Tools
run: which xcbeautify || brew install xcbeautify
- name: Install SDK Dependencies
run: yarn install
- name: Build SDK
run: yarn build
- name: Install App Pods
working-directory: samples/react-native-macos
run: |
[[ "${{ matrix.build-type }}" == "production" ]] && export ENABLE_PROD=1 || export ENABLE_PROD=0
export ENABLE_NEW_ARCH=0
./scripts/pod-install.sh
- name: Build macOS App
working-directory: samples/react-native-macos/macos
run: |
[[ "${{ matrix.build-type }}" == "production" ]] && export CONFIG='Release' || export CONFIG='Debug'
echo "Building $CONFIG"
mkdir -p "DerivedData"
derivedData="$(cd "DerivedData" ; pwd -P)"
set -o pipefail && xcodebuild \
-workspace sentry-react-native-sample.xcworkspace \
-configuration "$CONFIG" \
-scheme sentry-react-native-sample-macOS \
-destination 'platform=macOS' \
ONLY_ACTIVE_ARCH=yes \
-derivedDataPath "$derivedData" \
build \
| tee xcodebuild.log \
| xcbeautify --quieter --is-ci --disable-colored-output
- name: Upload logs
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: build-sample-legacy-macos-${{ matrix.build-type }}-no-frameworks-logs
path: samples/react-native-macos/macos/*.log
test-ios:
name: Test ios production REV2 on ${{matrix.runner_provider}}
runs-on: ${{ matrix.runner_provider == 'bitrise' && fromJSON('["bitrise_pool_name:tahoe"]') || fromJSON('["ghcr.io/cirruslabs/macos-tahoe-xcode:26.2.0", "runner_group_id:10"]') }}
continue-on-error: ${{ matrix.runner_provider == 'bitrise' }}
needs: [diff_check, detect-changes, build-ios]
if: >-
${{
needs.diff_check.outputs.skip_ci != 'true'
&& needs.detect-changes.outputs.needs_sample_react_native == 'true'
&& (needs.detect-changes.outputs.sample_react_native == 'true' || needs.detect-changes.outputs.needs_ios == 'true')
}}
strategy:
fail-fast: false
matrix:
runner_provider: ["cirrus", "bitrise"]
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Install Maestro
uses: dniHze/maestro-test-action@bda8a93211c86d0a05b7a4597c5ad134566fbde4 # pin@v1.0.0
with:
version: ${{env.MAESTRO_VERSION}}
- name: Download iOS App Archive
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: sample-rn-new-production-no-frameworks-ios
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
- name: Unzip iOS App Archive
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: unzip ${{ env.IOS_APP_ARCHIVE_PATH }}
- name: Enable Corepack
run: corepack enable
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
package-manager-cache: false
node-version: 22
cache: "yarn"
cache-dependency-path: yarn.lock
- name: Setup asdf Node.js (Bitrise)
if: matrix.runner_provider == 'bitrise'
run: |
asdf global nodejs system
corepack enable
- name: Install JS Dependencies
run: yarn install
- name: Boot ${{ env.IOS_DEVICE }} with iOS ${{ env.IOS_VERSION }}
uses: futureware-tech/simulator-action@e89aa8f93d3aec35083ff49d2854d07f7186f7f5 # pin@v5
with:
model: ${{ env.IOS_DEVICE }}
os_version: ${{ env.IOS_VERSION }}
wait_for_boot: true
erase_before_boot: false
- name: Wait for iOS simulator to be fully ready
run: |
xcrun simctl bootstatus booted -b
xcrun simctl launch booted com.apple.Preferences
sleep 5
xcrun simctl terminate booted com.apple.Preferences
- name: Warm up Maestro driver on iOS
continue-on-error: true
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: |
xcrun simctl install booted sentryreactnativesample.app
WARMUP=$(mktemp /tmp/maestro-warmup-XXXXXX.yml)
cat > "$WARMUP" << 'YML'
appId: io.sentry.reactnative.sample
---
- launchApp:
clearState: true
- extendedWaitUntil:
visible: "Sentry React Native Sample"
timeout: 120000
- killApp
YML
sed -i '' 's/^ //' "$WARMUP"
maestro test "$WARMUP" || true
rm -f "$WARMUP"
- name: Run iOS Tests
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: yarn test-ios
test-android:
name: Test android production REV2
runs-on: ubuntu-latest
needs: [diff_check, detect-changes, build-android]
if: >-
${{
needs.diff_check.outputs.skip_ci != 'true'
&& needs.detect-changes.outputs.needs_sample_react_native == 'true'
&& (needs.detect-changes.outputs.sample_react_native == 'true' || needs.detect-changes.outputs.needs_android == 'true')
}}
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Install Maestro
uses: dniHze/maestro-test-action@bda8a93211c86d0a05b7a4597c5ad134566fbde4 # pin@v1.0.0
with:
version: ${{env.MAESTRO_VERSION}}
- name: Download Android APK
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: sample-rn-new-production-android
path: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
- name: Unzip Android APK
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
run: |
unzip ${{ env.ANDROID_APP_ARCHIVE_PATH }}
rm app-androidTest.apk
- name: Enable Corepack (NPM)
run: npm i -g corepack
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
package-manager-cache: false
node-version: 22
cache: "yarn"
cache-dependency-path: yarn.lock
- name: Install JS Dependencies
run: yarn install
- uses: ./.github/actions/disk-cleanup
- name: Setup KVM
shell: bash
run: |
# check if virtualization is supported...
sudo apt install -y --no-install-recommends cpu-checker coreutils && echo "CPUs=$(nproc --all)" && kvm-ok
# allow access to KVM to run the emulator
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
| sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run Android Tests on API ${{ env.ANDROID_API_LEVEL }}
uses: reactivecircus/android-emulator-runner@e89f39f1abbbd05b1113a29cf4db69e7540cae5a # pin@v2.37.0
with:
api-level: ${{ env.ANDROID_API_LEVEL }}
# Pin the emulator binary: canary 37.1.6.0 (build 15726199) broke emulator
# networking (no egress to 10.0.2.2 mock server or external internet), which
# makes the whole E2E suite time out. 37.1.5.0 (build 15679343) is the last
# known-good build. Remove once a fixed canary emulator ships.
emulator-build: 15679343
force-avd-creation: false
disable-animations: true
disable-spellchecker: true
target: "aosp_atd"
channel: canary # Necessary for ATDs
disk-size: 4096M
emulator-options: >
-no-window
-no-snapshot-save
-gpu swiftshader_indirect
-noaudio
-no-boot-anim
-camera-back none
-camera-front none
-timezone US/Pacific
working-directory: ${{ env.REACT_NATIVE_SAMPLE_PATH }}
script: yarn test-android