Skip to content
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
374ecd3
ci(actionlint): register Namespace runner labels
jluque0101 Apr 30, 2026
534abd2
ci(workflows): add runner_provider workflow_dispatch input on Phase 1…
jluque0101 Apr 30, 2026
2167ddc
ci(workflows): add runner_provider workflow_call input on Phase 1-4 r…
jluque0101 Apr 30, 2026
87ee641
ci(workflows): forward runner_provider to Phase 1-4 reusable callees
jluque0101 Apr 30, 2026
3e2ea7f
ci(workflows): wrap runs-on in runner_provider ternary on Phase 1-4 jobs
jluque0101 Apr 30, 2026
9046d5c
ci(workflows): replace Namespace placeholder with canonical profile l…
jluque0101 Apr 30, 2026
17615e1
Merge branch 'main' into namespace-runner-trial
jluque0101 May 4, 2026
82136ac
Merge branch 'main' into namespace-runner-trial
jluque0101 May 4, 2026
5a68282
Merge branch 'main' into namespace-runner-trial
jluque0101 May 4, 2026
5a8c041
Merge branch 'main' into namespace-runner-trial
jluque0101 May 4, 2026
f0b04ee
Merge branch 'main' into namespace-runner-trial
jluque0101 May 4, 2026
08caa40
Merge branch 'main' into namespace-runner-trial
jluque0101 May 4, 2026
c7a597e
Merge branch 'main' into namespace-runner-trial
jluque0101 May 5, 2026
36ffd4d
Merge remote-tracking branch 'origin/main' into namespace-runner-trial
jluque0101 May 5, 2026
fe5188d
Merge branch 'main' into namespace-runner-trial
jluque0101 May 6, 2026
734f456
INFRA-3596: phase4: add workflow_dispatch to build-ios-e2e, update ru…
XxdpavelxX May 6, 2026
9968d30
fix: quote $HOME in debug step, declare runner_provider input in api-…
XxdpavelxX May 6, 2026
de2f549
feat: add nscloud-cache-action for iOS build cache (Phase 4 Step 5)
XxdpavelxX May 6, 2026
2ab6107
fix: remove ios/build from nscloud cache paths to prevent mount inter…
XxdpavelxX May 6, 2026
f073446
fix: remove DerivedData from nscloud cache to prevent stale build index
XxdpavelxX May 6, 2026
bfd2c57
fix(ci): clear Xcode DerivedData before build on Namespace runner
XxdpavelxX May 6, 2026
43b2f1f
fix(ci): also clear ios/build before Namespace iOS build
XxdpavelxX May 7, 2026
b049760
fix(ci): remove ios/Pods from nscloud cache, clear before pod install
XxdpavelxX May 7, 2026
a8964e7
ci(infra-3596): plumb runner_provider through run-e2e-api-specs.yml
XxdpavelxX May 8, 2026
3ada7d1
ci(infra-3596): provider-aware runs-on in update-e2e-fixtures.yml
XxdpavelxX May 8, 2026
cf1f514
ci(infra-3596): provider-aware runs-on for signed iOS / TestFlight up…
XxdpavelxX May 8, 2026
ed0bc5c
ci(infra-3596): provider-aware runs-on in build-ios-upload-to-browser…
XxdpavelxX May 8, 2026
1f2f633
chore(infra-3596): drop non-Phase-4 file changes from PR
XxdpavelxX May 11, 2026
e7405cc
Merge remote-tracking branch 'origin/main' into namespace-runner-trial4
XxdpavelxX May 11, 2026
2194102
fix(ci): restore id-token permission for build-ios-e2e.yml dispatch
XxdpavelxX May 11, 2026
fd64763
chore(ci): trim verbose comments in build-ios-e2e.yml Namespace steps
XxdpavelxX May 11, 2026
d806dc2
test(ci): A/B test — try cocoapods preset, keep clear step
XxdpavelxX May 11, 2026
0ec5f25
test(ci): A/B test — preset only, no clear step
XxdpavelxX May 11, 2026
f37c5cc
chore(ci): adopt cocoapods preset as canonical Namespace iOS cache co…
XxdpavelxX May 11, 2026
856c6c5
chore(ci): drop workflow_dispatch from build-ios-e2e.yml
XxdpavelxX May 11, 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
17 changes: 16 additions & 1 deletion .github/workflows/build-and-upload-to-testflight.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ on:
required: false
type: boolean
default: false
runner_provider:
description: Runner provider forwarded from the caller
required: false
type: string
default: current
workflow_dispatch:
inputs:
source_branch:
Expand Down Expand Up @@ -54,6 +59,14 @@ on:
required: false
type: boolean
default: false
runner_provider:
description: Runner provider for this manual trial run
required: false
type: choice
options:
- current
- namespace
default: current

