Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 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
63 changes: 63 additions & 0 deletions .github/actions/setup-ci-js-deps/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: 'Setup CI JS dependencies'
description: >
Mounts the Namespace cache volume (node_modules + .yarn/cache) and runs
yarn install + yarn setup:github-ci --node only when the volume is cold.
On non-Namespace runners no cache is available, so install always runs.

inputs:
runner_provider:
description: 'Runner provider. Only `namespace` benefits from cache reuse; anything else falls through to a fresh install + setup.'
required: false
default: 'current'

runs:
using: 'composite'
steps:
# Namespace mounts node_modules / .yarn/cache as a persistent volume scoped
# to the runner pool, so a warm volume makes the file check below find
# everything and skip install entirely. Cold (e.g. yarn.lock change in the
# pool) falls through to install, which then warms the volume for everyone.
- name: Configure Namespace cache
if: ${{ inputs.runner_provider == 'namespace' }}
uses: namespacelabs/nscloud-cache-action@15799a6b54e5765f85b2aac25b3f0df43ed571c0 # v1
with:
path: |
~/.cache/yarn
.metamask
node_modules
.yarn/cache

- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: ${{ inputs.runner_provider != 'namespace' && 'yarn' || '' }}

# File-based check is the source of truth: a partial restore (e.g.
# node_modules present but termsOfUseContent.ts missing) still falls
# through to install + setup. On non-namespace runners no cache is
# mounted, so this always evaluates to "needs install".
- name: Determine if install is needed
id: check-deps
shell: bash
run: |
if [ -d node_modules ] && [ -f app/util/termsOfUse/termsOfUseContent.ts ]; then
echo "needs-install=false" >> "$GITHUB_OUTPUT"
echo "✅ node_modules + setup outputs present; skipping install"
else
echo "needs-install=true" >> "$GITHUB_OUTPUT"
echo "⚠️ node_modules or setup outputs missing; will install + setup"
fi
Comment thread
cursor[bot] marked this conversation as resolved.
Comment thread
cursor[bot] marked this conversation as resolved.

- name: Install Yarn dependencies with retry
if: ${{ steps.check-deps.outputs.needs-install == 'true' }}
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3.0.2
with:
timeout_minutes: 10
max_attempts: 3
retry_wait_seconds: 30
command: yarn install --immutable

- name: Run project setup
if: ${{ steps.check-deps.outputs.needs-install == 'true' }}
shell: bash
run: yarn setup:github-ci --node
145 changes: 66 additions & 79 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -527,39 +527,60 @@ jobs:
run: ${{ steps.download-actionlint.outputs.executable }} -color -config-file .github/actionlint.yaml
shell: bash

# Warms the Namespace cache volume before test shards run. On non-Namespace
# runners uploads a ci-js-deps artifact so consumers can skip their own install.
prepare-ci-js-deps:
name: Prepare CI JS dependencies
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
if: ${{ needs.get_requirements.outputs.skip_everything != 'true' }}
needs:
- get_requirements
steps:
- uses: actions/checkout@v6
- uses: ./.github/actions/setup-ci-js-deps
with:
runner_provider: ${{ inputs.runner_provider }}
# TEMP: artifact fallback for non-Namespace runners.
# Remove these two steps once Namespace passes the trial and becomes the default.
- name: Pack CI JS deps
if: ${{ inputs.runner_provider != 'namespace' }}
run: tar -czf ci-js-deps.tar.gz node_modules app/util/termsOfUse/termsOfUseContent.ts
- name: Upload CI JS deps artifact
if: ${{ inputs.runner_provider != 'namespace' }}
uses: actions/upload-artifact@v4
with:
name: ci-js-deps
path: ci-js-deps.tar.gz
retention-days: 1
compression-level: 0
if-no-files-found: error

