Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .e2e.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ export TEST_SRP_2=
export TEST_SRP_3=
export BROWSERSTACK_USERNAME=
export BROWSERSTACK_ACCESS_KEY=

# Appwright performance -> Sentry instrumentation
# If E2E_PERFORMANCE_SENTRY_DSN is defined, each scenario uploads timers to Sentry.
export E2E_PERFORMANCE_SENTRY_DSN=
# Optional. Set to false to disable upload even when DSN is present.
export E2E_PERFORMANCE_SENTRY_ENABLED=true
# Optional sample rate between 0 and 1 (default: 1).
export E2E_PERFORMANCE_SENTRY_SAMPLE_RATE=1
# Optional metadata for Sentry events.
export E2E_PERFORMANCE_SENTRY_ENVIRONMENT=e2e-performance
export E2E_PERFORMANCE_SENTRY_RELEASE=

# Set BROWSERSTACK_LOCAL=true when using run-appwright:mm-connect-android-bs-local (BrowserStack Local tunnel)
# BROWSERSTACK_LOCAL=true
export SEEDLESS_ONBOARDING_ENABLED=
Expand Down
7 changes: 5 additions & 2 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,11 @@ app/selectors/rampsController @MetaMask/ramp
**/ramps/** @MetaMask/ramp

# Card Team
app/components/UI/Card/ @MetaMask/card
app/core/redux/slices/card/ @MetaMask/card
app/components/UI/Card/ @MetaMask/card
app/core/redux/slices/card/ @MetaMask/card
app/core/Engine/controllers/card-controller @MetaMask/card
app/core/Engine/messengers/card-controller-messenger @MetaMask/card
app/selectors/cardController.ts @MetaMask/card

# Confirmation Team
app/components/Views/confirmations @MetaMask/confirmations
Expand Down
64 changes: 50 additions & 14 deletions .github/workflows/performance-test-runner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ on:
required: true
type: string
description: 'Unified BrowserStack build name for all sessions'
sentry_target:
required: false
type: string
default: test
description: 'Sentry DSN target: test or real'
secrets:
BROWSERSTACK_USERNAME:
required: true
Expand All @@ -46,6 +51,10 @@ on:
required: true
E2E_PASSWORD:
required: true
MM_SENTRY_DSN_TEST:
required: false
MM_SENTRY_DSN:
required: false

jobs:
run-tests:
Expand All @@ -58,7 +67,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Restore node_modules cache
id: cache
uses: actions/cache@v4
Expand All @@ -70,13 +79,12 @@ jobs:
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'


- name: Install dependencies
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
Expand All @@ -85,8 +93,7 @@ jobs:
max_attempts: 3
retry_wait_seconds: 30
command: yarn --immutable
## This installs dependencies and creates the node_modules state file

## This installs dependencies and creates the node_modules state file
- name: Restore .metamask folder
id: restore-metamask
uses: actions/cache@v4
Expand All @@ -101,7 +108,7 @@ jobs:
run: yarn setup:github-ci
working-directory: '.'
## This will apply the patches for appwright

- name: BrowserStack Env Setup
uses: browserstack/github-actions/setup-env@4478e16186f38e5be07721931642e65a028713c3
with:
Expand Down Expand Up @@ -133,26 +140,52 @@ jobs:
# Use same args for all build types. Do not use --include-hosts for mm-connect:
# bs-local.com requests must be forwarded to localhost; --include-hosts can block them.
local-args: '--force-local --verbose'

- name: Wait for BrowserStack Local
run: |
echo "Waiting for BrowserStack Local to be ready..."
# mm-connect needs the tunnel ready so the device can reach bs-local.com:8090; allow extra time
sleep ${{ inputs.build_type == 'mm-connect' && 15 || 10 }}
echo "BrowserStack Local should be ready now"

- name: Set Test Environment
run: |
echo "Setting ${{ inputs.build_type }} test environment for device: ${{ matrix.device.name }} (${{ matrix.device.category }} Class)"
echo "OS Version: ${{ matrix.device.os_version }}"
echo "Platform: ${{ inputs.platform }}"


SENTRY_TARGET="${{ inputs.sentry_target }}"
SENTRY_TEST_DSN="${{ secrets.MM_SENTRY_DSN_TEST }}"
SENTRY_REAL_DSN="${{ secrets.MM_SENTRY_DSN }}"
SELECTED_SENTRY_DSN=""
SENTRY_ENVIRONMENT="github-actions-performance-e2e"

# Validate that we have a BrowserStack URL
if [ -z "${{ inputs.browserstack_app_url }}" ]; then
echo "❌ Error: No ${{ inputs.platform }} BrowserStack URL available"
exit 1
fi


case "$SENTRY_TARGET" in
real)
SELECTED_SENTRY_DSN="$SENTRY_REAL_DSN"
SENTRY_ENVIRONMENT="github-actions-performance-e2e-real"
if [ -z "$SELECTED_SENTRY_DSN" ]; then
echo "⚠️ MM_SENTRY_DSN is empty. Sentry uploads will be skipped."
fi
;;
test)
SELECTED_SENTRY_DSN="$SENTRY_TEST_DSN"
if [ -z "$SELECTED_SENTRY_DSN" ]; then
echo "⚠️ MM_SENTRY_DSN_TEST is empty. Sentry uploads will be skipped."
fi
;;
*)
echo "❌ Invalid sentry_target '$SENTRY_TARGET'. Expected 'test' or 'real'."
exit 1
;;
esac

{
echo "BROWSERSTACK_DEVICE=${{ matrix.device.name }}"
echo "BROWSERSTACK_OS_VERSION=${{ matrix.device.os_version }}"
Expand All @@ -167,9 +200,12 @@ jobs:
echo "TEST_SRP_2=${{ secrets.TEST_SRP_2 }}"
echo "TEST_SRP_3=${{ secrets.TEST_SRP_3 }}"
echo "E2E_PASSWORD=${{ secrets.E2E_PASSWORD }}"
echo "E2E_PERFORMANCE_SENTRY_DSN=$SELECTED_SENTRY_DSN"
echo "E2E_PERFORMANCE_SENTRY_ENVIRONMENT=$SENTRY_ENVIRONMENT"
echo "E2E_PERFORMANCE_SENTRY_RELEASE=${{ github.sha }}"
echo "DISABLE_VIDEO_DOWNLOAD=true"
} >> "$GITHUB_ENV"

- name: Run Tests
env:
BROWSERSTACK_LOCAL: 'true'
Expand All @@ -183,7 +219,7 @@ jobs:
echo "BrowserStack App URL: ${{ inputs.browserstack_app_url }}"
echo "QA App Version: ${{ inputs.app_version }}"
echo "BrowserStack Build Name: $BROWSERSTACK_BUILD_NAME"

# Run the appropriate test command based on build_type flag
if [ "${{ inputs.build_type }}" = "onboarding" ]; then
yarn run-appwright:${{ inputs.platform }}-onboarding-bs
Expand All @@ -192,9 +228,9 @@ jobs:
else
yarn run-appwright:${{ inputs.platform }}-bs
fi

echo "✅ ${{ inputs.build_type }} tests completed for ${{ inputs.platform }} on ${{ matrix.device.name }}"

- name: Upload Test Results
uses: actions/upload-artifact@v4
if: always()
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/push-eas-update.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,23 @@ env:
OTA_PUSH_PLATFORM: ${{ inputs.platform }}

jobs:
ota-summary:
name: OTA Update Summary
runs-on: ubuntu-latest
steps:
- name: Display OTA Summary
run: |
{
echo "### OTA Update Summary"
echo ""
echo "| Field | Value |"
echo "| --- | --- |"
echo "| **Update version** | ${UPDATE_MESSAGE} |"
echo "| **Target version** | ${BASE_BRANCH_REF} |"
echo "| **Environment** | ${TARGET_CHANNEL} |"
echo "| **Target commit** | ${TARGET_COMMIT_HASH} |"
} >> "$GITHUB_STEP_SUMMARY"

setup-dependencies:
name: Setup Dependencies (PR)
needs:
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/run-performance-e2e-experimental.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,17 @@
name: Performance E2E Tests for Experimental Builds
on:
schedule:
- cron: '0 */3 * * 1-6' # Every 3 hours, Mon–Fri (aligned with main performance workflow)
- cron: '0 */3 * * 1-6' # Every 3 hours, Mon–Fri (aligned with main performance workflow)
workflow_dispatch:
inputs:
sentry_target:
description: 'Sentry target for performance events (test or real)'
required: false
type: choice
options:
- test
- real
default: test
push:
branches:
- main
Expand Down Expand Up @@ -53,4 +62,5 @@ jobs:
with:
branch_name: main
build_variant: exp
sentry_target: ${{ inputs.sentry_target || 'test' }}
secrets: inherit
15 changes: 13 additions & 2 deletions .github/workflows/run-performance-e2e-release.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
name: Performance E2E Tests for Release Builds
on:
schedule:
- cron: '*/30 * * * *' # Every 30 minutes to check for metamaskbot commits
- cron: '*/30 * * * *' # Every 30 minutes to check for metamaskbot commits
workflow_dispatch:
inputs:
sentry_target:
description: 'Sentry target for performance events (test or real)'
required: false
type: choice
options:
- test
- real
default: test
push:
branches:
- 'release/*'
Expand All @@ -24,7 +33,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Check release trigger conditions
id: check
run: |
Expand Down Expand Up @@ -79,4 +88,6 @@ jobs:
uses: ./.github/workflows/run-performance-e2e.yml
needs: [check-release-trigger]
if: needs.check-release-trigger.outputs.should-run == 'true'
with:
sentry_target: ${{ inputs.sentry_target || 'test' }}
secrets: inherit
36 changes: 33 additions & 3 deletions .github/workflows/run-performance-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ on:
description: 'Optional description for this test run'
required: false
type: string
sentry_target:
description: 'Sentry target for performance events (test or real)'
required: false
type: choice
options:
- test
- real
default: test

