Skip to content
Closed
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
b72f588
trigger workflow
weitingsun Mar 18, 2026
4094ec0
fix permission issue
weitingsun Mar 18, 2026
8e6eb30
[skip ci] Bump version number to 4061
metamaskbot Mar 18, 2026
8059703
test ota update
weitingsun Mar 18, 2026
35351ff
Merge branch 'release/test-runway-rc-ios-workflow' of github.com:Meta…
weitingsun Mar 18, 2026
7d64236
resolve if release tag does not exist
weitingsun Mar 18, 2026
552f6b0
fix no PR number found error
weitingsun Mar 18, 2026
76e0a6f
fix base branch issue
weitingsun Mar 18, 2026
93bd6ad
change version to 7.69.0
weitingsun Mar 18, 2026
f12eda7
trigger workflow
weitingsun Mar 18, 2026
e6bbbc9
fix(ci): pass ref to build.yml so RC build uses same branch as OTA check
weitingsun Mar 18, 2026
8d5ec32
Merge branch 'main' into wsun/create-runway-rc-ios-workflow
weitingsun Mar 18, 2026
967a8ed
Merge branch 'main' into wsun/create-runway-rc-ios-workflow
weitingsun Mar 19, 2026
9873c5d
add runway_android_rc_workflow.yml
weitingsun Mar 19, 2026
9298e1c
add upload to TestFlight job
weitingsun Mar 19, 2026
644f2fd
Merge branch 'wsun/create-runway-rc-ios-workflow' into release/test-r…
weitingsun Mar 19, 2026
e9e983c
revert ota version
weitingsun Mar 19, 2026
8f5c0eb
[skip ci] Bump version number to 4109
metamaskbot Mar 19, 2026
549c65a
use inputs.ref for version bump when source_branch is unset
weitingsun Mar 19, 2026
3d0dcb2
Merge branch 'wsun/create-runway-rc-ios-workflow' into release/test-r…
weitingsun Mar 19, 2026
a619555
Merge branch 'release/test-runway-rc-ios-workflow' of github.com:Meta…
weitingsun Mar 19, 2026
70cc2c5
[skip ci] Bump version number to 4110
metamaskbot Mar 19, 2026
97773fc
upload to internal TestFlight
weitingsun Mar 20, 2026
8c1a878
Merge branch 'wsun/create-runway-rc-ios-workflow' into release/test-r…
weitingsun Mar 20, 2026
41c93dd
Merge branch 'release/test-runway-rc-ios-workflow' of github.com:Meta…
weitingsun Mar 20, 2026
73503b1
Merge branch 'main' into wsun/create-runway-rc-ios-workflow
weitingsun Mar 20, 2026
9deb847
upload to internal group only
weitingsun Mar 20, 2026
45bfe83
Merge branch 'wsun/create-runway-rc-ios-workflow' into release/test-r…
weitingsun Mar 20, 2026
a63ef54
[skip ci] Bump version number to 4127
metamaskbot Mar 20, 2026
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
150 changes: 150 additions & 0 deletions .github/workflows/runway_ios_rc_workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
##############################################################################################
#
# Runway iOS RC Workflow
#
# Triggered from Runway to either:
# - Push an OTA update (when OTA_VERSION in app/constants/ota.ts line 9 is bumped), or
# - Build the mobile app (when there is no OTA version bump).
#
# When triggering workflow_dispatch, select the release branch (e.g. release/7.71.0).
#
##############################################################################################
name: Runway iOS RC

on:
push:
branches:
- 'release/*'
workflow_dispatch:
inputs:
ref:
description: 'Optional git ref (branch) to run against. Defaults to the branch selected in the UI.'
required: false
type: string

permissions:
contents: write # required by build.yml (update-build-version job)
pull-requests: read
actions: write
id-token: write # required by build.yml

jobs:
decide:
name: Check OTA version and resolve inputs
runs-on: ubuntu-latest
outputs:
ota_bump: ${{ steps.decide.outputs.ota_bump }}
base_ref: ${{ steps.decide.outputs.base_ref }}
ota_version: ${{ steps.decide.outputs.ota_version }}
pr_number: ${{ steps.resolve-pr.outputs.pr_number }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ inputs.ref || github.ref }}

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'

- name: Resolve PR number for current branch
id: resolve-pr
run: |
BRANCH="${{ inputs.ref || github.ref_name }}"
# Strip refs/heads/ if present
BRANCH="${BRANCH#refs/heads/}"
echo "Resolving PR for branch: $BRANCH (repo: $GITHUB_REPOSITORY)"