permissions:
contents: write
Expand All @@ -75,6 +88,7 @@ jobs:
platform: ios
skip_version_bump: false
source_branch: ${{ needs.prepare-build-branch.outputs.build_branch }}
runner_provider: ${{ inputs.runner_provider }}
secrets: inherit

upload-ios-testflight:
Expand All @@ -90,13 +104,14 @@ jobs:
build_version: ${{ needs.build.outputs.semantic_version }}
build_number: ${{ needs.build.outputs.ios_version_code }}
distribute_external: ${{ inputs.distribute_external }}
runner_provider: ${{ inputs.runner_provider }}
secrets: inherit

cleanup-build-branch:
name: Cleanup build branch
needs: [prepare-build-branch, upload-ios-testflight]
if: always()
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
steps:
- uses: actions/checkout@v4
with:
Expand Down
39 changes: 37 additions & 2 deletions .github/workflows/build-ios-e2e.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
name: Build iOS E2E Apps

on:
workflow_dispatch:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the reason for we need to add a dispatch?

Copy link
Copy Markdown
Contributor Author

@XxdpavelxX XxdpavelxX May 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair point, added it for trial iteration speed during Phase 4 validation. It's useful during trial, not really needed once this lands. Removed

inputs:
runner_provider:
description: Runner provider for this manual trial run
required: true
type: choice
options:
- current
- namespace
default: current
build_type:
description: The type of build to perform
required: false
default: main
type: string
metamask_environment:
description: The environment to build for
required: false
default: qa
type: string
Comment thread
cursor[bot] marked this conversation as resolved.
Outdated
workflow_call:
outputs:
app-uploaded:
Expand Down Expand Up @@ -32,6 +52,13 @@ on:
type: string
default: current

# Needed when this workflow is dispatched directly (workflow_dispatch). When called
# via workflow_call, permissions are inherited from the caller. id-token: write is
# required by setup-e2e-env's AWS OIDC role assumption for signing-cert fetch.
permissions:
contents: read
id-token: write

jobs:
build-ios-apps:
name: Build iOS E2E Apps
Expand Down Expand Up @@ -145,7 +172,7 @@ jobs:

- name: Restore Xcode derived data from branch cache
id: xcode-restore-cache
if: ${{ steps.gate.outputs.needs-native-build == 'true' }}
if: ${{ steps.gate.outputs.needs-native-build == 'true' && inputs.runner_provider != 'namespace' }}
# This action automatically updates the cache at the end of the workflow
uses: cirruslabs/cache@bba69c6578b863ad0398ad40567bd2ef70290fe0 # v4
with:
Expand All @@ -155,7 +182,7 @@ jobs:
key: ${{ runner.os }}-xcode-${{ github.ref_name }}-${{ env.XCODE_CACHE_VERSION }}-${{ hashFiles('ios/**/*.{h,m,mm,swift}', 'ios/**/Podfile.lock', 'yarn.lock') }}

