diff --git a/app.config.js b/app.config.js index d7a0aa21..bb79260e 100644 --- a/app.config.js +++ b/app.config.js @@ -1,12 +1,41 @@ +const pkg = require('./package.json') + module.exports = function () { - const hasSentryToken = !!process.env.SENTRY_AUTH_TOKEN + /** + * App version number. Should be incremented as part of a release cycle. + */ + const VERSION = pkg.version + + /** + * iOS build number. Must be incremented for each TestFlight version. + */ + const IOS_BUILD_NUMBER = '4' + + /** + * Android build number. Must be incremented for each release. + */ + const ANDROID_VERSION_CODE = 46 + + /** + * Uses built-in Expo env vars + * + * @see https://docs.expo.dev/build-reference/variables/#built-in-environment-variables + */ + const PLATFORM = process.env.EAS_BUILD_PLATFORM + + /** + * Additional granularity for the `dist` field + */ + const DIST_BUILD_NUMBER = + PLATFORM === 'android' ? ANDROID_VERSION_CODE : IOS_BUILD_NUMBER + return { expo: { + version: VERSION, name: 'Bluesky', slug: 'bluesky', scheme: 'bluesky', owner: 'blueskysocial', - version: '1.57.0', runtimeVersion: { policy: 'appVersion', }, @@ -19,7 +48,7 @@ module.exports = function () { backgroundColor: '#ffffff', }, ios: { - buildNumber: '4', + buildNumber: IOS_BUILD_NUMBER, supportsTablet: false, bundleIdentifier: 'xyz.blueskyweb.app', config: { @@ -43,7 +72,7 @@ module.exports = function () { backgroundColor: '#ffffff', }, android: { - versionCode: 46, + versionCode: ANDROID_VERSION_CODE, adaptiveIcon: { foregroundImage: './assets/adaptive-icon.png', backgroundColor: '#ffffff', @@ -74,7 +103,7 @@ module.exports = function () { }, plugins: [ 'expo-localization', - hasSentryToken && 'sentry-expo', + Boolean(process.env.SENTRY_AUTH_TOKEN) && 'sentry-expo', [ 'expo-build-properties', { @@ -100,11 +129,16 @@ module.exports = function () { }, hooks: { postPublish: [ + /* + * @see https://docs.expo.dev/guides/using-sentry/#app-configuration + */ { file: 'sentry-expo/upload-sourcemaps', config: { organization: 'blueskyweb', project: 'react-native', + release: VERSION, + dist: `${PLATFORM}.${VERSION}.${DIST_BUILD_NUMBER}`, }, }, ], diff --git a/eas.json b/eas.json index a66b6c07..25fee4ea 100644 --- a/eas.json +++ b/eas.json @@ -11,28 +11,19 @@ "extends": "base", "developmentClient": true, "distribution": "internal", + "channel": "development", "ios": { "simulator": true, "resourceClass": "large" - }, - "channel": "development" - }, - "development-device": { - "extends": "base", - "developmentClient": true, - "distribution": "internal", - "ios": { - "resourceClass": "large" - }, - "channel": "development" + } }, "preview": { "extends": "base", "distribution": "internal", + "channel": "preview", "ios": { "resourceClass": "large" - }, - "channel": "preview" + } }, "production": { "extends": "base", @@ -40,14 +31,6 @@ "resourceClass": "large" }, "channel": "production" - }, - "dev-android-apk": { - "extends": "base", - "developmentClient": true, - "android": { - "buildType": "apk", - "gradleCommand": ":app:assembleRelease" - } } }, "submit": { diff --git a/package.json b/package.json index 814464a9..6c75054b 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "perf:test:measure": "NODE_ENV=test flashlight test --bundleId xyz.blueskyweb.app --testCommand 'yarn perf:test' --duration 150000 --resultsFilePath .perf/results.json", "perf:test:results": "NODE_ENV=test flashlight report .perf/results.json", "perf:measure": "NODE_ENV=test flashlight measure", - "build:apk": "eas build -p android --profile dev-android-apk", "intl:extract": "lingui extract", "intl:compile": "lingui compile" }, diff --git a/src/lib/sentry.ts b/src/lib/sentry.ts index b080bcc5..63a21a43 100644 --- a/src/lib/sentry.ts +++ b/src/lib/sentry.ts @@ -1,8 +1,46 @@ +/** + * Importing these separately from `platform/detection` and `lib/app-info` to + * avoid future conflicts and/or circular deps + */ + +import {Platform} from 'react-native' +import app from 'react-native-version-number' +import * as info from 'expo-updates' import {init} from 'sentry-expo' +/** + * Matches the build profile `channel` props in `eas.json` + */ +const buildChannel = (info.channel || 'development') as + | 'development' + | 'preview' + | 'production' + +/** + * Examples: + * - `dev` + * - `1.57.0` + */ +const release = app.appVersion ?? 'dev' + +/** + * Examples: + * - `web.dev` + * - `ios.dev` + * - `android.dev` + * - `web.1.57.0` + * - `ios.1.57.0.3` + * - `android.1.57.0.46` + */ +const dist = `${Platform.OS}.${release}${ + app.buildVersion ? `.${app.buildVersion}` : '' +}` + init({ dsn: 'https://05bc3789bf994b81bd7ce20c86ccd3ae@o4505071687041024.ingest.sentry.io/4505071690514432', - enableInExpoDevelopment: false, // if true, Sentry will try to send events/errors in development mode. debug: false, // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production - environment: __DEV__ ? 'development' : 'production', // Set the environment + enableInExpoDevelopment: true, + environment: buildChannel, + dist, + release, }) diff --git a/src/logger/index.ts b/src/logger/index.ts index 9f79a781..59cb84ff 100644 --- a/src/logger/index.ts +++ b/src/logger/index.ts @@ -288,16 +288,13 @@ export class Logger { */ export const logger = new Logger() -/** - * Report to console in dev, Sentry in prod, nothing in test. - */ if (env.IS_DEV && !env.IS_TEST) { logger.addTransport(consoleTransport) /** - * Uncomment this to test Sentry in dev + * Comment this out to disable Sentry transport in dev */ - // logger.addTransport(sentryTransport); + logger.addTransport(sentryTransport) } else if (env.IS_PROD) { - // logger.addTransport(sentryTransport) + logger.addTransport(sentryTransport) }