diff --git a/.detoxrc.js b/.detoxrc.js index af93cbe633c1..9e62492d7a2e 100644 --- a/.detoxrc.js +++ b/.detoxrc.js @@ -65,8 +65,12 @@ module.exports = { }, 'ios.sim.main.ci': { device: 'ios.simulator', - app: 'ios.debug', - } + app: 'ios.main.release', + }, + 'ios.sim.flask.ci': { + device: 'ios.simulator', + app: 'ios.flask.release', + }, }, devices: { 'ios.simulator': { @@ -110,42 +114,44 @@ module.exports = { 'ios.main.release': { type: 'ios.app', binaryPath: - 'ios/build/Build/Products/Release-iphonesimulator/MetaMask.app', - build: `yarn build:ios:main:e2e`, + process.env.PREBUILT_IOS_APP_PATH || 'ios/build/Build/Products/Release-iphonesimulator/MetaMask.app', + build: `export CONFIGURATION="Release" && yarn build:ios:main:e2e`, }, 'ios.flask.debug': { type: 'ios.app', binaryPath: - 'ios/build/Build/Products/Debug-iphonesimulator/MetaMask-Flask.app', - build: 'yarn start:ios:e2e:flask', + process.env.PREBUILT_IOS_APP_PATH || 'ios/build/Build/Products/Debug-iphonesimulator/MetaMask-Flask.app', + build: 'export CONFIGURATION="Debug" && yarn build:ios:flask:e2e', }, 'ios.flask.release': { type: 'ios.app', binaryPath: - 'ios/build/Build/Products/Release-iphonesimulator/MetaMask-Flask.app', - build: `yarn build:ios:flask:e2e`, + process.env.PREBUILT_IOS_APP_PATH || 'ios/build/Build/Products/Release-iphonesimulator/MetaMask-Flask.app', + build: `export CONFIGURATION="Release" && yarn build:ios:flask:e2e`, }, 'android.debug': { type: 'android.apk', binaryPath: process.env.PREBUILT_ANDROID_APK_PATH || 'android/app/build/outputs/apk/prod/debug/app-prod-debug.apk', testBinaryPath: process.env.PREBUILT_ANDROID_TEST_APK_PATH, - build: 'yarn start:android:e2e', + build: 'export CONFIGURATION="Debug" && yarn build:android:main:e2e', }, - 'android.flask.debug': { + 'android.release': { type: 'android.apk', - binaryPath: 'android/app/build/outputs/apk/flask/debug/app-flask-debug.apk', - testBinaryPath: 'android/app/build/outputs/apk/androidTest/flask/debug/app-flask-debug-androidTest.apk', - build: 'yarn start:android:e2e:flask', + binaryPath: process.env.PREBUILT_ANDROID_APK_PATH || 'android/app/build/outputs/apk/prod/release/app-prod-release.apk', + testBinaryPath: process.env.PREBUILT_ANDROID_TEST_APK_PATH, + build: `export CONFIGURATION="Release" && yarn build:android:main:e2e`, }, - 'android.release': { + 'android.flask.debug': { type: 'android.apk', - binaryPath: 'android/app/build/outputs/apk/prod/release/app-prod-release.apk', - build: `yarn build:android:main:e2e`, + binaryPath: process.env.PREBUILT_ANDROID_APK_PATH || 'android/app/build/outputs/apk/flask/debug/app-flask-debug.apk', + testBinaryPath: process.env.PREBUILT_ANDROID_TEST_APK_PATH, + build: 'export CONFIGURATION="Debug" && yarn build:android:flask:e2e', }, 'android.flask.release': { type: 'android.apk', - binaryPath: 'android/app/build/outputs/apk/flask/release/app-flask-release.apk', - build: `yarn build:android:flask:e2e`, + binaryPath: process.env.PREBUILT_ANDROID_APK_PATH || 'android/app/build/outputs/apk/flask/release/app-flask-release.apk', + testBinaryPath: process.env.PREBUILT_ANDROID_TEST_APK_PATH, + build: `export CONFIGURATION="Release" && yarn build:android:flask:e2e`, }, }, }; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d01a55b91b80..96c160466e60 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -40,8 +40,8 @@ app/core/Engine/index.ts @MetaMask/mobile-pla app/core/Engine/README.md @MetaMask/mobile-platform app/core/Engine/types.ts @MetaMask/mobile-platform app/core/Engine/controllers/remote-feature-flag-controller/ @MetaMask/mobile-platform -app/core/DeeplinkManager @MetaMask/mobile-platform -app/core/DeeplinkManager/Handlers/handlePerpsUrl.ts @MetaMask/perps +app/core/DeeplinkManager @MetaMask/mobile-platform +scripts/build.sh @MetaMask/mobile-platform # Platform & Snaps Code Fencing File metro.transform.js @MetaMask/mobile-platform @MetaMask/core-platform @@ -145,6 +145,7 @@ app/components/UI/Perps/ @MetaMask/perps app/components/UI/WalletAction/*perps* @MetaMask/perps app/core/Engine/controllers/perps-controller @MetaMask/perps app/core/Engine/messengers/perps-controller-messenger @MetaMask/perps +app/core/DeeplinkManager/Handlers/handlePerpsUrl.ts @MetaMask/perps **/Perps/** @MetaMask/perps **/perps/** @MetaMask/perps diff --git a/bitrise.yml b/bitrise.yml index 12813693d961..6fc564d4b0f2 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -16,10 +16,6 @@ pipelines: create_qa_builds_pipeline: stages: - create_build_qa: {} - #Creates MetaMask-QA Flask apps and stores apk/ipa in Bitrise & browserstack - create_qa_flask_builds_pipeline: - stages: - - create_build_qa_flask: {} #Builds MetaMask, MetaMask-QA apps and stores apk/ipa in Bitrise build_all_targets_pipeline: stages: @@ -30,7 +26,6 @@ pipelines: - bump_version_stage: {} - create_build_qa: {} - bump_version_stage: {} - - create_build_qa_flask: {} #Releases MetaMask apps and stores apk/ipa into Play(Internal Testing)/App(TestFlight) Store release_builds_to_store_pipeline: stages: @@ -199,8 +194,6 @@ stages: workflows: - build_android_release: {} - build_ios_release: {} - - build_android_beta: {} - - build_ios_beta: {} - build_android_flask_release: {} - build_ios_flask_release: {} - build_android_qa: {} @@ -268,11 +261,6 @@ stages: - build_android_qa_devbuild: {} - build_ios_qa_devbuild: {} - build_ios_qa_simbuild: {} - # TODO: This workflow doesn't make sense since both QA and Flask are targets. Need to refactor. - create_build_qa_flask: - workflows: - - build_android_qa_flask: {} - - build_ios_qa_flask: {} create_build_qa: workflows: - build_android_qa: {} @@ -2335,16 +2323,8 @@ workflows: node -v if [ -n "$COMMAND_YARN" ]; then GIT_BRANCH=$BITRISE_GIT_BRANCH yarn "$COMMAND_YARN" - elif [ "$IS_DEV_BUILD" = "true" ]; then #EXPO BUILD - GIT_BRANCH=$BITRISE_GIT_BRANCH yarn build:android:main:dev - elif [ "$METAMASK_BUILD_TYPE" = "main" ]; then - yarn build:android:pre-release:bundle - elif [ "$METAMASK_BUILD_TYPE" = "beta" ]; then - yarn build:android:pre-release:bundle:beta - elif [ "$METAMASK_BUILD_TYPE" = "flask" ]; then - yarn build:android:pre-release:bundle:flask else - echo "Error: Invalid build type specified: $METAMASK_BUILD_TYPE" + echo "No COMMAND_YARN provided" exit 1 fi - deploy-to-bitrise-io@2.2.3: @@ -2682,6 +2662,7 @@ workflows: machine_type_id: elite-xl build_android_main_prod: envs: + - CONFIGURATION: 'Release' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER - KEYSTORE_FILE_PATH: $BITRISEIO_ANDROID_KEYSTORE_URL @@ -2697,6 +2678,7 @@ workflows: machine_type_id: elite-xl build_android_main_beta: envs: + - CONFIGURATION: 'Release' - COMMAND_YARN: 'build:android:main:beta' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER @@ -2712,6 +2694,7 @@ workflows: machine_type_id: elite-xl build_android_main_rc: envs: + - CONFIGURATION: 'Release' - COMMAND_YARN: 'build:android:main:rc' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER @@ -2727,6 +2710,7 @@ workflows: machine_type_id: elite-xl build_android_main_test: envs: + - CONFIGURATION: 'Release' - COMMAND_YARN: 'build:android:main:test' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER @@ -2742,6 +2726,7 @@ workflows: machine_type_id: elite-xl build_android_main_e2e: envs: + - CONFIGURATION: 'Release' - COMMAND_YARN: 'build:android:main:e2e' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER @@ -2758,6 +2743,7 @@ workflows: machine_type_id: elite-xl build_android_main_exp: envs: + - CONFIGURATION: 'Release' - COMMAND_YARN: 'build:android:main:exp' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER @@ -2771,22 +2757,6 @@ workflows: bitrise.io: stack: linux-docker-android-22.04 machine_type_id: elite-xl - build_android_beta: - envs: - - METAMASK_BUILD_TYPE: 'beta' - - METAMASK_ENVIRONMENT: 'production' - - NAME: $VERSION_NAME - - NUMBER: $VERSION_NUMBER - - KEYSTORE_FILE_PATH: $BITRISEIO_ANDROID_KEYSTORE_URL - - KEYSTORE_PATH: 'android/keystores/release.keystore' - - APP_NAME: 'prod' - - OUTPUT_PATH: 'prodRelease' - after_run: - - _android_build_template - meta: - bitrise.io: - stack: linux-docker-android-22.04 - machine_type_id: elite-xl build_android_release_and_upload_sourcemaps: envs: - SENTRY_DISABLE_AUTO_UPLOAD: 'false' @@ -2815,6 +2785,7 @@ workflows: machine_type_id: elite-xl build_android_main_dev: envs: + - CONFIGURATION: 'Debug' - IS_DEV_BUILD: 'true' - NAME: $VERSION_NAME - NUMBER: $VERSION_NUMBER @@ -2896,72 +2867,6 @@ workflows: after_run: - build_android_qa_prod - _upload_apk_to_browserstack_qa - build_android_qa_flask: - before_run: - - code_setup - after_run: - - _upload_apk_to_browserstack_flask - - notify_failure - steps: - - change-android-versioncode-and-versionname@1: - inputs: - - new_version_name: $FLASK_VERSION_NAME - - new_version_code: $FLASK_VERSION_NUMBER - - build_gradle_path: $PROJECT_LOCATION_ANDROID/app/build.gradle - - file-downloader@1: - inputs: - - source: $BITRISEIO_ANDROID_QA_KEYSTORE_URL - - destination: android/keystores/internalRelease.keystore - - restore-gradle-cache@2: {} - - install-missing-android-tools@3: - inputs: - - ndk_version: $NDK_VERSION - - gradlew_path: $PROJECT_LOCATION/gradlew - - script@1: - inputs: - - content: |- - #!/usr/bin/env bash - node -v - export METAMASK_ENVIRONMENT='qa' - export METAMASK_BUILD_TYPE='flask' - GIT_BRANCH=$BITRISE_GIT_BRANCH yarn build:android:pre-release:bundle:flask - title: Build Android Flask Pre-Release Bundle - is_always_run: false - - save-gradle-cache@1: {} - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - deploy_path: $PROJECT_LOCATION/app/build/outputs/apk/flask/release/app-flask-release.apk - title: Bitrise Deploy Flask APK - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - deploy_path: $PROJECT_LOCATION/app/build/outputs/apk/flask/release/sha512sums.txt - title: Bitrise Deploy Flask Checksum - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - deploy_path: $PROJECT_LOCATION/app/build/outputs/mapping/flaskRelease/mapping.txt - title: Bitrise Deploy Flask ProGuard Map Files - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - deploy_path: $PROJECT_LOCATION/app/build/outputs/bundle/flaskRelease/app-flask-release.aab - title: Bitrise Deploy Flask AAB - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - deploy_path: sourcemaps/android/index.js.map - title: Bitrise Deploy Flask Sourcemaps - meta: - bitrise.io: - stack: linux-docker-android-22.04 - machine_type_id: elite-xl _upload_apk_to_browserstack_flask: steps: - script@1: @@ -3167,24 +3072,8 @@ workflows: echo 'This is the current build type: $METAMASK_BUILD_TYPE' if [ -n "$COMMAND_YARN" ]; then GIT_BRANCH=$BITRISE_GIT_BRANCH yarn "$COMMAND_YARN" - elif [ "$IS_DEV_BUILD" = "true" ]; then #EXPO BUILD - if [ "$IS_SIM_BUILD" = "true" ]; then - if [ "$METAMASK_BUILD_TYPE" = "flask" ]; then - GIT_BRANCH=$BITRISE_GIT_BRANCH yarn start:ios:e2e:flask - else - GIT_BRANCH=$BITRISE_GIT_BRANCH yarn start:ios:e2e - fi - else - GIT_BRANCH=$BITRISE_GIT_BRANCH yarn build:ios:main:dev - fi - elif [ "$METAMASK_BUILD_TYPE" = "main" ]; then - yarn build:ios:pre-release - elif [ "$METAMASK_BUILD_TYPE" = "beta" ]; then - yarn build:ios:pre-beta - elif [ "$METAMASK_BUILD_TYPE" = "flask" ]; then - yarn build:ios:pre-flask else - echo "Error: Invalid build type specified: $METAMASK_BUILD_TYPE" + echo "No COMMAND_YARN provided" exit 1 fi - deploy-to-bitrise-io@2.2.3: @@ -3379,17 +3268,6 @@ workflows: - SENTRY_DISABLE_AUTO_UPLOAD: 'false' after_run: - build_ios_main_rc - build_ios_beta: - envs: - - CONFIGURATION: 'Release' - - METAMASK_BUILD_TYPE: "beta" - - METAMASK_ENVIRONMENT: 'production' - - NAME: $VERSION_NAME - - NUMBER: $VERSION_NUMBER - - APP_NAME: "MetaMask" - - INFO_PLIST_NAME: "Info.plist" - after_run: - - _ios_build_template # TODO: Remove this workflow once new build configuration is consolidated build_ios_flask_release: after_run: @@ -3588,47 +3466,6 @@ workflows: - pipeline_intermediate_files: sourcemaps/ios/index.js.map:BITRISE_APP_STORE_SOURCEMAP_PATH - deploy_path: sourcemaps/ios/index.js.map title: Deploy Source Map - build_ios_qa_flask: - before_run: - - code_setup - after_run: - - _upload_ipa_to_browserstack_flask - - notify_failure - steps: - - certificate-and-profile-installer@1: {} - - set-xcode-build-number@1: - inputs: - - build_short_version_string: $FLASK_VERSION_NAME - - build_version: $FLASK_VERSION_NUMBER - - plist_path: $PROJECT_LOCATION_IOS/MetaMask/MetaMask-Flask-Info.plist - - script@1: - inputs: - - content: |- - #!/usr/bin/env bash - node -v - GIT_BRANCH=$BITRISE_GIT_BRANCH METAMASK_BUILD_TYPE='flask' METAMASK_ENVIRONMENT='qa' yarn build:ios:pre-flask - title: iOS Flask Sourcemaps & Build - is_always_run: false - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - pipeline_intermediate_files: ios/build/output/MetaMask-Flask.ipa:BITRISE_APP_STORE_FLASK_IPA_PATH - - deploy_path: ios/build/output/MetaMask-Flask.ipa - title: Deploy iOS Flask IPA - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - deploy_path: ios/build/MetaMask-Flask.xcarchive - title: Deploy Flask Symbols File - - deploy-to-bitrise-io@2.2.3: - is_always_run: false - is_skippable: true - inputs: - - pipeline_intermediate_files: sourcemaps/ios/index.js.map:BITRISE_APP_STORE_FLASK_SOURCEMAP_PATH - - deploy_path: sourcemaps/ios/index.js.map - title: Deploy Flask Source Map _upload_ipa_to_browserstack_flask: steps: - script@1: diff --git a/docs/readme/e2e-testing.md b/docs/readme/e2e-testing.md index 3708188fdfe1..591309b9c37b 100644 --- a/docs/readme/e2e-testing.md +++ b/docs/readme/e2e-testing.md @@ -98,6 +98,8 @@ Please follow the [native development guide](../../README.md#native-development) # Build the app for testing yarn test:e2e:ios:debug:build yarn test:e2e:android:debug:build + +# These commands are hardcoded to build for `main` build type and `e2e` environment based on the .detoxrc.js file ``` ### Use Expo prebuilds (recommended) @@ -160,7 +162,10 @@ You can use prebuilt app files instead of building the app locally. ```bash # Firstly, make sure the build watcher is running in a dedicated terminal for the logs # and the emulators are up and running -source .e2e.env && yarn watch:clean +# Ensure METAMASK_BUILD_TYPE is set to `main` and METAMASK_ENVIRONMENT is set to `e2e` in .js.env +source .e2e.env # Ensure .js.env is sourced +yarn watch:clean # First time or after dependency changes +yarn watch # Subsequent runs # Run all Tests source .e2e.env && yarn test:e2e:ios:debug:run @@ -195,12 +200,10 @@ Ensure you have completed the [Local environment setup](#local-environment-setup ```bash # Start Metro bundler for Flask development -yarn watch:flask:clean # First time or after dependency changes -yarn watch:flask # Subsequent runs - -# In a separate terminal, build and install Flask app -yarn start:ios:e2e:flask # iOS -yarn start:android:e2e:flask # Android +# Ensure METAMASK_BUILD_TYPE is set to `flask` and METAMASK_ENVIRONMENT is set to `e2e` in .js.env +source .e2e.env # Ensure .js.env is sourced +yarn watch:clean # First time or after dependency changes +yarn watch # Subsequent runs ``` **Build for E2E Testing:** @@ -217,6 +220,7 @@ yarn test:e2e:android:flask:build # Run all Flask E2E tests yarn test:e2e:ios:flask:run yarn test:e2e:android:flask:run +# These commands are hardcoded to build for `flask` build type and `e2e` environment based on the .detoxrc.js file # Run specific Flask test yarn test:e2e:ios:flask:run e2e/specs/snaps/test-snap-jsx.spec.ts @@ -283,10 +287,10 @@ export METAMASK_ENVIRONMENT=${METAMASK_ENVIRONMENT:-production} ```bash # Clean previous builds -yarn watch:flask:clean +yarn watch:clean # Rebuild Flask app -yarn start:android:e2e:flask # or iOS +yarn test:e2e:android:flask:build # or iOS ``` #### 3. Metro Bundler Not Running ⚠️ @@ -297,10 +301,10 @@ yarn start:android:e2e:flask # or iOS ```bash # Terminal 1: Start Metro bundler -yarn watch:flask:clean +yarn watch:clean -# Terminal 2: Build and run Flask app -yarn start:android:e2e:flask +# Terminal 2: Reinstall and run Flask app +yarn test:e2e:android:flask:run ``` ### Flask vs Main Build Differences @@ -320,20 +324,20 @@ yarn start:android:e2e:flask 1. Check if `.js.env` has hardcoded `METAMASK_BUILD_TYPE` or `METAMASK_ENVIRONMENT` - remove them 2. Verify `BRIDGE_USE_DEV_APIS=true` is set during build -3. Rebuild the app with `yarn start:*:e2e:flask` +3. Rebuild the app with `yarn test:e2e:*:flask:build` 4. Verify Flask build by checking app icon/splash screen **Metro bundler shows wrong `METAMASK_BUILD_TYPE`:** 1. Stop Metro bundler (Ctrl+C) -2. Clean bundler cache: `yarn watch:flask:clean` -3. Restart Metro bundler: `yarn watch:flask` +2. Clean bundler cache: `yarn watch:clean` +3. Restart Metro bundler: `yarn watch` **App crashes or shows blank screen:** 1. Ensure emulator/simulator is running before building 2. Check Metro bundler logs for JavaScript errors -3. Try clean build: `yarn watch:flask:clean && yarn start:*:e2e:flask` +3. Try clean build: `yarn watch:clean && yarn test:e2e:*:flask:build` **Tests timeout waiting for elements:** diff --git a/package.json b/package.json index 8ea33c8baf44..951148c4b4ae 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,8 @@ "install:foundryup": "yarn mm-foundryup", "anvil": "node_modules/.bin/anvil", "audit:ci": "yarn npm audit --environment production --severity moderate --no-deprecations", - "watch": "./scripts/build.sh watcher main dev --watcher", - "watch:clean": "./scripts/build.sh watcher main dev --watcher --clean", - "watch:flask": "METAMASK_BUILD_TYPE=flask ./scripts/build.sh watcher flask dev --watcher", - "watch:flask:clean": "METAMASK_BUILD_TYPE=flask ./scripts/build.sh watcher flask dev --watcher --clean", + "watch": "./scripts/build.sh watcher", + "watch:clean": "./scripts/build.sh watcher --clean", "clean:ios": "rm -rf ios/build", "pod:install": "bundle exec pod install --project-directory=ios", "gem:bundle:install": "bundle install --gemfile=ios/Gemfile", @@ -32,14 +30,9 @@ "start:ios": "./scripts/build.sh ios main dev --local", "start:ios:qa": "./scripts/build.sh ios qa dev --local", "start:ios:flask": "./scripts/build.sh ios flask dev --local", - "start:ios:e2e": "./scripts/build.sh ios debugE2E", - "start:ios:e2e:qa": "./scripts/build.sh ios qadebugE2E", - "start:ios:e2e:flask": "METAMASK_BUILD_TYPE=flask BRIDGE_USE_DEV_APIS=true ./scripts/build.sh ios flaskDebugE2E e2e", "start:android": "./scripts/build.sh android main dev --local", "start:android:qa": "./scripts/build.sh android qa dev --local", "start:android:flask": "./scripts/build.sh android flask dev --local", - "start:android:e2e": "./scripts/build.sh android debugE2E", - "start:android:e2e:flask": "METAMASK_BUILD_TYPE=flask BRIDGE_USE_DEV_APIS=true ./scripts/build.sh android flaskDebugE2E e2e", "start:api-logging-server": "node -r @babel/register scripts/start-api-logging-server.js", "build:announce": "node ./scripts/metamask-bot-build-announce-bitrise.js", "build:android:release": "./scripts/build.sh android release", @@ -53,10 +46,10 @@ "build:android:flask:prod": "./scripts/build.sh android flask production", "build:android:flask:dev": "./scripts/build.sh android flask dev", "build:android:flask:test": "./scripts/build.sh android flask test", - "build:android:flask:e2e": "./scripts/build.sh android flask e2e", + "build:android:flask:e2e": "BRIDGE_USE_DEV_APIS=true ./scripts/build.sh android flask e2e", "build:android:qa:prod": "./scripts/build.sh android qa production", "build:android:qa:dev": "./scripts/build.sh android qa dev", - "build:android:checksum": "./scripts/checksum.sh", + "build:android:checksum:prod": "./scripts/checksum.sh", "build:android:checksum:qa": "./scripts/checksum.sh QA", "build:android:checksum:flask": "export METAMASK_BUILD_TYPE='flask' && ./scripts/checksum.sh flask", "build:android:checksum:verify": "shasum -a 512 -c sha512sums.txt", @@ -64,10 +57,6 @@ "fingerprint:generate": "node scripts/generate-fingerprint.js", "build:repack:android": "PLATFORM=android node scripts/repack.js", "build:repack:ios": "PLATFORM=ios node scripts/repack.js", - "build:android:pre-release:bundle": "GENERATE_BUNDLE=true ./scripts/build.sh android release --pre", - "build:android:pre-release:bundle:qa": "GENERATE_BUNDLE=true ./scripts/build.sh android QA --pre", - "build:android:pre-release:bundle:flask": "export METAMASK_BUILD_TYPE='flask' && GENERATE_BUNDLE=true ./scripts/build.sh android flask --pre", - "build:android:pre-release:bundle:beta": "export METAMASK_BUILD_TYPE='beta' && GENERATE_BUNDLE=true ./scripts/build.sh android release --pre", "build:ios:release": "./scripts/build.sh ios release", "build:ios:main:prod": "./scripts/build.sh ios main production", "build:ios:main:beta": "./scripts/build.sh ios main beta", @@ -79,7 +68,7 @@ "build:ios:flask:prod": "./scripts/build.sh ios flask production", "build:ios:flask:dev": "./scripts/build.sh ios flask dev", "build:ios:flask:test": "./scripts/build.sh ios flask test", - "build:ios:flask:e2e": "./scripts/build.sh ios flask e2e", + "build:ios:flask:e2e": "BRIDGE_USE_DEV_APIS=true ./scripts/build.sh ios flask e2e", "build:ios:qa:prod": "./scripts/build.sh ios qa production", "build:ios:qa:dev": "./scripts/build.sh ios qa dev", "build:ios:pre-release": "./scripts/build.sh ios release --pre", @@ -99,6 +88,7 @@ "test:e2e:android:main:ci": "IS_TEST='true' NODE_OPTIONS='--experimental-vm-modules' detox test -c android.emu.main.ci --headless", "test:e2e:android:flask:ci": "IS_TEST='true' NODE_OPTIONS='--experimental-vm-modules' detox test -c android.emu.flask.ci --headless", "test:e2e:ios:main:ci": "IS_TEST='true' NODE_OPTIONS='--experimental-vm-modules' detox test -c ios.sim.main.ci --headless", + "test:e2e:ios:flask:ci": "IS_TEST='true' NODE_OPTIONS='--experimental-vm-modules' detox test -c ios.sim.flask.ci --headless", "test:e2e:android:debug:build": "IS_TEST='true' detox build -c android.emu.main", "test:e2e:ios:debug:build": "IS_TEST='true' detox build -c ios.sim.main", "test:e2e:android:debug:run": "IS_TEST='true' NODE_OPTIONS='--experimental-vm-modules' detox test -c android.emu.main", diff --git a/scripts/build.sh b/scripts/build.sh index 8e01b71b2835..9c1be7cdbd94 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -29,10 +29,14 @@ loadJSEnv(){ # Load JS env variables loadJSEnv +if [ "$PLATFORM" != "watcher" ]; then + # Use the values from the environment variables when platform is watcher + export METAMASK_BUILD_TYPE=${MODE:-"$METAMASK_BUILD_TYPE"} + export METAMASK_ENVIRONMENT=${ENVIRONMENT:-"$METAMASK_ENVIRONMENT"} +fi + # Enable Sentry to auto upload source maps and debug symbols export SENTRY_DISABLE_AUTO_UPLOAD=${SENTRY_DISABLE_AUTO_UPLOAD:-"true"} -export METAMASK_BUILD_TYPE=${MODE:-"$METAMASK_BUILD_TYPE"} -export METAMASK_ENVIRONMENT=${ENVIRONMENT:-"$METAMASK_ENVIRONMENT"} export EXPO_NO_TYPESCRIPT_SETUP=1 echo "PLATFORM = $PLATFORM" @@ -72,7 +76,7 @@ printTitle(){ echo '' echo '-------------------------------------------' echo '' - echo " 🚀 BUILDING $PLATFORM for $MODE target with $ENVIRONMENT environment" | tr [a-z] [A-Z] + echo " 🚀 BUILDING $PLATFORM for $METAMASK_BUILD_TYPE target with $METAMASK_ENVIRONMENT environment" | tr [a-z] [A-Z] echo '' echo '-------------------------------------------' echo '' @@ -139,6 +143,18 @@ checkParameters(){ printError "METAMASK_ENVIRONMENT '${METAMASK_ENVIRONMENT}' is not valid. Please set it to one of the following: ${VALID_METAMASK_ENVIRONMENTS}" exit 1 esac + + VALID_METAMASK_BUILD_TYPES="main|flask|qa" + # Check if the METAMASK_BUILD_TYPE is valid + case "${METAMASK_BUILD_TYPE}" in + main|flask|qa) + # Valid build type - continue + ;; + *) + # Invalid build type - exit with error + printError "METAMASK_BUILD_TYPE '${METAMASK_BUILD_TYPE}' is not valid. Please set it to one of the following: ${VALID_METAMASK_BUILD_TYPES}" + exit 1 + esac #TODO: Add check for valid METAMASK_BUILD_TYPE once commands are fully refactored } @@ -410,27 +426,6 @@ prebuild_android(){ fi } -# Builds the Main APK for dev development -buildAndroidMainDev(){ - prebuild_android - # Generate both APK (for development) and test APK (for E2E testing) - cd android && ./gradlew app:assembleProdDebug app:assembleProdDebugAndroidTest --build-cache --parallel && cd .. -} - -# Builds the Flask APK for dev development -buildAndroidFlaskDev(){ - prebuild_android - # Generate both APK (for development) and test APK (for E2E testing) - cd android && ./gradlew app:assembleFlaskDebug app:assembleFlaskDebugAndroidTest --build-cache --parallel && cd .. -} - -# Builds the QA APK for dev development -buildAndroidQaDev(){ - prebuild_android - # Generate both APK (for development) and test APK (for E2E testing) - cd android && ./gradlew app:assembleQaDebug app:assembleQaDebugAndroidTest --build-cache --parallel && cd .. -} - # Builds and installs the Main APK for local development buildAndroidMainLocal(){ prebuild_android @@ -470,25 +465,6 @@ buildIosQALocal(){ yarn expo run:ios --no-install --configuration Debug --port $WATCHER_PORT --scheme "MetaMask-QA" --device "$IOS_SIMULATOR" } -buildIosSimulatorE2E(){ - prebuild_ios - cd ios && CC=clang CXX=clang CLANG=clang CLANGPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ xcodebuild -workspace MetaMask.xcworkspace -scheme MetaMask -configuration Debug -sdk iphonesimulator -derivedDataPath build -} - -buildIosFlaskSimulatorE2E(){ - prebuild_ios - cd ios && CC=clang CXX=clang CLANG=clang CLANGPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ xcodebuild -workspace MetaMask.xcworkspace -scheme MetaMask-Flask -configuration Debug -sdk iphonesimulator -derivedDataPath build -} - -buildIosQASimulatorE2E(){ - prebuild_ios - cd ios && xcodebuild -workspace MetaMask.xcworkspace -scheme MetaMask-QA -configuration Debug -sdk iphonesimulator -derivedDataPath build -} - -runIosE2E(){ - cd e2e && yarn ios:debug -} - # Generates the iOS binary for the given scheme and configuration generateIosBinary() { scheme="$1" @@ -537,6 +513,40 @@ generateIosBinary() { } +# Generates the Android binary for the given scheme and configuration +generateAndroidBinary() { + # Prod, Flask, or QA (Deprecated - Do not use) + flavor="$1" + # Debug or Release + configuration="${CONFIGURATION:-"Release"}" + + # Create flavor configuration + flavorConfiguration="app:assemble${flavor}${configuration}" + # Create test configuration + testConfiguration="app:assemble${flavor}${configuration}AndroidTest" + + # Generate Android binary + echo "Generating Android binary for ($flavor) flavor with ($configuration) configuration" + ./gradlew $flavorConfiguration $testConfiguration --build-cache --parallel + + + if [ "$configuration" = "Release" ] ; then + # Generate AAB bundle + bundleConfiguration="bundle${flavor}Release" + echo "Generating AAB bundle for ($flavor) flavor with ($configuration) configuration" + ./gradlew $bundleConfiguration + + # Generate checksum + lowerCaseFlavor=$(echo "$flavor" | tr '[:upper:]' '[:lower:]') + checkSumCommand="build:android:checksum:${lowerCaseFlavor}" + echo "Generating checksum for ($flavor) flavor with ($configuration) configuration" + yarn $checkSumCommand + fi + + # Change directory back out + cd .. +} + buildIosReleaseE2E(){ prebuild_ios @@ -557,113 +567,57 @@ buildIosReleaseE2E(){ fi } -# Builds the Main APK for production -buildAndroidMainProduction(){ - prebuild_android - - # Generate APK for production - cd android && ./gradlew app:assembleProdRelease app:assembleProdReleaseAndroidTest -DtestBuildType=release --build-cache --parallel - - # Generate AAB bundle for production - ./gradlew bundleProdRelease - - # Generate checksum - yarn build:android:checksum - - # Change directory back out - cd .. -} - -# Builds the Flask APK for production -buildAndroidFlaskProduction(){ - prebuild_android - - # Generate APK for production - cd android && ./gradlew app:assembleFlaskRelease app:assembleFlaskReleaseAndroidTest -DtestBuildType=release --build-cache --parallel - - # Generate AAB bundle for production - ./gradlew bundleFlaskRelease - - # Generate checksum - yarn build:android:checksum:flask - - # Change directory back out - cd .. -} - -# Builds the QA APK for production -buildAndroidQaProduction(){ - # Builds the QA APK for production - prebuild_android - - # Generate APK for production - cd android && ./gradlew app:assembleQaRelease app:assembleQaReleaseAndroidTest -DtestBuildType=release --build-cache --parallel - - # Generate AAB bundle for production - ./gradlew bundleQaRelease - - # Generate checksum - yarn build:android:checksum:qa - - # Change directory back out - cd .. -} - buildAndroidReleaseE2E(){ prebuild_android cd android && ./gradlew assembleProdRelease app:assembleProdReleaseAndroidTest -PminSdkVersion=26 -DtestBuildType=release } buildAndroid() { - if [ "$MODE" == "release" ] || [ "$MODE" == "main" ] ; then + echo "Build Android $METAMASK_BUILD_TYPE started..." + if [ "$METAMASK_BUILD_TYPE" == "release" ] || [ "$METAMASK_BUILD_TYPE" == "main" ] ; then if [ "$IS_LOCAL" = true ] ; then buildAndroidMainLocal - elif [ "$METAMASK_ENVIRONMENT" == "dev" ] ; then - buildAndroidMainDev else - buildAndroidMainProduction + # Prepare Android dependencies + prebuild_android + # Go to android directory + cd android + # Generate Android binary + generateAndroidBinary "Prod" fi - elif [ "$MODE" == "flask" ] ; then + elif [ "$METAMASK_BUILD_TYPE" == "flask" ] ; then if [ "$IS_LOCAL" = true ] ; then buildAndroidFlaskLocal - elif [ "$METAMASK_ENVIRONMENT" == "dev" ] ; then - buildAndroidFlaskDev else - buildAndroidFlaskProduction + # Prepare Android dependencies + prebuild_android + # Go to android directory + cd android + # Generate Android binary + generateAndroidBinary "Flask" fi - elif [ "$MODE" == "QA" ] || [ "$MODE" == "qa" ] ; then + elif [ "$METAMASK_BUILD_TYPE" == "QA" ] || [ "$METAMASK_BUILD_TYPE" == "qa" ] ; then if [ "$IS_LOCAL" = true ] ; then buildAndroidQALocal - elif [ "$METAMASK_ENVIRONMENT" == "dev" ] ; then - buildAndroidQaDev else - buildAndroidQaProduction + # Prepare Android dependencies + prebuild_android + # Go to android directory + cd android + # Generate Android binary + generateAndroidBinary "Qa" fi - elif [ "$MODE" == "releaseE2E" ] ; then + elif [ "$METAMASK_BUILD_TYPE" == "releaseE2E" ] ; then buildAndroidReleaseE2E - elif [ "$MODE" == "debugE2E" ] ; then - buildAndroidRunE2E - elif [ "$MODE" == "flaskDebugE2E" ] ; then - buildAndroidFlaskDev else - printError "METAMASK_ENVIRONMENT '${METAMASK_ENVIRONMENT}' is not recognized." + printError "METAMASK_BUILD_TYPE '${METAMASK_BUILD_TYPE}' is not recognized." exit 1 fi } -buildAndroidRunE2E(){ - prebuild_android - if [ -e $ANDROID_ENV_FILE ] - then - source $ANDROID_ENV_FILE - fi - # Specify specific task name :app:TASKNAME to prevent processing other variants - cd android && ./gradlew :app:assembleProdDebug :app:assembleProdDebugAndroidTest -PminSdkVersion=26 -DtestBuildType=debug --build-cache && cd .. -} - buildIos() { - echo "Build iOS $MODE started..." - if [ "$MODE" == "release" ] || [ "$MODE" == "main" ] ; then + echo "Build iOS $METAMASK_BUILD_TYPE started..." + if [ "$METAMASK_BUILD_TYPE" == "release" ] || [ "$METAMASK_BUILD_TYPE" == "main" ] ; then if [ "$IS_LOCAL" = true ] ; then buildIosMainLocal else @@ -674,7 +628,7 @@ buildIos() { # Generate iOS binary generateIosBinary "MetaMask" fi - elif [ "$MODE" == "flask" ] ; then + elif [ "$METAMASK_BUILD_TYPE" == "flask" ] ; then if [ "$IS_LOCAL" = true ] ; then buildIosFlaskLocal else @@ -685,7 +639,7 @@ buildIos() { # Generate iOS binary generateIosBinary "MetaMask-Flask" fi - elif [ "$MODE" == "QA" ] || [ "$MODE" == "qa" ] ; then + elif [ "$METAMASK_BUILD_TYPE" == "QA" ] || [ "$METAMASK_BUILD_TYPE" == "qa" ] ; then if [ "$IS_LOCAL" = true ] ; then buildIosQALocal else @@ -696,16 +650,10 @@ buildIos() { # Generate iOS binary generateIosBinary "MetaMask-QA" fi - elif [ "$MODE" == "releaseE2E" ] ; then - buildIosReleaseE2E - elif [ "$MODE" == "debugE2E" ] ; then - buildIosSimulatorE2E - elif [ "$MODE" == "qadebugE2E" ] ; then - buildIosQASimulatorE2E - elif [ "$MODE" == "flaskDebugE2E" ] ; then - buildIosFlaskSimulatorE2E + elif [ "$METAMASK_BUILD_TYPE" == "releaseE2E" ] ; then + buildIosReleaseE2E else - printError "METAMASK_ENVIRONMENT '${METAMASK_ENVIRONMENT}' is not recognized" + printError "METAMASK_BUILD_TYPE '${METAMASK_BUILD_TYPE}' is not recognized" exit 1 fi } @@ -731,7 +679,7 @@ checkAuthToken() { if [ -n "${MM_SENTRY_AUTH_TOKEN}" ]; then sed -i'' -e "s/auth.token.*/auth.token=${MM_SENTRY_AUTH_TOKEN}/" "./${propertiesFileName}"; elif ! grep -qE '^auth.token=[[:alnum:]]+$' "./${propertiesFileName}"; then - if [ "$ENVIRONMENT" == "production" ]; then + if [ "$METAMASK_ENVIRONMENT" == "production" ]; then printError "Missing auth token in '${propertiesFileName}'; add the token, or set it as MM_SENTRY_AUTH_TOKEN" exit 1 else @@ -744,7 +692,7 @@ checkAuthToken() { cp "./${propertiesFileName}.example" "./${propertiesFileName}" sed -i'' -e "s/auth.token.*/auth.token=${MM_SENTRY_AUTH_TOKEN}/" "./${propertiesFileName}"; else - if [ "$ENVIRONMENT" == "production" ]; then + if [ "$METAMASK_ENVIRONMENT" == "production" ]; then printError "Missing '${propertiesFileName}' file (see '${propertiesFileName}.example' or set MM_SENTRY_AUTH_TOKEN to generate)" exit 1 else @@ -761,50 +709,50 @@ printTitle # Map environment variables based on mode. # TODO: MODE should be renamed to TARGET -if [ "$MODE" == "main" ]; then +if [ "$METAMASK_BUILD_TYPE" == "main" ]; then export GENERATE_BUNDLE=true # Used only for Android export PRE_RELEASE=true # Used mostly for iOS, for Android only deletes old APK and installs new one - if [ "$ENVIRONMENT" == "production" ]; then + if [ "$METAMASK_ENVIRONMENT" == "production" ]; then remapMainProdEnvVariables - elif [ "$ENVIRONMENT" == "beta" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "beta" ]; then remapMainBetaEnvVariables - elif [ "$ENVIRONMENT" == "rc" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "rc" ]; then remapMainReleaseCandidateEnvVariables - elif [ "$ENVIRONMENT" == "exp" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "exp" ]; then remapMainExperimentalEnvVariables - elif [ "$ENVIRONMENT" == "test" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "test" ]; then remapMainTestEnvVariables - elif [ "$ENVIRONMENT" == "e2e" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "e2e" ]; then remapMainE2EEnvVariables - elif [ "$ENVIRONMENT" == "dev" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "dev" ]; then remapMainDevEnvVariables fi -elif [ "$MODE" == "flask" ] || [ "$MODE" == "flaskDebugE2E" ]; then +elif [ "$METAMASK_BUILD_TYPE" == "flask" ]; then # TODO: Map environment variables based on environment - if [ "$ENVIRONMENT" == "production" ]; then + if [ "$METAMASK_ENVIRONMENT" == "production" ]; then remapFlaskProdEnvVariables - elif [ "$ENVIRONMENT" == "test" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "test" ]; then remapFlaskTestEnvVariables - elif [ "$ENVIRONMENT" == "e2e" ]; then + elif [ "$METAMASK_ENVIRONMENT" == "e2e" ]; then remapFlaskE2EEnvVariables fi -elif [ "$MODE" == "qa" ] || [ "$MODE" == "QA" ]; then +elif [ "$METAMASK_BUILD_TYPE" == "qa" ] || [ "$METAMASK_BUILD_TYPE" == "QA" ]; then # TODO: Map environment variables based on environment remapEnvVariableQA fi -if [ "$ENVIRONMENT" == "e2e" ]; then +if [ "$METAMASK_ENVIRONMENT" == "e2e" ]; then # Build for simulator export IS_SIM_BUILD="true" # Ignore Boxlogs for E2E builds export IGNORE_BOXLOGS_DEVELOPMENT="true" fi -if [ "$MODE" == "releaseE2E" ] || [ "$MODE" == "QA" ]; then +if [ "$METAMASK_BUILD_TYPE" == "releaseE2E" ] || [ "$METAMASK_BUILD_TYPE" == "QA" ]; then echo "DEBUG SENTRY PROPS" checkAuthToken 'sentry.debug.properties' export SENTRY_PROPERTIES="${REPO_ROOT_DIR}/sentry.debug.properties" -elif [ "$MODE" == "release" ] || [ "$MODE" == "flask" ] || [ "$MODE" == "main" ]; then +elif [ "$METAMASK_BUILD_TYPE" == "release" ] || [ "$METAMASK_BUILD_TYPE" == "flask" ] || [ "$METAMASK_BUILD_TYPE" == "main" ]; then echo "RELEASE SENTRY PROPS" checkAuthToken 'sentry.release.properties' export SENTRY_PROPERTIES="${REPO_ROOT_DIR}/sentry.release.properties" diff --git a/scripts/run-e2e-tags.sh b/scripts/run-e2e-tags.sh index 658a76bbccdb..a53a1fc7853a 100755 --- a/scripts/run-e2e-tags.sh +++ b/scripts/run-e2e-tags.sh @@ -49,13 +49,9 @@ TEST_FILES="${matching_files[*]}" if [[ "$BITRISE_TRIGGERED_WORKFLOW_ID" == *"ios"* ]]; then echo "Detected iOS workflow" IGNORE_BOXLOGS_DEVELOPMENT="true" \ - yarn test:e2e:ios:$METAMASK_BUILD_TYPE:prod $TEST_FILES -elif [[ "${GITHUB_CI}" == "true" || "${GITHUB_CI}" == "1" ]]; then - echo "Detected GitHub Actions workflow - using GitHub CI configuration" - IGNORE_BOXLOGS_DEVELOPMENT="true" \ - yarn test:e2e:android:run:github:qa-release $TEST_FILES + yarn test:e2e:ios:$METAMASK_BUILD_TYPE:ci $TEST_FILES else echo "Detected Android workflow" IGNORE_BOXLOGS_DEVELOPMENT="true" \ - yarn test:e2e:android:$METAMASK_BUILD_TYPE:prod $TEST_FILES + yarn test:e2e:android:$METAMASK_BUILD_TYPE:ci $TEST_FILES fi