Skip to content

Commit 86745bf

Browse files
authored
release: 7.82.0 (#31598)
# 🚀 v7.82.0 Testing & Release Quality Process Hi Team, As part of our new **MetaMask Release Quality Process**, here’s a quick overview of the key processes, testing strategies, and milestones to ensure a smooth and high-quality deployment. --- ## 📋 Key Processes ### Testing Strategy - **Developer Teams:** Conduct regression and exploratory testing for your functional areas, including automated and manual tests for critical workflows. - **QA Team:** Focus on exploratory testing across the wallet, prioritize high-impact areas, and triage any Sentry errors found during testing. - **Customer Success Team:** Validate new functionalities and provide feedback to support release monitoring. ### GitHub Signoff - Each team must **sign off on the Release Candidate (RC)** via GitHub by the end of the validation timeline (**Tuesday EOD PT**). - Ensure all tests outlined in the Testing Plan are executed, and any identified issues are addressed. ### Issue Resolution - **Resolve all Release Blockers** (Sev0 and Sev1) by **Tuesday EOD PT**. - For unresolved blockers, PRs may be reverted, or feature flags disabled to maintain release quality and timelines. ### Cherry-Picking Criteria - Only **critical fixes** meeting outlined criteria will be cherry-picked. - Developers must ensure these fixes are thoroughly reviewed, tested, and merged by **Tuesday EOD PT**. --- ## 🗓️ Timeline and Milestones 1. **Today (Friday):** Begin Release Candidate validation. 2. **Tuesday EOD PT:** Finalize RC with all fixes and cherry-picks. 3. **Wednesday:** Buffer day for final checks. 4. **Thursday:** Submit release to app stores and begin rollout to 1% of users. 5. **Monday:** Scale deployment to 10%. 6. **Tuesday:** Full rollout to 100%. --- ## ✅ Signoff Checklist Each team is responsible for signing off via GitHub. Use the checkbox below to track signoff completion: # Team sign-off checklist - [x] Accounts - [x] Assets - [x] Bots Team - [x] Card - [x] Confirmations - [x] Core Platform - [x] Delegation - [x] Design System - [x] Earn - [x] Engagement - [x] Mobile Platform - [x] Mobile UX - [X] Money Movement - [x] Networks - [x] Onboarding - [x] Perps - [x] Predict - [x] Rewards - [x] Social & AI - [x] Swaps and Bridge - [x] Wallet Integrations This process is a major step forward in ensuring release stability and quality. Let’s stay aligned and make this release a success! 🚀 Feel free to reach out if you have questions or need clarification. Many thanks in advance # Reference - Testing plan sheet - https://docs.google.com/spreadsheets/d/1tsoodlAlyvEUpkkcNcbZ4PM9HuC9cEM80RZeoVv5OCQ/edit?gid=404070372#gid=404070372
2 parents 2c82210 + 401c83c commit 86745bf

1,589 files changed

Lines changed: 86412 additions & 23092 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/CODEOWNERS

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,6 @@ app/components/UI/CollectibleContractOverview @MetaMask/metamask-assets
264264
app/components/UI/CollectibleContracts @MetaMask/metamask-assets
265265
app/components/UI/CollectibleDetectionModal @MetaMask/metamask-assets
266266
app/components/UI/CollectibleMedia @MetaMask/metamask-assets
267-
app/components/UI/CollectibleModal @MetaMask/metamask-assets
268267
app/components/UI/CollectibleOverview @MetaMask/metamask-assets
269268
app/components/UI/ConfirmAddAsset @MetaMask/metamask-assets
270269
app/components/UI/DeFiPositions @MetaMask/metamask-assets
@@ -375,6 +374,10 @@ tests/websocket/ @MetaMask/qa
375374
.github/actions/smart-e2e-selection/ @MetaMask/qa
376375
.github/workflows/ai-pr-risk-analysis.yml @MetaMask/qa
377376
.github/workflows/auto-label-not-ready-for-e2e.yml @MetaMask/qa
377+
.github/workflows/run-appium-e2e-workflow.yml @MetaMask/qa
378+
.github/workflows/run-appium-smoke-tests-android.yml @MetaMask/qa
379+
.github/workflows/run-appium-smoke-tests-ios.yml @MetaMask/qa
380+
.github/workflows/prebuild-wda-ios.yml @MetaMask/qa
378381
.github/workflows/run-e2e-workflow.yml @MetaMask/qa
379382
.github/workflows/run-e2e-api-specs.yml @MetaMask/qa
380383
.github/workflows/run-e2e-regression-tests-android.yml @MetaMask/qa

.github/CONTRIBUTING.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ There are also plenty of open issues we'd love help with. Search the [`good firs
1111
If you're picking up a bounty or an existing issue, feel free to ask clarifying questions on the issue as you go about your work.
1212

1313
### Submitting a pull request
14+
1415
When you're done with your project / bugfix / feature and ready to submit a PR, there are a couple guidelines we ask you to follow:
1516

1617
- [ ] **Make sure you followed our [`coding guidelines`](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md)**: These guidelines aim to maintain consistency and readability across the codebase. They help ensure that the code is easy to understand, maintain, and modify, which is particularly important when working with multiple contributors.
@@ -25,6 +26,6 @@ When you're done with your project / bugfix / feature and ready to submit a PR,
2526

2627
### Shadow CI jobs
2728

28-
CI jobs prefixed with `[shadow]` (e.g., from `ci-namespace-shadow.yml`) are **advisory only** and never gate merge. They run the same test suite on Namespace runners for performance benchmarking. If a shadow job fails, it does not indicate a problem with your PR -- it reflects the state of the Namespace runner migration trial.
29+
The Namespace shadow CI (`ci-namespace-shadow.yml`) no longer runs automatically: its automatic triggers (PRs, pushes to `main`, hourly schedule) are disabled now that the Phase 5d benchmark is complete. It is retained for on-demand runs via manual `workflow_dispatch`, or you can dispatch `ci.yml` directly with `runner_provider=namespace`. Any `[shadow]`-prefixed jobs were always **advisory only** and never gated merge.
2930

3031
And that's it! Thanks for helping out.

.github/actions/setup-e2e-env/action.yml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ inputs:
109109
— Detox does not require the Pods directory to run tests.
110110
required: false
111111
default: 'false'
112+
install-applesimutils:
113+
description: >-
114+
Whether to install applesimutils (iOS only). Required by Detox but not
115+
by Appium — set to 'false' for Appium test jobs
116+
required: false
117+
default: 'true'
112118

113119
runs:
114120
using: 'composite'
@@ -176,7 +182,9 @@ runs:
176182
run: |
177183
set -euo pipefail
178184
sudo mkdir -p "$CACHE_PATH" /opt/android-sdk/.temp
179-
sudo chown -R "$(id -u):$(id -g)" "$CACHE_PATH" /opt/android-sdk/.temp
185+
# chown the parent dir too so sdkmanager can create x86_64.backup
186+
# next to x86_64 during installation (requires write on the parent).
187+
sudo chown -R "$(id -u):$(id -g)" "$(dirname "$CACHE_PATH")" /opt/android-sdk/.temp
180188
shell: bash
181189

182190
# Restore exact system image from cache (GitHub only — Namespace uses nscloud-cache-action in callers)
@@ -444,7 +452,7 @@ runs:
444452
COCOAPODS_DISABLE_STATS: 'true'
445453

446454
- name: Install applesimutils
447-
if: ${{ inputs.platform == 'ios' }}
455+
if: ${{ inputs.platform == 'ios' && inputs.install-applesimutils == 'true' }}
448456
run: |
449457
if ! brew list applesimutils &>/dev/null; then
450458
brew tap wix/brew
@@ -455,6 +463,6 @@ runs:
455463
shell: bash
456464

457465
- name: Check simutils
458-
if: ${{ inputs.platform == 'ios' }}
466+
if: ${{ inputs.platform == 'ios' && inputs.install-applesimutils == 'true' }}
459467
run: xcrun simctl list devices
460468
shell: bash

.github/actions/smart-e2e-selection/action.yml

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,11 @@ outputs:
3838
description: 'AI confidence score (0-100)'
3939
value: ${{ steps.final-outputs.outputs.ai_confidence }}
4040
ai_performance_test_tags:
41-
description: 'Performance test tags to run (JSON array format, empty [] means no performance tests)'
41+
description: "Performance test tags to run. Empty string '' = run all (conservative fallback). Literal '[]' = skip (AI found no relevant changes). '[\"@Tag\",...]' = run specific tags."
4242
value: ${{ steps.final-outputs.outputs.ai_performance_test_tags }}
43+
ai_performance_test_reasoning:
44+
description: 'Reasoning for the performance test selection'
45+
value: ${{ steps.final-outputs.outputs.ai_performance_test_reasoning }}
4346

4447
runs:
4548
using: 'composite'
@@ -134,18 +137,27 @@ runs:
134137
run: |
135138
echo "ai_e2e_test_tags=[\"ALL\"]" >> "$GITHUB_OUTPUT"
136139
echo "ai_confidence=0" >> "$GITHUB_OUTPUT"
137-
echo "ai_performance_test_tags=[]" >> "$GITHUB_OUTPUT"
140+
# Empty string = run all performance tests (conservative fallback).
141+
# '[]' is reserved for "AI ran successfully and found no relevant changes".
142+
echo "ai_performance_test_tags=" >> "$GITHUB_OUTPUT"
138143
139144
if [[ "${{ steps.check-skip-label.outputs.SKIP }}" == "true" ]]; then
140145
echo "⏭️ Skipping AI analysis - skip-smart-e2e-selection label found"
141146
echo "SKIPPED=true" >> "$GITHUB_OUTPUT"
142147
echo "SKIP_REASON=skip-smart-e2e-selection label found" >> "$GITHUB_OUTPUT"
143148
echo "ai_confidence=100" >> "$GITHUB_OUTPUT"
149+
# Skip label → run all E2E (ALL) but do NOT launch the PR performance workflow.
150+
# Performance tests are expensive and the skip label only opts out of AI selection,
151+
# not into a full performance run. Use '[]' so run-performance-tests-pr is skipped.
152+
echo "ai_performance_test_tags=[]" >> "$GITHUB_OUTPUT"
144153
elif [[ "${{ steps.check-release-target.outputs.SKIP }}" == "true" ]]; then
145154
echo "⏭️ Skipping AI analysis - PR targets a release or stable branch"
146155
echo "SKIPPED=true" >> "$GITHUB_OUTPUT"
147156
echo "SKIP_REASON=PR targets a release or stable branch (release/* or stable)" >> "$GITHUB_OUTPUT"
148157
echo "ai_confidence=100" >> "$GITHUB_OUTPUT"
158+
# Release/stable target → the scheduled performance workflow covers these branches.
159+
# No need to also trigger the PR performance job.
160+
echo "ai_performance_test_tags=[]" >> "$GITHUB_OUTPUT"
149161
else
150162
echo "✅ Running AI analysis for PR #$PR_NUMBER"
151163
# The script will generate the GH output variables - don't fail if script errors
@@ -156,31 +168,39 @@ runs:
156168
id: final-outputs
157169
if: always()
158170
shell: bash
171+
env:
172+
AI_E2E_TAGS: ${{ steps.ai-analysis.outputs.ai_e2e_test_tags }}
173+
AI_CONFIDENCE: ${{ steps.ai-analysis.outputs.ai_confidence }}
174+
AI_PERF_TAGS: ${{ steps.ai-analysis.outputs.ai_performance_test_tags }}
175+
AI_PERF_REASONING: ${{ steps.ai-analysis.outputs.ai_performance_test_reasoning }}
159176
run: |
160-
TAGS='${{ steps.ai-analysis.outputs.ai_e2e_test_tags }}'
161-
if [[ -n "$TAGS" ]]; then
162-
printf 'ai_e2e_test_tags=%s\n' "$TAGS" >> "$GITHUB_OUTPUT"
177+
if [[ -n "$AI_E2E_TAGS" ]]; then
178+
printf 'ai_e2e_test_tags=%s\n' "$AI_E2E_TAGS" >> "$GITHUB_OUTPUT"
163179
else
164180
echo 'ai_e2e_test_tags=["ALL"]' >> "$GITHUB_OUTPUT"
165181
fi
166-
echo "ai_confidence=${{ steps.ai-analysis.outputs.ai_confidence }}" >> "$GITHUB_OUTPUT"
167-
# Performance test tags (empty array means no performance tests)
168-
PERF_TAGS='${{ steps.ai-analysis.outputs.ai_performance_test_tags }}'
169-
if [[ -n "$PERF_TAGS" ]]; then
170-
printf 'ai_performance_test_tags=%s\n' "$PERF_TAGS" >> "$GITHUB_OUTPUT"
171-
else
172-
echo 'ai_performance_test_tags=[]' >> "$GITHUB_OUTPUT"
173-
fi
182+
printf 'ai_confidence=%s\n' "$AI_CONFIDENCE" >> "$GITHUB_OUTPUT"
183+
# Performance test tags: empty string = run all (fallback); '[]' = skip (AI found no changes)
184+
printf 'ai_performance_test_tags=%s\n' "$AI_PERF_TAGS" >> "$GITHUB_OUTPUT"
185+
# Performance test reasoning (multi-line — must use heredoc format)
186+
{
187+
echo 'ai_performance_test_reasoning<<GHEOF'
188+
echo "$AI_PERF_REASONING"
189+
echo 'GHEOF'
190+
} >> "$GITHUB_OUTPUT"
174191
175192
- name: Display AI Analysis Outputs
176193
if: always()
177194
shell: bash
195+
env:
196+
PERF_REASONING: ${{ steps.final-outputs.outputs.ai_performance_test_reasoning }}
178197
run: |
179198
echo "📊 Final GitHub Action Outputs:"
180199
echo "================================"
181200
echo "ai_e2e_test_tags: ${{ steps.final-outputs.outputs.ai_e2e_test_tags }}"
182201
echo "ai_confidence: ${{ steps.final-outputs.outputs.ai_confidence }}"
183202
echo "ai_performance_test_tags: ${{ steps.final-outputs.outputs.ai_performance_test_tags }}"
203+
echo "ai_performance_test_reasoning: $PERF_REASONING"
184204
echo "================================"
185205
186206
- name: Delete previous comments

.github/guidelines/LABELING_GUIDELINES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ Using any of these labels should be exceptional in case of CI friction and urgen
3939

4040
- **skip-smart-e2e-selection**: Bypasses the AI-powered Smart E2E Selection so that the full E2E test suite runs instead of an AI-picked subset. This label does **not** force E2E builds/tests to run on a PR that would otherwise skip them (e.g. docs-only changes). Whether E2E runs at all is determined by path filters, branch, and other skip labels — not this label.
4141

42+
### Force Performance Tests
43+
44+
- **run-performance-tests**: Forces the PR performance E2E workflow to run (all performance tests on Android low-profile devices), even when Smart E2E Selection would skip them (e.g. no performance-relevant changes detected, `skip-e2e`, or `pr-not-ready-for-e2e`). Adding or removing this label re-triggers CI. Not honored on fork PRs.
45+
4246
### Block merge if any is present
4347

4448
- **needs-qa**: The PR requires a full manual QA prior to being merged and added to a release.

.github/pull-request-template.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ markdown and must NOT be removed or edited without updating the validator regist
1919
type=manual-testing Section must have real testing steps or an explicit N/A.
2020
type=screenshot Section must have evidence (image/URL) or an explicit N/A.
2121
type=checklist Section must have all checkboxes consciously checked.
22-
required=true|false Whether a missing/invalid section blocks the PR check.
22+
required=true|false Whether a missing/invalid section runs the validator at all.
23+
blocking=true|false Whether a failure of this check fails the CI workflow.
24+
Default: false — failures are shown as warnings in the sticky
25+
comment but do not block the PR.
2326
2427
Sections without a directive are checked for structural presence only.
2528
-->
@@ -36,7 +39,7 @@ Write a short description of the changes included in this pull request, also inc
3639

3740
## **Changelog**
3841

39-
<!-- mms-check: type=changelog required=true -->
42+
<!-- mms-check: type=changelog required=true blocking=true -->
4043

4144
<!--
4245
If this PR is not End-User-Facing and should not show up in the CHANGELOG, you can choose to either:

0 commit comments

Comments
 (0)