diff --git a/.github/workflows/buildandtest.yml b/.github/workflows/buildandtest.yml index 0264ba07da..bd47d0c1d4 100644 --- a/.github/workflows/buildandtest.yml +++ b/.github/workflows/buildandtest.yml @@ -168,6 +168,87 @@ jobs: ${{ github.workspace }}/packages/core/*.tgz ${{ github.workspace }}/packages/expo-upload-sourcemaps/*.tgz + job_validate_tarball: + name: Validate tarball + runs-on: ["ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04", "runner_group_id:10"] + needs: [job_build, diff_check] + if: ${{ needs.diff_check.outputs.skip_ci != 'true' }} + timeout-minutes: 5 + steps: + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + with: + node-version: 18 + - name: Download tarball artifacts + uses: actions/download-artifact@v8 + with: + name: ${{ github.sha }} + path: artifacts + - name: Verify executable bits in tarball + run: | + set -e + TARBALL=$(find artifacts -name 'sentry-react-native-*.tgz' -print -quit) + [ -n "$TARBALL" ] || { echo "::error::tarball not found in artifacts/"; exit 1; } + echo "Tarball: $TARBALL" + FAILED=0 + for entry in package/scripts/sentry-xcode.sh \ + package/scripts/sentry-xcode-debug-files.sh \ + package/scripts/collect-modules.sh \ + package/scripts/eas-build-hook.js \ + package/scripts/expo-upload-sourcemaps.js; do + mode=$(tar -tvf "$TARBALL" "$entry" 2>/dev/null | awk 'NR==1{print $1}') + if [ -z "$mode" ]; then + echo "::error::$entry missing from tarball" + FAILED=1 + elif [ "$mode" != "-rwxr-xr-x" ]; then + echo "::error::$entry has mode $mode, expected -rwxr-xr-x" + FAILED=1 + else + echo "OK: $entry ($mode)" + fi + done + exit $FAILED + - name: Install tarball into fresh project + run: | + set -e + CORE_TARBALL=$(find "$PWD/artifacts" -name 'sentry-react-native-*.tgz' -print -quit) + EXPO_TARBALL=$(find "$PWD/artifacts" -name 'sentry-expo-upload-sourcemaps-*.tgz' -print -quit) + [ -n "$CORE_TARBALL" ] || { echo "::error::core tarball not found"; exit 1; } + [ -n "$EXPO_TARBALL" ] || { echo "::error::expo-upload-sourcemaps tarball not found"; exit 1; } + mkdir -p /tmp/install-test + cd /tmp/install-test + npm init -y >/dev/null + # Install both local tarballs together so the @sentry/expo-upload-sourcemaps + # cross-dep is satisfied locally. On a release branch the bumped version + # is not on the npm registry yet (workspace:* resolves to the version + # we are about to publish), and a registry fetch would fail with ETARGET. + npm install --no-save "$EXPO_TARBALL" "$CORE_TARBALL" + # workspace:* spec must have been resolved by yarn pack (#6037 regression) + if grep -q 'workspace:' node_modules/@sentry/react-native/package.json; then + echo "::error::published package.json still contains unresolved workspace: spec" + grep workspace: node_modules/@sentry/react-native/package.json + exit 1 + fi + # bin entries must be linked into node_modules/.bin and executable + for bin in sentry-eas-build-on-complete \ + sentry-eas-build-on-error \ + sentry-eas-build-on-success \ + sentry-expo-upload-sourcemaps; do + if [ ! -x "node_modules/.bin/$bin" ]; then + echo "::error::node_modules/.bin/$bin missing or not executable" + ls -la node_modules/.bin/ | grep -i sentry || true + exit 1 + fi + echo "OK: node_modules/.bin/$bin" + done + # sentry-xcode.sh is invoked directly by the iOS build phase, so it + # must remain executable after install (#6047) + if [ ! -x node_modules/@sentry/react-native/scripts/sentry-xcode.sh ]; then + echo "::error::scripts/sentry-xcode.sh is not executable after install" + ls -la node_modules/@sentry/react-native/scripts/sentry-xcode.sh + exit 1 + fi + echo "OK: scripts/sentry-xcode.sh executable" + job_type_check: name: Type Check Typescript 3.8 runs-on: ["ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04", "runner_group_id:10"] diff --git a/CHANGELOG.md b/CHANGELOG.md index 282b510ba4..b3513bc460 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,13 @@ - [changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md#10500) - [diff](https://github.com/getsentry/sentry-javascript/compare/10.49.0...10.50.0) +## 8.9.2 + +### Fixes + +- Restore executable bit on shell scripts in the published tarball, fixing `Permission denied` on iOS build ([#6049](https://github.com/getsentry/sentry-react-native/pull/6049)) +- Restore EAS build hook bin scripts (`sentry-eas-build-on-{success,error,complete}`) missing from the published tarball ([#6049](https://github.com/getsentry/sentry-react-native/pull/6049)) + ## 8.9.1 ### Features diff --git a/SDK-VERSIONS.md b/SDK-VERSIONS.md index 5af4216820..848704bd42 100644 --- a/SDK-VERSIONS.md +++ b/SDK-VERSIONS.md @@ -12,6 +12,7 @@ To manually update the table with the current version, run `./scripts/update-sdk | React Native SDK | Android SDK | Cocoa SDK | JavaScript SDK | | ---------------- | ----------- | --------- | -------------- | +| [8.9.2](https://github.com/getsentry/sentry-react-native/releases/tag/8.9.2) | [8.40.0](https://github.com/getsentry/sentry-java/releases/tag/8.40.0) | [9.11.0](https://github.com/getsentry/sentry-cocoa/releases/tag/9.11.0) | [10.49.0](https://github.com/getsentry/sentry-javascript/releases/tag/10.49.0) | | [8.9.1](https://github.com/getsentry/sentry-react-native/releases/tag/8.9.1) | [8.40.0](https://github.com/getsentry/sentry-java/releases/tag/8.40.0) | [9.11.0](https://github.com/getsentry/sentry-cocoa/releases/tag/9.11.0) | [10.49.0](https://github.com/getsentry/sentry-javascript/releases/tag/10.49.0) | | [8.8.0](https://github.com/getsentry/sentry-react-native/releases/tag/8.8.0) | [8.38.0](https://github.com/getsentry/sentry-java/releases/tag/8.38.0) | [9.10.0](https://github.com/getsentry/sentry-cocoa/releases/tag/9.10.0) | [10.48.0](https://github.com/getsentry/sentry-javascript/releases/tag/10.48.0) | | [8.7.0](https://github.com/getsentry/sentry-react-native/releases/tag/8.7.0) | [8.37.1](https://github.com/getsentry/sentry-java/releases/tag/8.37.1) | [9.8.0](https://github.com/getsentry/sentry-cocoa/releases/tag/9.8.0) | [10.47.0](https://github.com/getsentry/sentry-javascript/releases/tag/10.47.0) | diff --git a/dev-packages/e2e-tests/package.json b/dev-packages/e2e-tests/package.json index c01d7dabd9..adc042a3af 100644 --- a/dev-packages/e2e-tests/package.json +++ b/dev-packages/e2e-tests/package.json @@ -1,6 +1,6 @@ { "name": "sentry-react-native-e2e-tests", - "version": "8.9.1", + "version": "8.9.2", "private": true, "description": "Sentry React Native End to End Tests Library", "main": "dist/index.js", @@ -14,7 +14,7 @@ "@babel/preset-env": "^7.25.3", "@babel/preset-typescript": "^7.18.6", "@sentry/core": "10.50.0", - "@sentry/react-native": "8.9.1", + "@sentry/react-native": "8.9.2", "@types/node": "^20.9.3", "@types/react": "^18.2.64", "appium": "3.2.2", diff --git a/dev-packages/type-check/package.json b/dev-packages/type-check/package.json index d2d028e601..2652f5197f 100644 --- a/dev-packages/type-check/package.json +++ b/dev-packages/type-check/package.json @@ -1,7 +1,7 @@ { "name": "sentry-react-native-type-check", "private": true, - "version": "8.9.1", + "version": "8.9.2", "scripts": { "type-check": "./run-type-check.sh" } diff --git a/dev-packages/utils/package.json b/dev-packages/utils/package.json index d56696c423..5b1585eb02 100644 --- a/dev-packages/utils/package.json +++ b/dev-packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "sentry-react-native-samples-utils", - "version": "8.9.1", + "version": "8.9.2", "description": "Internal Samples Utils", "main": "index.js", "license": "MIT", diff --git a/lerna.json b/lerna.json index a4dbc87ca2..03959ed877 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "8.9.1", + "version": "8.9.2", "packages": [ "packages/*", "dev-packages/*", diff --git a/packages/core/.npmignore b/packages/core/.npmignore index 49af5a37e2..a8241b93f9 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -27,6 +27,7 @@ !scripts/sentry-xcode-debug-files.sh !scripts/sentry_utils.rb !scripts/expo-upload-sourcemaps.js +!scripts/eas-build-hook.js # Metro !/metro.js diff --git a/packages/core/android/src/main/java/io/sentry/react/RNSentryVersion.java b/packages/core/android/src/main/java/io/sentry/react/RNSentryVersion.java index f97c096ed8..45d80a1f21 100644 --- a/packages/core/android/src/main/java/io/sentry/react/RNSentryVersion.java +++ b/packages/core/android/src/main/java/io/sentry/react/RNSentryVersion.java @@ -2,7 +2,7 @@ class RNSentryVersion { static final String REACT_NATIVE_SDK_PACKAGE_NAME = "npm:@sentry/react-native"; - static final String REACT_NATIVE_SDK_PACKAGE_VERSION = "8.9.1"; + static final String REACT_NATIVE_SDK_PACKAGE_VERSION = "8.9.2"; static final String NATIVE_SDK_NAME = "sentry.native.android.react-native"; static final String ANDROID_SDK_NAME = "sentry.java.android.react-native"; static final String REACT_NATIVE_SDK_NAME = "sentry.javascript.react-native"; diff --git a/packages/core/ios/RNSentryVersion.m b/packages/core/ios/RNSentryVersion.m index 10982b744a..297aad9631 100644 --- a/packages/core/ios/RNSentryVersion.m +++ b/packages/core/ios/RNSentryVersion.m @@ -3,4 +3,4 @@ NSString *const NATIVE_SDK_NAME = @"sentry.cocoa.react-native"; NSString *const REACT_NATIVE_SDK_NAME = @"sentry.javascript.react-native"; NSString *const REACT_NATIVE_SDK_PACKAGE_NAME = @"npm:@sentry/react-native"; -NSString *const REACT_NATIVE_SDK_PACKAGE_VERSION = @"8.9.1"; +NSString *const REACT_NATIVE_SDK_PACKAGE_VERSION = @"8.9.2"; diff --git a/packages/core/package.json b/packages/core/package.json index d4126e4e68..5b57c5f50f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -2,7 +2,7 @@ "name": "@sentry/react-native", "homepage": "https://github.com/getsentry/sentry-react-native", "repository": "https://github.com/getsentry/sentry-react-native", - "version": "8.9.1", + "version": "8.9.2", "description": "Official Sentry SDK for react-native", "typings": "dist/js/index.d.ts", "types": "dist/js/index.d.ts", diff --git a/packages/core/scripts/build-tarball.sh b/packages/core/scripts/build-tarball.sh index 9be5f160ad..4af6809b41 100755 --- a/packages/core/scripts/build-tarball.sh +++ b/packages/core/scripts/build-tarball.sh @@ -14,4 +14,16 @@ cp ../../README.md README.md # rewritten to concrete versions in the published tarball. npm pack leaves # the spec as `workspace:*`, which consumers cannot resolve. VERSION=$(node -p "require('./package.json').version") -yarn pack --out "sentry-react-native-${VERSION}.tgz" +TARBALL="sentry-react-native-${VERSION}.tgz" +yarn pack --out "$TARBALL" + +# yarn pack stores non-bin files with mode 0644, which breaks the Xcode build +# phase that invokes scripts/sentry-xcode.sh directly (Permission denied). +# Re-pack with +x on shell scripts and bin entrypoints. +TMP_DIR=$(mktemp -d) +trap 'rm -rf "$TMP_DIR"' EXIT +tar -xzf "$TARBALL" -C "$TMP_DIR" +chmod 0755 "$TMP_DIR"/package/scripts/*.sh \ + "$TMP_DIR"/package/scripts/eas-build-hook.js \ + "$TMP_DIR"/package/scripts/expo-upload-sourcemaps.js +tar -czf "$TARBALL" -C "$TMP_DIR" package diff --git a/packages/core/src/js/version.ts b/packages/core/src/js/version.ts index f08b05ed7d..db90904db1 100644 --- a/packages/core/src/js/version.ts +++ b/packages/core/src/js/version.ts @@ -1,3 +1,3 @@ export const SDK_PACKAGE_NAME = 'npm:@sentry/react-native'; export const SDK_NAME = 'sentry.javascript.react-native'; -export const SDK_VERSION = '8.9.1'; +export const SDK_VERSION = '8.9.2'; diff --git a/packages/expo-upload-sourcemaps/package.json b/packages/expo-upload-sourcemaps/package.json index bbc3d74c25..faf53acad4 100644 --- a/packages/expo-upload-sourcemaps/package.json +++ b/packages/expo-upload-sourcemaps/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/expo-upload-sourcemaps", - "version": "8.9.1", + "version": "8.9.2", "description": "CLI to upload bundles and source maps from Expo builds to Sentry.", "homepage": "https://github.com/getsentry/sentry-react-native/tree/main/packages/expo-upload-sourcemaps", "repository": { diff --git a/performance-tests/TestAppPlain/package.json b/performance-tests/TestAppPlain/package.json index c6cf2bca0d..b2416501ee 100644 --- a/performance-tests/TestAppPlain/package.json +++ b/performance-tests/TestAppPlain/package.json @@ -1,6 +1,6 @@ { "name": "TestAppPlain", - "version": "8.9.1", + "version": "8.9.2", "private": true, "scripts": { "android": "react-native run-android", diff --git a/performance-tests/TestAppSentry/package.json b/performance-tests/TestAppSentry/package.json index 4e1184d59a..4b6d9749f8 100644 --- a/performance-tests/TestAppSentry/package.json +++ b/performance-tests/TestAppSentry/package.json @@ -1,6 +1,6 @@ { "name": "TestAppSentry", - "version": "8.9.1", + "version": "8.9.2", "private": true, "scripts": { "android": "react-native run-android", @@ -9,7 +9,7 @@ }, "dependencies": { "@react-native/new-app-screen": "0.80.2", - "@sentry/react-native": "8.9.1", + "@sentry/react-native": "8.9.2", "react": "19.1.0", "react-native": "0.80.2" }, diff --git a/samples/expo/app.json b/samples/expo/app.json index cb757b4eb7..4d7f4d8f19 100644 --- a/samples/expo/app.json +++ b/samples/expo/app.json @@ -4,7 +4,7 @@ "slug": "sentry-react-native-expo-sample", "jsEngine": "hermes", "scheme": "sentry-expo-sample", - "version": "8.9.1", + "version": "8.9.2", "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "light", @@ -19,7 +19,7 @@ "ios": { "supportsTablet": true, "bundleIdentifier": "io.sentry.expo.sample", - "buildNumber": "82" + "buildNumber": "83" }, "android": { "adaptiveIcon": { @@ -27,7 +27,7 @@ "backgroundColor": "#ffffff" }, "package": "io.sentry.expo.sample", - "versionCode": 82 + "versionCode": 83 }, "web": { "bundler": "metro", diff --git a/samples/expo/package.json b/samples/expo/package.json index 05cb1f24b7..b14fec0b3f 100644 --- a/samples/expo/package.json +++ b/samples/expo/package.json @@ -1,6 +1,6 @@ { "name": "sentry-react-native-expo-sample", - "version": "8.9.1", + "version": "8.9.2", "main": "expo-router/entry", "scripts": { "start": "expo start", @@ -24,7 +24,7 @@ }, "dependencies": { "@sentry/core": "10.50.0", - "@sentry/react-native": "8.9.1", + "@sentry/react-native": "8.9.2", "@types/react": "~19.2.10", "expo": "^55.0.0", "expo-constants": "~55.0.7", diff --git a/samples/react-native-macos/package.json b/samples/react-native-macos/package.json index 85d9506750..4c3f04386e 100644 --- a/samples/react-native-macos/package.json +++ b/samples/react-native-macos/package.json @@ -1,6 +1,6 @@ { "name": "sentry-react-native-macos-sample", - "version": "8.9.1", + "version": "8.9.2", "private": true, "scripts": { "start": "react-native start --experimental-debugger", @@ -18,7 +18,7 @@ "@react-navigation/stack": "^6.3.20", "@sentry/core": "10.50.0", "@sentry/react": "10.50.0", - "@sentry/react-native": "8.9.1", + "@sentry/react-native": "8.9.2", "delay": "^6.0.0", "react": "18.2.0", "react-native": "0.73.9", diff --git a/samples/react-native/android/app/build.gradle b/samples/react-native/android/app/build.gradle index d5e1afbcf8..009aea325a 100644 --- a/samples/react-native/android/app/build.gradle +++ b/samples/react-native/android/app/build.gradle @@ -130,8 +130,8 @@ android { applicationId "io.sentry.reactnative.sample" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 84 - versionName "8.9.1" + versionCode 85 + versionName "8.9.2" buildConfigField "boolean", "SENTRY_DISABLE_NATIVE_START", System.getenv('SENTRY_DISABLE_NATIVE_START') ?: String.valueOf(sentryDisableNativeStart) testBuildType System.getProperty('testBuildType', 'debug') diff --git a/samples/react-native/ios/sentryreactnativesample/Info.plist b/samples/react-native/ios/sentryreactnativesample/Info.plist index 29d1e656d9..726e26a8f1 100644 --- a/samples/react-native/ios/sentryreactnativesample/Info.plist +++ b/samples/react-native/ios/sentryreactnativesample/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 8.9.1 + 8.9.2 CFBundleSignature ???? CFBundleVersion - 89 + 90 LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/samples/react-native/ios/sentryreactnativesampleTests/Info.plist b/samples/react-native/ios/sentryreactnativesampleTests/Info.plist index 0ef8d8c69f..777ed54b82 100644 --- a/samples/react-native/ios/sentryreactnativesampleTests/Info.plist +++ b/samples/react-native/ios/sentryreactnativesampleTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 8.9.1 + 8.9.2 CFBundleSignature ???? CFBundleVersion - 89 + 90 diff --git a/samples/react-native/package.json b/samples/react-native/package.json index 56b7bba43f..186f621c89 100644 --- a/samples/react-native/package.json +++ b/samples/react-native/package.json @@ -1,6 +1,6 @@ { "name": "sentry-react-native-sample", - "version": "8.9.1", + "version": "8.9.2", "private": true, "scripts": { "android": "react-native run-android", @@ -49,7 +49,7 @@ "@reduxjs/toolkit": "^2.8.2", "@sentry/core": "10.50.0", "@sentry/react": "10.50.0", - "@sentry/react-native": "8.9.1", + "@sentry/react-native": "8.9.2", "@shopify/flash-list": "^2.0.2", "delay": "^6.0.0", "react": "19.2.3", diff --git a/yarn.lock b/yarn.lock index f45e68542f..6bfa218198 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11232,7 +11232,7 @@ __metadata: languageName: node linkType: hard -"@sentry/react-native@8.9.1, @sentry/react-native@workspace:packages/core": +"@sentry/react-native@8.9.2, @sentry/react-native@workspace:packages/core": version: 0.0.0-use.local resolution: "@sentry/react-native@workspace:packages/core" dependencies: @@ -12526,7 +12526,7 @@ __metadata: "@react-native/metro-config": 0.80.2 "@react-native/new-app-screen": 0.80.2 "@react-native/typescript-config": 0.80.2 - "@sentry/react-native": 8.9.1 + "@sentry/react-native": 8.9.2 "@types/jest": ^29.5.13 "@types/react": ^19.1.0 "@types/react-test-renderer": ^19.1.0 @@ -18325,8 +18325,8 @@ __metadata: linkType: hard "fast-xml-parser@npm:^5.7.0": - version: 5.7.1 - resolution: "fast-xml-parser@npm:5.7.1" + version: 5.7.2 + resolution: "fast-xml-parser@npm:5.7.2" dependencies: "@nodable/entities": ^2.1.0 fast-xml-builder: ^1.1.5 @@ -18334,7 +18334,7 @@ __metadata: strnum: ^2.2.3 bin: fxparser: src/cli/cli.js - checksum: 863ed69cf556a895231a80ed0091e12671f0d45af336169db55b7cc81c15cd767324469f392df68c5242e80bc416a69394fe69e6287bcb4ef1507875c7b0df84 + checksum: 6ef5c57be6234de514e55d834b0711358aa205e7d40e2ef975843f493efe39c4d00f869e94eb8b48fecb4f67694fa442b798a991b53a28f173dcbc929f55dea4 languageName: node linkType: hard @@ -30146,7 +30146,7 @@ __metadata: "@babel/preset-env": ^7.25.3 "@babel/preset-typescript": ^7.18.6 "@sentry/core": 10.50.0 - "@sentry/react-native": 8.9.1 + "@sentry/react-native": 8.9.2 "@types/node": ^20.9.3 "@types/react": ^18.2.64 appium: 3.2.2 @@ -30176,7 +30176,7 @@ __metadata: "@babel/preset-env": ^7.26.0 "@sentry/babel-plugin-component-annotate": 5.2.0 "@sentry/core": 10.50.0 - "@sentry/react-native": 8.9.1 + "@sentry/react-native": 8.9.2 "@types/node": 20.10.4 "@types/react": ~19.2.10 expo: ^55.0.0 @@ -30215,7 +30215,7 @@ __metadata: "@react-navigation/stack": ^6.3.20 "@sentry/core": 10.50.0 "@sentry/react": 10.50.0 - "@sentry/react-native": 8.9.1 + "@sentry/react-native": 8.9.2 "@types/react": ^18.2.65 "@types/react-native-vector-icons": ^6.4.18 babel-plugin-module-resolver: ^5.0.0 @@ -30261,7 +30261,7 @@ __metadata: "@sentry/babel-plugin-component-annotate": 5.2.0 "@sentry/core": 10.50.0 "@sentry/react": 10.50.0 - "@sentry/react-native": 8.9.1 + "@sentry/react-native": 8.9.2 "@shopify/flash-list": ^2.0.2 "@testing-library/react-native": ^13.2.2 "@types/jest": ^29.5.14