- name: Restore Xcode derived data from main cache
if: ${{ steps.gate.outputs.needs-native-build == 'true' && steps.xcode-restore-cache.outputs.cache-hit != 'true' && github.ref_name != 'main' }}
if: ${{ steps.gate.outputs.needs-native-build == 'true' && steps.xcode-restore-cache.outputs.cache-hit != 'true' && github.ref_name != 'main' && inputs.runner_provider != 'namespace' }}
id: xcode-restore-cache-main
# This will only restore the cache, not update it
uses: cirruslabs/cache/restore@bba69c6578b863ad0398ad40567bd2ef70290fe0 # v4
Expand All @@ -165,6 +192,14 @@ jobs:
ios/build
key: ${{ runner.os }}-xcode-main-${{ env.XCODE_CACHE_VERSION }}-${{ hashFiles('ios/**/*.{h,m,mm,swift}', 'ios/**/Podfile.lock', 'yarn.lock') }}

# Namespace's built-in cocoapods preset handles the CocoaPods cache paths upstream.
# Validated to work without a separate stale-state clear step (A/B tested 2026-05-11).
- name: Configure Namespace iOS cache
if: ${{ steps.gate.outputs.needs-native-build == 'true' && inputs.runner_provider == 'namespace' }}
uses: namespacelabs/nscloud-cache-action@15799a6b54e5765f85b2aac25b3f0df43ed571c0 # v1.4.3
with:
cache: cocoapods

# Install Node.js, Xcode tools, and other iOS development dependencies.
- name: Installing iOS Environment Setup
if: ${{ steps.gate.outputs.needs-native-build == 'true' }}
Expand Down
21 changes: 17 additions & 4 deletions .github/workflows/build-ios-upload-to-browserstack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ on:
type: string
description: 'Build variant for Bitrise (rc = release, exp = experimental)'
default: 'rc'
runner_provider:
description: Runner provider forwarded from the caller
required: false
type: string
default: current
outputs:
with-srp-ipa-uploaded:
description: 'Whether the with-SRP IPA was successfully uploaded'
Expand All @@ -49,6 +54,14 @@ on:
description: 'Optional description for this build run'
required: false
type: string
runner_provider:
description: Runner provider for this manual trial run
required: false
type: choice
options:
- current
- namespace
default: current

permissions:
contents: read
Expand All @@ -65,7 +78,7 @@ env:
jobs:
check-builds-needed:
name: Check if iOS builds are needed
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
outputs:
builds-needed: ${{ steps.check-builds.outputs.builds-needed }}

Expand All @@ -84,7 +97,7 @@ jobs:

trigger-ios-with-srp-build:
name: Trigger iOS with-SRP Build on Bitrise
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
needs: [check-builds-needed]
env:
METAMASK_WORKFLOW: ${{ inputs.build_variant == 'exp' && 'build_ios_main_exp' || 'build_ios_main_rc' }}
Expand Down Expand Up @@ -221,7 +234,7 @@ jobs:

trigger-ios-without-srp-build:
name: Trigger iOS without-SRP Build on Bitrise
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
needs: [check-builds-needed]
env:
METAMASK_WORKFLOW: ${{ inputs.build_variant == 'exp' && 'build_ios_main_exp' || 'build_ios_main_rc' }}
Expand Down Expand Up @@ -345,7 +358,7 @@ jobs:

download-and-upload-to-browserstack:
name: Download IPAs and Upload to BrowserStack
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
needs: [check-builds-needed, trigger-ios-with-srp-build, trigger-ios-without-srp-build]
if: (needs.trigger-ios-with-srp-build.result == 'success' || needs.trigger-ios-with-srp-build.result == 'partial_success') && (needs.trigger-ios-without-srp-build.result == 'success' || needs.trigger-ios-without-srp-build.result == 'partial_success')
outputs:
Expand Down
17 changes: 16 additions & 1 deletion .github/workflows/run-e2e-api-specs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,30 @@ name: API Specs E2E Tests

on:
workflow_call:
inputs:
runner_provider:
description: Runner provider forwarded from the caller
required: false
type: string
default: current
workflow_dispatch:
inputs:
runner_provider:
description: Runner provider for this manual trial run
required: false
type: choice
options:
- current
- namespace
default: current
pull_request:
types: [opened, synchronize]