browserstack_app_url_android_onboarding:
description: 'BrowserStack Android Onboarding App URL (bs://...)'
Expand All @@ -38,6 +46,11 @@ on:
description: 'Optional description for this test run'
required: false
type: string
sentry_target:
description: 'Sentry target for performance events (test or real)'
required: false
type: string
default: test

browserstack_app_url_android_onboarding:
description: 'BrowserStack Android Onboarding App URL (bs://...)'
Expand Down Expand Up @@ -210,11 +223,18 @@ jobs:
run-android-onboarding-tests:
name: Run Android Onboarding Tests
uses: ./.github/workflows/performance-test-runner.yml
needs: [read-device-matrix, trigger-android-dual-versions, set-build-names, determine-branch-name]
needs:
[
read-device-matrix,
trigger-android-dual-versions,
set-build-names,
determine-branch-name,
]
if: always() && !failure() && !cancelled() && (needs.trigger-android-dual-versions.result == 'skipped' || needs.trigger-android-dual-versions.result == 'success') && (inputs.browserstack_app_url_android_onboarding != '' || needs.trigger-android-dual-versions.outputs.without-srp-browserstack-url != '')
with:
platform: android
build_type: onboarding
sentry_target: ${{ inputs.sentry_target || 'test' }}
device_matrix: ${{ needs.read-device-matrix.outputs.android_matrix }}
browserstack_app_url: ${{ needs.trigger-android-dual-versions.outputs.without-srp-browserstack-url || inputs.browserstack_app_url_android_onboarding }}
app_version: ${{ needs.trigger-android-dual-versions.outputs.without-srp-version || 'Manual-Input' }}
Expand All @@ -225,11 +245,18 @@ jobs:
run-ios-onboarding-tests:
name: Run iOS Onboarding Tests
uses: ./.github/workflows/performance-test-runner.yml
needs: [read-device-matrix, trigger-ios-dual-versions, set-build-names, determine-branch-name]
needs:
[
read-device-matrix,
trigger-ios-dual-versions,
set-build-names,
determine-branch-name,
]
if: always() && !failure() && !cancelled() && (needs.trigger-ios-dual-versions.result == 'skipped' || needs.trigger-ios-dual-versions.result == 'success') && (inputs.browserstack_app_url_ios_onboarding != '' || needs.trigger-ios-dual-versions.outputs.without-srp-browserstack-url != '')
with:
platform: ios
build_type: onboarding
sentry_target: ${{ inputs.sentry_target || 'test' }}
device_matrix: ${{ needs.read-device-matrix.outputs.ios_matrix }}
browserstack_app_url: ${{ needs.trigger-ios-dual-versions.outputs.without-srp-browserstack-url || inputs.browserstack_app_url_ios_onboarding }}
app_version: ${{ needs.trigger-ios-dual-versions.outputs.without-srp-version || 'Manual-Input' }}
Expand Down Expand Up @@ -267,6 +294,7 @@ jobs:
with:
platform: android
build_type: imported-wallet
sentry_target: ${{ inputs.sentry_target || 'test' }}
device_matrix: ${{ needs.read-device-matrix.outputs.android_matrix }}
browserstack_app_url: ${{ needs.trigger-android-dual-versions.outputs.with-srp-browserstack-url || inputs.browserstack_app_url_android_imported_wallet }}
app_version: ${{ needs.trigger-android-dual-versions.outputs.with-srp-version || 'Manual-Input' }}
Expand All @@ -289,6 +317,7 @@ jobs:
with:
platform: ios
build_type: imported-wallet
sentry_target: ${{ inputs.sentry_target || 'test' }}
device_matrix: ${{ needs.read-device-matrix.outputs.ios_matrix }}
browserstack_app_url: ${{ needs.trigger-ios-dual-versions.outputs.with-srp-browserstack-url || inputs.browserstack_app_url_ios_imported_wallet }}
app_version: ${{ needs.trigger-ios-dual-versions.outputs.with-srp-version || 'Manual-Input' }}
Expand All @@ -311,6 +340,7 @@ jobs:
with:
platform: android
build_type: mm-connect
sentry_target: ${{ inputs.sentry_target || 'test' }}
device_matrix: ${{ needs.read-device-matrix.outputs.android_matrix }}
browserstack_app_url: ${{ needs.trigger-android-dual-versions.outputs.with-srp-browserstack-url || inputs.browserstack_app_url_android_imported_wallet }}
app_version: ${{ needs.trigger-android-dual-versions.outputs.with-srp-version || 'Manual-Input' }}
Expand Down Expand Up @@ -406,4 +436,4 @@ jobs:
payload: |
{
"text": "${{ steps.summary.outputs.summary }}"
}
}
Loading
Loading