-
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathaction.yml
More file actions
320 lines (279 loc) · 10.5 KB
/
action.yml
File metadata and controls
320 lines (279 loc) · 10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
name: 'Setup E2E Test Environment'
description: 'Sets up the environment for running E2E tests'
inputs:
platform:
description: 'Platform (ios or android)'
required: true
node-version:
description: 'Node.js version'
required: false
default: '20.18.0'
yarn-version:
description: Yarn version to use with Corepack
required: false
default: '1.22.22'
setup-simulator:
description: 'Whether to setup simulator/emulator'
required: false
default: 'false'
bundler-version:
description: 'Bundler version to use (only for iOS)'
required: false
default: '2.5.8'
cache-prefix:
description: 'Cache key prefix'
required: false
default: 'e2e'
ruby-version:
description: Ruby version to use (only for iOS)
required: false
default: '3.1'
xcode-version:
description: Xcode version to select (e.g., 16.2)
required: false
default: '16.2'
jdk-version:
description: JDK version to use (only for Android)
required: false
default: '17'
jdk-distribution:
description: JDK distribution to use (only for Android)
required: false
default: 'temurin'
foundry-version:
description: Foundry version to install
required: false
default: 'v1.2.3'
android-avd-name:
description: 'Name of AVD to create and boot (for Android)'
required: false
default: 'test_e2e_avd'
android-device:
description: 'AVD device profile (e.g. "pixel_5", "pixel", "Nexus 6")'
required: false
default: 'pixel_5'
android-api-level:
description: 'Android API level to use (e.g. "34")'
required: false
default: '34'
android-abi:
description: 'System architecture ABI for the Android system image (e.g. x86_64, arm64-v8a, armeabi-v7a)'
required: false
default: 'x86_64'
android-tag:
description: 'Android system image tag (e.g. google_apis, default)'
required: false
default: 'google_apis'
android-sdcard-size:
description: 'SD card size for AVD (e.g. 8092M)'
required: false
default: '8092M'
configure-keystores:
description: 'Whether to configure keystores for E2E tests'
required: false
default: 'true'
keystore-role-to-assume:
description: 'AWS IAM role to assume for keystore configuration'
required: false
default: 'arn:aws:iam::363762752069:role/metamask-mobile-build-signer-qa'
target:
description: 'Target for which the keystore is being configured (e.g., qa, flask, main)'
required: false
default: 'qa'
runs:
using: 'composite'
steps:
## Common Setup ##
- run: echo "Setup E2E Environment started"
shell: bash
## Android Setup (early for fail-fast) ##
# Set Android environment variables (self-hosted runner has SDK pre-installed)
- name: Set Android environment variables
if: ${{ inputs.platform == 'android' }}
run: |
echo "ANDROID_HOME=/opt/android-sdk" >> "$GITHUB_ENV"
echo "ANDROID_SDK_ROOT=/opt/android-sdk" >> "$GITHUB_ENV"
shell: bash
- name: Configure Android Signing Certificates
if: ${{ inputs.platform == 'android' && inputs.configure-keystores == 'true' }}
uses: MetaMask/github-tools/.github/actions/configure-keystore@e2e-env-actions
with:
aws-role-to-assume: ${{ inputs.keystore-role-to-assume }}
aws-region: 'us-east-2'
platform: 'android'
target: ${{ inputs.target }}
## JDK Setup
- name: Setup Java
if: ${{ inputs.platform == 'android' }}
uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00
with:
java-version: ${{ inputs.jdk-version }}
distribution: ${{ inputs.jdk-distribution }}
- name: Install required emulator dependencies
if: ${{ inputs.platform == 'android' && runner.os == 'Linux' }}
run: |
sudo apt-get update
sudo apt-get install -y \
libpulse0 \
libglu1-mesa \
libnss3 \
libxss1
echo "✅ Linux dependencies installed successfully"
shell: bash
## Android SDK Setup (SDK pre-installed in container)
- name: Install additional Android SDK components if needed
if: ${{ inputs.platform == 'android' && (inputs.android-api-level != '34' || inputs.android-abi != 'x86_64') }}
run: |
# Only install if different from pre-installed defaults (API 34, x86_64)
IMAGE="system-images;android-${{ inputs.android-api-level }};google_apis;${{ inputs.android-abi }}"
echo "Installing additional system image: $IMAGE"
echo "y" | "/opt/android-sdk/cmdline-tools/latest/bin/sdkmanager" "$IMAGE"
shell: bash
## Launch AVD
- name: Set ANDROID_AVD_HOME for downstream steps
if: ${{ inputs.platform == 'android'}}
shell: bash
run: |
echo "ANDROID_AVD_HOME=$HOME/.android/avd" >> "$GITHUB_ENV"
mkdir -p "$HOME/.android/avd"
- name: Create Android Virtual Device (AVD)
if: ${{ inputs.platform == 'android'}}
run: |
IMAGE="system-images;android-${{ inputs.android-api-level }};${{ inputs.android-tag }};${{ inputs.android-abi }}"
echo "Creating AVD with image: $IMAGE"
"/opt/android-sdk/cmdline-tools/latest/bin/avdmanager" --verbose create avd \
--force \
--name "${{ inputs.android-avd-name }}" \
--package "$IMAGE" \
--device "${{ inputs.android-device }}" \
--tag "${{ inputs.android-tag }}" \
--abi "${{ inputs.android-abi }}" \
--sdcard "${{ inputs.android-sdcard-size }}"
shell: bash
## iOS Platform Setup ##
- name: Configure iOS Signing Certificates
if: ${{ inputs.platform == 'ios' && inputs.configure-keystores == 'true' }}
uses: MetaMask/github-tools/.github/actions/configure-keystore@e2e-env-actions
with:
aws-role-to-assume: ${{ inputs.keystore-role-to-assume }}
aws-region: 'us-east-2'
platform: 'ios'
target: ${{ inputs.target }}
## Node.js & JavaScript Dependencies Setup ##
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
## Yarn Setup & Cache Management
- name: Corepack
id: corepack
run: corepack enable && corepack prepare yarn@${{ inputs.yarn-version }} --activate
shell: bash
- name: Restore Yarn cache
uses: actions/cache@v4
with:
path: |
node_modules
key: ${{ inputs.cache-prefix }}-yarn-${{ inputs.platform }}-${{ runner.os }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ inputs.cache-prefix }}-yarn-${{ inputs.platform }}-${{ runner.os }}-
- name: Install JavaScript dependencies
id: yarn-install
run: yarn install --frozen-lockfile
shell: bash
env:
NODE_OPTIONS: --max-old-space-size=4096 # Increase memory limit for Node.js due to large dependencies
- name: Install Detox CLI
id: install-detox-cli
run: yarn global add detox-cli
shell: bash
- name: Install Foundry
shell: bash
run: |
echo "Installing Foundry via foundryup..."
export FOUNDRY_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/.foundry"
export FOUNDRY_BIN="$FOUNDRY_DIR/bin"
mkdir -p "$FOUNDRY_BIN"
curl -sL https://raw.githubusercontent.com/foundry-rs/foundry/master/foundryup/foundryup -o "$FOUNDRY_BIN/foundryup"
chmod +x "$FOUNDRY_BIN/foundryup"
echo "$FOUNDRY_BIN" >> "$GITHUB_PATH"
"$FOUNDRY_BIN/foundryup"
## IOS Setup ##
## Ruby Setup & Cache Management
- name: Setup Ruby
if: ${{ inputs.platform == 'ios' }}
uses: ruby/setup-ruby@a4effe49ee8ee5b8b5091268c473a4628afb5651
with:
ruby-version: ${{ inputs.ruby-version }}
# Install Bundler first
- name: Install bundler
if: ${{ inputs.platform == 'ios' }}
run: gem install bundler -v ${{ inputs.bundler-version }}
working-directory: ios
shell: bash
# Restore cached Ruby gems
- name: Restore Bundler cache
if: ${{ inputs.platform == 'ios' }}
uses: actions/cache@v4
with:
path: ios/vendor/bundle
key: ${{ inputs.cache-prefix }}-bundler-${{ inputs.platform }}-${{ runner.os }}-${{ hashFiles('ios/Gemfile.lock') }}
restore-keys: |
${{ inputs.cache-prefix }}-bundler-${{ inputs.platform }}-${{ runner.os }}-
# Configure bundler to use a specific path for gem installation
- name: Configure bundler install path
if: ${{ inputs.platform == 'ios' }}
run: bundle config set path 'vendor/bundle'
working-directory: ios
shell: bash
# Install Ruby gems into ios/vendor/bundle ( cache management & awareness )
- name: Install Ruby gems via bundler
if: ${{ inputs.platform == 'ios' }}
run: bundle install
working-directory: ios
shell: bash
- name: Generate binstubs for CocoaPods
if: ${{ inputs.platform == 'ios' }}
run: bundle binstubs cocoapods --path=vendor/bundle/bin
working-directory: ios
shell: bash
- name: Add binstubs to PATH
if: ${{ inputs.platform == 'ios' }}
run: echo "$(pwd)/ios/vendor/bundle/bin" >> "$GITHUB_PATH"
shell: bash
# Verify CocoaPods is available
- name: Verify CocoaPods
if: ${{ inputs.platform == 'ios' }}
run: |
bundle show cocoapods || (echo "❌ CocoaPods not installed from ios/Gemfile" && exit 1)
bundle exec pod --version
working-directory: ios
shell: bash
# Select Xcode version
- name: Select Xcode version
if: ${{ inputs.platform == 'ios' }}
run: sudo xcode-select -s /Applications/Xcode_${{ inputs.xcode-version }}.app
shell: bash
# Restore CocoaPods cache
# - name: Restore CocoaPods cache
# if: ${{ inputs.platform == 'ios'}}
# uses: actions/cache@v4
# with:
# path: ios/Pods
# key: ${{ inputs.cache-prefix }}-pods-${{ inputs.platform }}-${{ runner.os }}-${{ hashFiles('ios/Podfile.lock') }}
# restore-keys: |
# ${{ inputs.cache-prefix }}-pods-${{ inputs.platform }}-${{ runner.os }}-
# Install CocoaPods w/ cached bundler environment
- name: Install CocoaPods via bundler
if: ${{ inputs.platform == 'ios'}}
run: bundle exec pod install --repo-update
working-directory: ios
shell: bash
- name: Install applesimutils
if: ${{ inputs.platform == 'ios' }}
run: brew tap wix/brew && brew install applesimutils
shell: bash
- name: Check simutils
if: ${{ inputs.platform == 'ios' }}
run: xcrun simctl list devices
shell: bash