jobs:
api-specs-ios:
name: 'api-specs-ios'
if: false
runs-on: macos-latest-xlarge
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ios-build' || 'macos-latest-xlarge' }}
continue-on-error: true

env:
Expand Down
22 changes: 15 additions & 7 deletions .github/workflows/update-e2e-fixtures.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ on:
description: 'PR number to update fixtures for'
required: true
type: string
runner_provider:
description: Runner provider for this manual trial run
required: false
type: choice
options:
- current
- namespace
default: current

jobs:
# ── issue_comment dispatcher ──────────────────────────────────────────
Expand All @@ -34,7 +42,7 @@ jobs:
github.event.issue.pull_request &&
startsWith(github.event.comment.body, '@metamaskbot update-mobile-fixture')
}}
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
timeout-minutes: 5
permissions:
actions: write
Expand Down Expand Up @@ -76,7 +84,7 @@ jobs:
is-fork-pull-request:
name: Validate PR
if: ${{ github.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
timeout-minutes: 5
outputs:
IS_FORK: ${{ steps.is-fork.outputs.IS_FORK }}
Expand All @@ -93,7 +101,7 @@ jobs:

prepare:
name: Prepare build artifacts
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
timeout-minutes: 10
needs: is-fork-pull-request
if: ${{ needs.is-fork-pull-request.outputs.IS_FORK == 'false' }}
Expand Down Expand Up @@ -172,7 +180,7 @@ jobs:
name: Export & update fixtures
needs: [is-fork-pull-request, prepare]
if: ${{ needs.prepare.result == 'success' && needs.is-fork-pull-request.outputs.IS_FORK == 'false' }}
runs-on: ${{ startsWith(github.base_ref, 'release/') && fromJSON('["ghcr.io/cirruslabs/macos-runner:tahoe"]') || fromJSON('["ghcr.io/cirruslabs/macos-runner:tahoe", "low-priority"]') }}
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ios-e2e' || (startsWith(github.base_ref, 'release/') && fromJSON('["ghcr.io/cirruslabs/macos-runner:tahoe"]') || fromJSON('["ghcr.io/cirruslabs/macos-runner:tahoe", "low-priority"]')) }}
timeout-minutes: 30

env:
Expand Down Expand Up @@ -257,7 +265,7 @@ jobs:

commit-updated-fixtures:
name: Commit the updated fixtures
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
timeout-minutes: 10
permissions:
contents: write
Expand Down Expand Up @@ -335,7 +343,7 @@ jobs:

check-status:
name: Check whether the fixture update succeeded
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
timeout-minutes: 5
if: ${{ !cancelled() && needs.is-fork-pull-request.outputs.IS_FORK == 'false' }}
needs:
Expand All @@ -356,7 +364,7 @@ jobs:
failure-comment:
name: Comment about the fixture update failure
if: ${{ !cancelled() && needs.is-fork-pull-request.outputs.IS_FORK == 'false' }}
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
timeout-minutes: 5
permissions:
contents: read
Expand Down
9 changes: 7 additions & 2 deletions .github/workflows/upload-to-testflight.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ on:
required: false
type: boolean
default: true
runner_provider:
description: Runner provider forwarded from the caller
required: false
type: string
default: current

permissions:
contents: read
Expand All @@ -52,7 +57,7 @@ permissions:
jobs:
testflight-upload-summary:
name: TestFlight upload summary
runs-on: ubuntu-latest
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
steps:
- name: Display TestFlight upload summary
run: |
Expand All @@ -74,7 +79,7 @@ jobs:
upload-ios-testflight:
name: Upload iOS to TestFlight
needs: [testflight-upload-summary]
runs-on: ghcr.io/cirruslabs/macos-runner:tahoe-xl
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ios-build' || 'ghcr.io/cirruslabs/macos-runner:tahoe-xl' }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand Down
Loading