# Try same-repo head first, then owner:branch (required by API when listing pulls)
PR_NUMBER=$(gh pr list --repo "$GITHUB_REPOSITORY" --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
if [[ -z "$PR_NUMBER" ]]; then
PR_NUMBER=$(gh pr list --repo "$GITHUB_REPOSITORY" --head "$GITHUB_REPOSITORY_OWNER:$BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
fi

echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
echo "Branch: $BRANCH, PR number: ${PR_NUMBER:-none}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Decide OTA vs build
id: decide
run: |
set -e
# Version from package.json (e.g. 7.70.0) → base ref for OTA workflow is always v{VERSION}
VERSION=$(node -p "require('./package.json').version")
RELEASE_TAG="v${VERSION}"
echo "base_ref=${RELEASE_TAG}" >> "$GITHUB_OUTPUT"
Comment thread
cursor[bot] marked this conversation as resolved.

# Extract OTA_VERSION from line 9 (format: export const OTA_VERSION: string = 'vX.Y.Z';)
extract_ota() { sed -n '9p' "$1" | sed "s/.*'\\([^']*\\)'.*/\1/"; }

# OTA_VERSION from current ref
CURRENT_OTA=$(extract_ota app/constants/ota.ts)
echo "ota_version=${CURRENT_OTA}" >> "$GITHUB_OUTPUT"

# Ref to compare against for detecting bump: use release tag if it exists, else main
if git rev-parse "$RELEASE_TAG" >/dev/null 2>&1; then
COMPARE_REF="$RELEASE_TAG"
BASE_OTA=$(git show "${COMPARE_REF}:app/constants/ota.ts" 2>/dev/null | sed -n '9p' | sed "s/.*'\\([^']*\\)'.*/\1/" || echo "")
else
COMPARE_REF="main"
BASE_OTA=$(git show "origin/main:app/constants/ota.ts" 2>/dev/null | sed -n '9p' | sed "s/.*'\\([^']*\\)'.*/\1/" || echo "")
echo "Release tag ${RELEASE_TAG} not found; comparing OTA_VERSION to ${COMPARE_REF} to detect bump"
fi

if [[ -n "$BASE_OTA" && "$CURRENT_OTA" != "$BASE_OTA" ]]; then
echo "ota_bump=true" >> "$GITHUB_OUTPUT"
echo "OTA_VERSION changed: $BASE_OTA -> $CURRENT_OTA → will trigger OTA update"
else
echo "ota_bump=false" >> "$GITHUB_OUTPUT"
echo "No OTA version bump (base: $BASE_OTA, current: $CURRENT_OTA) → will trigger build"
fi

trigger-ota:
name: Trigger OTA update
needs: decide
if: needs.decide.outputs.ota_bump == 'true'
runs-on: ubuntu-latest
steps:
- name: Validate PR number
run: |
if [[ -z "${{ needs.decide.outputs.pr_number }}" ]]; then
echo "::error::No PR found for this branch. OTA update requires a PR number."
echo "::error::If you ran the workflow manually (workflow_dispatch), select your release branch in the 'Use workflow from' dropdown (e.g. release/test-runway-rc-ios-workflow), not main."
Comment thread
cursor[bot] marked this conversation as resolved.
Outdated
exit 1
fi
echo "Using PR #${{ needs.decide.outputs.pr_number }}"

- name: Trigger Push OTA Update workflow
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const ref = '${{ inputs.ref || github.ref_name }}'.replace(/^refs\/heads\//, '');
Comment thread
cursor[bot] marked this conversation as resolved.
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'push-eas-update.yml',
ref: ref,
inputs: {
pr_number: '${{ needs.decide.outputs.pr_number }}',
base_branch: '${{ needs.decide.outputs.base_ref }}',
message: '${{ needs.decide.outputs.ota_version }}',
channel: 'rc',
platform: 'ios'
}
});
core.notice(`Triggered Push OTA Update on ${ref} (PR #${{ needs.decide.outputs.pr_number }}, base: ${{ needs.decide.outputs.base_ref }}, message: ${{ needs.decide.outputs.ota_version }})`);

trigger-build:
name: Trigger build mobile app
needs: decide
if: needs.decide.outputs.ota_bump != 'true'
uses: ./.github/workflows/build.yml
with:
build_name: main-rc
platform: ios
skip_version_bump: false
secrets: inherit
Comment thread
cursor[bot] marked this conversation as resolved.
4 changes: 2 additions & 2 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,8 @@ android {
applicationId "io.metamask"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionName "7.71.0"
versionCode 3607
versionName "7.69.0"
versionCode 4061
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
manifestPlaceholders.MM_BRANCH_KEY_TEST = "$System.env.MM_BRANCH_KEY_TEST"
Expand Down
2 changes: 1 addition & 1 deletion app/constants/ota.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import otaConfig from '../../ota.config.js';
* Reset to v0 when releasing a new native build
* We keep this OTA_VERSION here to because changes in ota.config.js will affect the fingerprint and break the workflow in Github Actions
*/
export const OTA_VERSION: string = 'v7.65.1';
export const OTA_VERSION: string = 'v7.69.3';
export const RUNTIME_VERSION = otaConfig.RUNTIME_VERSION;
export const PROJECT_ID = otaConfig.PROJECT_ID;
export const UPDATE_URL = otaConfig.UPDATE_URL;
8 changes: 4 additions & 4 deletions bitrise.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3531,16 +3531,16 @@ app:
PROJECT_LOCATION_IOS: ios
- opts:
is_expand: false
VERSION_NAME: 7.71.0
VERSION_NAME: 7.69.0
- opts:
is_expand: false
VERSION_NUMBER: 3911
VERSION_NUMBER: 4061
- opts:
is_expand: false
FLASK_VERSION_NAME: 7.71.0
FLASK_VERSION_NAME: 7.69.0
- opts:
is_expand: false
FLASK_VERSION_NUMBER: 3911
FLASK_VERSION_NUMBER: 4061
- opts:
is_expand: false
ANDROID_APK_LINK: ''
Expand Down
24 changes: 12 additions & 12 deletions ios/MetaMask.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1281,7 +1281,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3911;
CURRENT_PROJECT_VERSION = 4061;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 48XVW22RCG;
Expand Down Expand Up @@ -1319,7 +1319,7 @@
"${inherited}",
);
LLVM_LTO = YES;
MARKETING_VERSION = 7.71.0;
MARKETING_VERSION = 7.69.0;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = (
Expand Down Expand Up @@ -1350,7 +1350,7 @@
CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements;
CODE_SIGN_IDENTITY = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3911;
CURRENT_PROJECT_VERSION = 4061;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 48XVW22RCG;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG;
Expand Down Expand Up @@ -1385,7 +1385,7 @@
"${inherited}",
);
LLVM_LTO = YES;
MARKETING_VERSION = 7.71.0;
MARKETING_VERSION = 7.69.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = (
Expand Down Expand Up @@ -1416,7 +1416,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3911;
CURRENT_PROJECT_VERSION = 4061;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 48XVW22RCG;
Expand Down Expand Up @@ -1454,7 +1454,7 @@
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
);
LLVM_LTO = YES;
MARKETING_VERSION = 7.71.0;
MARKETING_VERSION = 7.69.0;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = (
Expand Down Expand Up @@ -1483,7 +1483,7 @@
CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements;
CODE_SIGN_IDENTITY = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3911;
CURRENT_PROJECT_VERSION = 4061;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 48XVW22RCG;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG;
Expand Down Expand Up @@ -1518,7 +1518,7 @@
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
);
LLVM_LTO = YES;
MARKETING_VERSION = 7.71.0;
MARKETING_VERSION = 7.69.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = (
Expand Down Expand Up @@ -1646,7 +1646,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3911;
CURRENT_PROJECT_VERSION = 4061;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 48XVW22RCG;
Expand Down Expand Up @@ -1684,7 +1684,7 @@
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
);
LLVM_LTO = YES;
MARKETING_VERSION = 7.71.0;
MARKETING_VERSION = 7.69.0;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = (
"$(inherited)",
Expand Down Expand Up @@ -1716,7 +1716,7 @@
CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements;
CODE_SIGN_IDENTITY = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3911;
CURRENT_PROJECT_VERSION = 4061;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 48XVW22RCG;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG;
Expand Down Expand Up @@ -1751,7 +1751,7 @@
"\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"",
);
LLVM_LTO = YES;
MARKETING_VERSION = 7.71.0;
MARKETING_VERSION = 7.69.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = (
"$(inherited)",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "metamask",
"version": "7.71.0",
"version": "7.69.0",
"private": true,
"scripts": {
"install:foundryup": "yarn mm-foundryup",
Expand Down
Loading