-
-
Notifications
You must be signed in to change notification settings - Fork 155
197 lines (195 loc) · 8.31 KB
/
ios-e2e-test.yml
File metadata and controls
197 lines (195 loc) · 8.31 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
name: 🛠 iOS e2e tests
on:
pull_request:
paths:
- ".github/workflows/ios-e2e-test.yml"
- "react-native-keyboard-controller.podspec"
- "package.json"
- "ios/**"
- "example/**"
- "e2e/**"
- "src/**"
push:
branches:
- main
paths:
- ".github/workflows/ios-e2e-test.yml"
- "react-native-keyboard-controller.podspec"
- "package.json"
- "ios/**"
- "example/**"
- "e2e/**"
- "src/**"
concurrency:
group: ios-e2e-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: 🏗️ Build E2E ipa (Xcode ${{ matrix.config.xcode }})
runs-on: macos-${{ matrix.config.macos }}
timeout-minutes: 60
env:
WORKING_DIRECTORY: example
strategy:
matrix:
config: [{ xcode: "16.4", macos: 15 }, { xcode: "26.1", macos: 26 }]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20.x
cache: "yarn"
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ matrix.config.xcode }}
- name: Get Xcode version
run: xcodebuild -version
- name: Save yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Restore node_modules from cache
uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install root dependencies
run: yarn install
- name: Install example project dependencies
working-directory: ${{ env.WORKING_DIRECTORY }}
run: yarn
- name: Install e2e dependencies
run: yarn install --cwd e2e
- name: Install Ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
max-size: 1.5G
key: ${{ runner.os }}-xcode-${{ matrix.config.xcode }}-ccache-e2e-ios
create-symlink: true
- name: Setup ccache behavior
run: |
echo "CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros" >> $GITHUB_ENV
echo "CCACHE_FILECLONE=true" >> $GITHUB_ENV
echo "CCACHE_DEPEND=true" >> $GITHUB_ENV
echo "CCACHE_INODECACHE=true" >> $GITHUB_ENV
- name: Restore Pods cache
uses: actions/cache@v4
with:
path: |
example/ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods
key: ${{ runner.os }}-xcode-${{ matrix.config.xcode }}-pods-${{ hashFiles('**/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-xcode-${{ matrix.config.xcode }}-pods-
- name: Install pods
working-directory: ${{ env.WORKING_DIRECTORY }}/ios
run: export USE_CCACHE=1 && pod install || pod update --repo-update
- name: Restore DerivedData cache
uses: actions/cache@v5
with:
path: example/ios/build
key: ${{ runner.os }}-e2e-derived-data-xcode-${{ matrix.config.xcode }}-${{ hashFiles('**/Podfile.lock', '**/Gemfile.lock', '**/package.json', '**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-e2e-derived-data-xcode-${{ matrix.config.xcode }}-
- name: Build app
working-directory: e2e
run: yarn build-example:ios
- uses: actions/upload-artifact@v4
with:
name: ios-e2e-ipa-xcode${{ matrix.config.xcode }}
path: example/ios/build/Build/Products/Release-iphonesimulator/KeyboardControllerExample.app/**
determine-e2e-matrix:
name: ⚖️ Determine E2E Test Matrix
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Set matrix for PR or main
id: set-matrix
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
# Subset for PRs: Only ios 15, 26, 26e (adjust as needed)
echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT
else
# Full set for main
echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 16, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "16.4", "iphone": "iPhone 14 Pro", "os": "16.4"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": 18, artifact: "16.4", "xcode": "16.4", "macos": 15, "iphone": "iPhone 16 Pro", "os": "18.5"}, {"ios": 26, artifact: "16.4", "xcode": "26.0", "macos": 15, "iphone": "iPhone 17 Pro", "os": "26.2"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT
fi
e2e-test:
name: ⚙️ Automated test cases (iOS-${{ matrix.devices.ios }}, XCode-${{ matrix.devices.artifact }})
runs-on: macos-${{ matrix.devices.macos }}
timeout-minutes: 90
env:
WORKING_DIRECTORY: example
strategy:
matrix: ${{ fromJson(needs.determine-e2e-matrix.outputs.matrix) }}
needs: [build, determine-e2e-matrix]
steps:
- uses: actions/checkout@v4
- name: Download a single artifact
uses: actions/download-artifact@v4
with:
name: ios-e2e-ipa-xcode${{ matrix.devices.artifact }}
path: example/ios/build/Build/Products/Release-iphonesimulator/KeyboardControllerExample.app/
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: ${{ matrix.devices.xcode }}
- name: Get Xcode version
run: xcodebuild -version
# needed for additional runtime installation
- name: Install Xcodes
run: brew tap xcodesorg/made
- name: Install additional iOS runtimes
if: ${{ matrix.devices.runtime != '' && matrix.devices.runtime != null }}
uses: ./.github/actions/retry-sudo-with-timeout
with:
command: "xcodes runtimes install --keep-archive 'iOS ${{ matrix.devices.runtime }}'"
timeout: 600 # 10 minutes
max_retries: 3
retry_interval: 60
- name: List all available simulators
run: xcrun simctl list
# https://bitrise.io/blog/post/xcode-15-performance-regressions
- name: Install yeetd
run: |
defaults write dev.biscuit.yeetd killapsd true
wget https://github.com/biscuitehh/yeetd/releases/download/1.0/yeetd-normal.pkg
sudo installer -pkg yeetd-normal.pkg -target /
yeetd &
# needed for simulator pre-booting
- name: Install CoreUtils
run: brew install coreutils
- name: Boot simulator
uses: ./.github/actions/boot-simulator
with:
simulator-name: ${{ matrix.devices.iphone }}
simulator-version: ${{ matrix.devices.os }}
- name: Install AppleSimulatorUtils
run: brew tap wix/brew && brew install applesimutils
- name: Save yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Restore node_modules from cache
uses: actions/cache@v4
id: yarn-cache
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install root dependencies
run: yarn install
- name: Install e2e dependencies
run: yarn install --cwd e2e
- name: Use software keyboard
run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool NO
- name: Test app
working-directory: e2e
run: SOFT_CHECK=false yarn test-example:ios-${{ matrix.devices.ios }}
- uses: actions/upload-artifact@v4
if: ${{ failure() }}
with:
name: ios-fail-screen-shoots
path: e2e/artifacts