unit-tests:
name: Unit tests (${{ matrix.shard }})
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
if: ${{ needs.get_requirements.outputs.skip_everything != 'true' }}
needs:
- get_requirements
- prepare-ci-js-deps
Comment thread
cursor[bot] marked this conversation as resolved.
strategy:
matrix:
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
steps:
- uses: actions/checkout@v6
- name: Configure Namespace cache
if: ${{ inputs.runner_provider == 'namespace' }}
uses: namespacelabs/nscloud-cache-action@15799a6b54e5765f85b2aac25b3f0df43ed571c0 # v1
with:
path: |
~/.cache/yarn
.metamask
node_modules
.yarn/cache
- uses: actions/setup-node@v6
# TEMP: artifact fallback for non-Namespace runners.
# Remove these two steps once Namespace passes the trial and becomes the default.
- name: Download CI JS deps artifact
if: ${{ inputs.runner_provider != 'namespace' }}
uses: actions/download-artifact@v4
with:
node-version-file: '.nvmrc'
cache: ${{ inputs.runner_provider != 'namespace' && 'yarn' || '' }}
- name: Install Yarn dependencies with retry
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
name: ci-js-deps
path: .
- name: Extract CI JS deps
if: ${{ inputs.runner_provider != 'namespace' }}
run: tar -xzf ci-js-deps.tar.gz && rm ci-js-deps.tar.gz
- uses: ./.github/actions/setup-ci-js-deps
with:
timeout_minutes: 10
max_attempts: 3
retry_wait_seconds: 30
command: yarn install --immutable
- name: Clean state and following up dependencies installation
run: yarn setup:github-ci --node
runner_provider: ${{ inputs.runner_provider }}
- name: Prepare results directory
run: mkdir -p tests/results
# The "10" in this command is the total number of shards. It must be kept
Expand Down Expand Up @@ -594,42 +615,24 @@ jobs:
# threshold calculation is accurate.
merge-unit-and-component-view-tests:
runs-on: ${{ inputs.runner_provider == 'namespace' && 'namespace-profile-metamask-ci-linux' || 'ubuntu-latest' }}
needs: [unit-tests, component-view-tests]
needs: [prepare-ci-js-deps, unit-tests, component-view-tests]
if: ${{ !cancelled() && github.event_name != 'merge_group' }}
steps:
- uses: actions/checkout@v6
- name: Configure Namespace cache
if: ${{ inputs.runner_provider == 'namespace' }}
uses: namespacelabs/nscloud-cache-action@15799a6b54e5765f85b2aac25b3f0df43ed571c0 # v1
with:
path: |
~/.cache/yarn
.metamask
node_modules
.yarn/cache
- name: Restore node_modules cache
# TEMP: artifact fallback for non-Namespace runners.
# Remove these two steps once Namespace passes the trial and becomes the default.
- name: Download CI JS deps artifact
if: ${{ inputs.runner_provider != 'namespace' }}
id: cache-node-modules
uses: actions/cache@v4
with:
path: |
node_modules
.yarn/install-state.gz
key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }}
- uses: actions/setup-node@v6
uses: actions/download-artifact@v4
with:
node-version-file: '.nvmrc'
cache: ${{ inputs.runner_provider != 'namespace' && 'yarn' || '' }}
- name: Install Yarn dependencies with retry
if: ${{ inputs.runner_provider == 'namespace' || steps.cache-node-modules.outputs.cache-hit != 'true' }}
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
name: ci-js-deps
path: .
- name: Extract CI JS deps
if: ${{ inputs.runner_provider != 'namespace' }}
run: tar -xzf ci-js-deps.tar.gz && rm ci-js-deps.tar.gz
- uses: ./.github/actions/setup-ci-js-deps
with:
timeout_minutes: 10
max_attempts: 3
retry_wait_seconds: 30
command: yarn install --immutable
- name: Clean state and following up dependencies installation
run: yarn setup:github-ci --node
runner_provider: ${{ inputs.runner_provider }}
- uses: actions/download-artifact@v4
with:
pattern: coverage-*
Expand Down Expand Up @@ -724,43 +727,26 @@ jobs:
if: ${{ needs.get_requirements.outputs.skip_everything != 'true' }}
needs:
- get_requirements
- prepare-ci-js-deps
strategy:
matrix:
shard: [1, 2]
steps:
- uses: actions/checkout@v6
- name: Configure Namespace cache
if: ${{ inputs.runner_provider == 'namespace' }}
uses: namespacelabs/nscloud-cache-action@15799a6b54e5765f85b2aac25b3f0df43ed571c0 # v1
with:
path: |
~/.cache/yarn
.metamask
node_modules
.yarn/cache
- name: Restore node_modules cache
# TEMP: artifact fallback for non-Namespace runners.
# Remove these two steps once Namespace passes the trial and becomes the default.
- name: Download CI JS deps artifact
if: ${{ inputs.runner_provider != 'namespace' }}
id: cache-node-modules
uses: actions/cache@v4
with:
path: |
node_modules
.yarn/install-state.gz
key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }}
- uses: actions/setup-node@v6
uses: actions/download-artifact@v4
with:
node-version-file: '.nvmrc'
cache: ${{ inputs.runner_provider != 'namespace' && 'yarn' || '' }}
- name: Install Yarn dependencies with retry
if: ${{ inputs.runner_provider == 'namespace' || steps.cache-node-modules.outputs.cache-hit != 'true' }}
uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 #v3.0.2
name: ci-js-deps
path: .
- name: Extract CI JS deps
if: ${{ inputs.runner_provider != 'namespace' }}
run: tar -xzf ci-js-deps.tar.gz && rm ci-js-deps.tar.gz
- uses: ./.github/actions/setup-ci-js-deps
with:
timeout_minutes: 10
max_attempts: 3
retry_wait_seconds: 30
command: yarn install --immutable
- name: Clean state and following up dependencies installation
run: yarn setup:github-ci --node
runner_provider: ${{ inputs.runner_provider }}
- name: Prepare results directory
run: mkdir -p tests/results
- run: |
Expand Down Expand Up @@ -1080,6 +1066,7 @@ jobs:
- unit-tests
- component-view-tests
- check-workflows
- prepare-ci-js-deps
- js-bundle-size-check
- sonar-cloud-quality-gate-status
- build-android-apks
Expand Down
Loading