1
+ name : macOS tests
2
+
3
+ on :
4
+ workflow_call :
5
+ inputs :
6
+ xcode_15_4_enabled :
7
+ type : boolean
8
+ description : " ⚠️ Jobs with this version of Xcode are deprecated."
9
+ default : false
10
+ xcode_15_4_test_arguments_override :
11
+ type : string
12
+ description : " ⚠️ Deprecated."
13
+ default : " "
14
+ xcode_16_0_enabled :
15
+ type : boolean
16
+ description : " Boolean to enable the Xcode version 16.0 jobs. Defaults to false."
17
+ default : false
18
+ xcode_16_0_build_arguments_override :
19
+ type : string
20
+ description : " The arguments passed to swift build in the macOS 5.10 Swift version matrix job."
21
+ default : " "
22
+ xcode_16_0_test_arguments_override :
23
+ type : string
24
+ description : " The arguments passed to swift test in the macOS 5.10 Swift version matrix job."
25
+ default : " "
26
+ xcode_16_0_setup_command :
27
+ type : string
28
+ description : " The command(s) to be executed before all other work."
29
+ default : " "
30
+ xcode_16_1_enabled :
31
+ type : boolean
32
+ description : " Boolean to enable the Xcode version 16.1 jobs. Defaults to false."
33
+ default : false
34
+ xcode_16_1_build_arguments_override :
35
+ type : string
36
+ description : " The arguments passed to swift build in the Xcode version 16.1 job."
37
+ default : " "
38
+ xcode_16_1_test_arguments_override :
39
+ type : string
40
+ description : " The arguments passed to swift test in the Xcode version 16.1 job."
41
+ default : " "
42
+ xcode_16_1_setup_command :
43
+ type : string
44
+ description : " The command(s) to be executed before all other work."
45
+ default : " "
46
+ xcode_16_2_enabled :
47
+ type : boolean
48
+ description : " Boolean to enable the Xcode version 16.2 jobs. Defaults to true."
49
+ default : true
50
+ xcode_16_2_build_arguments_override :
51
+ type : string
52
+ description : " The arguments passed to swift build in the Xcode version 16.2 job."
53
+ default : " "
54
+ xcode_16_2_test_arguments_override :
55
+ type : string
56
+ description : " The arguments passed to swift test in the Xcode version 16.2 job."
57
+ default : " "
58
+ xcode_16_2_setup_command :
59
+ type : string
60
+ description : " The command(s) to be executed before all other work."
61
+ default : " "
62
+ xcode_16_3_enabled :
63
+ type : boolean
64
+ description : " Boolean to enable the Xcode version 16.3 jobs. Defaults to true."
65
+ default : true
66
+ xcode_16_3_build_arguments_override :
67
+ type : string
68
+ description : " The arguments passed to swift build in the Xcode version 16.3 job."
69
+ default : " "
70
+ xcode_16_3_test_arguments_override :
71
+ type : string
72
+ description : " The arguments passed to swift test in the Xcode version 16.3 job."
73
+ default : " "
74
+ xcode_16_3_setup_command :
75
+ type : string
76
+ description : " The command(s) to be executed before all other work."
77
+ default : " "
78
+ xcode_26_beta_enabled :
79
+ type : boolean
80
+ description : " Boolean to enable the Xcode version 26 beta 1 jobs. Defaults to true."
81
+ default : true
82
+ xcode_26_beta_1_build_arguments_override :
83
+ type : string
84
+ description : " The arguments passed to swift build in the Xcode version 26 beta 1 job."
85
+ default : " "
86
+ xcode_26_beta_1_test_arguments_override :
87
+ type : string
88
+ description : " The arguments passed to swift test in the Xcode version 26 beta 1 job."
89
+ default : " "
90
+ xcode_26_beta_1_setup_command :
91
+ type : string
92
+ description : " The command(s) to be executed before all other work."
93
+ default : " "
94
+
95
+ build_scheme :
96
+ type : string
97
+ description : " The build scheme used in the Xcode builds."
98
+ swift_test_enabled :
99
+ type : boolean
100
+ description : " Boolean to enable test execution with `swift test`. Defaults to true."
101
+ default : true
102
+ macos_xcode_build_enabled :
103
+ type : boolean
104
+ description : " Boolean to enable the Xcode build targeting macOS. Defaults to true."
105
+ default : true
106
+ macos_xcode_test_enabled :
107
+ type : boolean
108
+ description : " Boolean to enable the Xcode test targeting macOS. Defaults to false."
109
+ default : false
110
+ ios_xcode_build_enabled :
111
+ type : boolean
112
+ description : " Boolean to enable the Xcode build targeting iOS. Defaults to true."
113
+ default : true
114
+ ios_xcode_test_enabled :
115
+ type : boolean
116
+ description : " Boolean to enable the Xcode test targeting iOS. Defaults to false."
117
+ default : false
118
+ watchos_xcode_build_enabled :
119
+ type : boolean
120
+ description : " Boolean to enable the Xcode build targeting watchOS. Defaults to true."
121
+ default : true
122
+ watchos_xcode_test_enabled :
123
+ type : boolean
124
+ description : " Boolean to enable the Xcode test targeting watchOS. Defaults to false."
125
+ default : false
126
+ tvos_xcode_build_enabled :
127
+ type : boolean
128
+ description : " Boolean to enable the Xcode build targeting tvOS. Defaults to true."
129
+ default : true
130
+ tvos_xcode_test_enabled :
131
+ type : boolean
132
+ description : " Boolean to enable the Xcode test targeting tvOS. Defaults to false."
133
+ default : false
134
+ visionos_xcode_build_enabled :
135
+ type : boolean
136
+ description : " Boolean to enable the Xcode build targeting visionOS. Defaults to true."
137
+ default : true
138
+ visionos_xcode_test_enabled :
139
+ type : boolean
140
+ description : " Boolean to enable the Xcode test targeting visionOS. Defaults to false."
141
+ default : false
142
+
143
+ runner_pool :
144
+ type : string
145
+ description : " The runner pool which will be requested."
146
+ default : " nightly"
147
+
148
+ jobs :
149
+ construct-matrix :
150
+ name : Construct Darwin matrix
151
+ runs-on : ubuntu-latest
152
+ outputs :
153
+ darwin-matrix : ' ${{ steps.generate-matrix.outputs.darwin-matrix }}'
154
+ steps :
155
+ - name : Checkout repository
156
+ uses : actions/checkout@v4
157
+ with :
158
+ persist-credentials : false
159
+ - id : generate-matrix
160
+ run : |
161
+ cat >> "$GITHUB_OUTPUT" << EOM
162
+ darwin-matrix=$(
163
+ runner_pool="${MATRIX_RUNNER_POOL:="nightly"}"
164
+ xcode_15_4_enabled="${MATRIX_MACOS_15_4_ENABLED:=true}"
165
+ xcode_15_4_build_arguments_override="${MATRIX_MACOS_15_4_BUILD_ARGUMENTS_OVERRIDE:=""}"
166
+ xcode_15_4_test_arguments_override="${MATRIX_MACOS_15_4_TEST_ARGUMENTS_OVERRIDE:=""}"
167
+ xcode_15_4_setup_command="${MATRIX_MACOS_15_4_SETUP_COMMAND:=""}"
168
+ xcode_16_0_enabled="${MATRIX_MACOS_16_0_ENABLED:=true}"
169
+ xcode_16_0_build_arguments_override="${MATRIX_MACOS_16_0_BUILD_ARGUMENTS_OVERRIDE:=""}"
170
+ xcode_16_0_test_arguments_override="${MATRIX_MACOS_16_0_TEST_ARGUMENTS_OVERRIDE:=""}"
171
+ xcode_16_0_setup_command="${MATRIX_MACOS_16_0_SETUP_COMMAND:=""}"
172
+ xcode_16_1_enabled="${MATRIX_MACOS_16_1_ENABLED:=true}"
173
+ xcode_16_1_build_arguments_override="${MATRIX_MACOS_16_1_BUILD_ARGUMENTS_OVERRIDE:=""}"
174
+ xcode_16_1_test_arguments_override="${MATRIX_MACOS_16_1_TEST_ARGUMENTS_OVERRIDE:=""}"
175
+ xcode_16_1_setup_command="${MATRIX_MACOS_16_1_SETUP_COMMAND:=""}"
176
+ xcode_16_2_enabled="${MATRIX_MACOS_16_2_ENABLED:=true}"
177
+ xcode_16_2_build_arguments_override="${MATRIX_MACOS_16_2_BUILD_ARGUMENTS_OVERRIDE:=""}"
178
+ xcode_16_2_test_arguments_override="${MATRIX_MACOS_16_2_TEST_ARGUMENTS_OVERRIDE:=""}"
179
+ xcode_16_2_setup_command="${MATRIX_MACOS_16_2_SETUP_COMMAND:=""}"
180
+ xcode_16_3_enabled="${MATRIX_MACOS_16_3_ENABLED:=true}"
181
+ xcode_16_3_build_arguments_override="${MATRIX_MACOS_16_3_BUILD_ARGUMENTS_OVERRIDE:=""}"
182
+ xcode_16_3_test_arguments_override="${MATRIX_MACOS_16_3_TEST_ARGUMENTS_OVERRIDE:=""}"
183
+ xcode_16_3_setup_command="${MATRIX_MACOS_16_3_SETUP_COMMAND:=""}"
184
+ xcode_26_beta_1_enabled="${MATRIX_MACOS_26_BETA_1_ENABLED:=true}"
185
+ xcode_26_beta_1_build_arguments_override="${MATRIX_MACOS_26_BETA_1_BUILD_ARGUMENTS_OVERRIDE:=""}"
186
+ xcode_26_beta_1_test_arguments_override="${MATRIX_MACOS_26_BETA_1_TEST_ARGUMENTS_OVERRIDE:=""}"
187
+ xcode_26_beta_1_setup_command="${MATRIX_MACOS_26_BETA_1_SETUP_COMMAND:=""}"
188
+
189
+ # Create matrix from inputs
190
+ matrix='{"config": []}'
191
+
192
+ if [[ "$xcode_15_4_enabled" == "true" ]]; then
193
+ matrix=$(echo "$matrix" | jq -c \
194
+ --arg setup_command "$xcode_15_4_setup_command" \
195
+ --arg build_arguments_override "$xcode_15_4_build_arguments_override" \
196
+ --arg test_arguments_override "$xcode_15_4_test_arguments_override" \
197
+ --arg runner_pool "$runner_pool" \
198
+ '.config[.config| length] |= . + { "name": "Xcode 15.4", "xcode_version": "15.4", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }')
199
+ fi
200
+
201
+ if [[ "$xcode_16_0_enabled" == "true" ]]; then
202
+ matrix=$(echo "$matrix" | jq -c \
203
+ --arg setup_command "$xcode_16_0_setup_command" \
204
+ --arg build_arguments_override "$xcode_16_0_build_arguments_override" \
205
+ --arg test_arguments_override "$xcode_16_0_test_arguments_override" \
206
+ --arg runner_pool "$runner_pool" \
207
+ '.config[.config| length] |= . + { "name": "Xcode 16.0", "xcode_version": "16.0", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }')
208
+ fi
209
+
210
+ if [[ "$xcode_16_1_enabled" == "true" ]]; then
211
+ matrix=$(echo "$matrix" | jq -c \
212
+ --arg setup_command "$xcode_16_1_setup_command" \
213
+ --arg build_arguments_override "$xcode_16_1_build_arguments_override" \
214
+ --arg test_arguments_override "$xcode_16_1_test_arguments_override" \
215
+ --arg runner_pool "$runner_pool" \
216
+ '.config[.config| length] |= . + { "name": "Xcode 16.1", "xcode_version": "16.1", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }')
217
+ fi
218
+
219
+ if [[ "$xcode_16_2_enabled" == "true" ]]; then
220
+ matrix=$(echo "$matrix" | jq -c \
221
+ --arg setup_command "$xcode_16_2_setup_command" \
222
+ --arg build_arguments_override "$xcode_16_2_build_arguments_override" \
223
+ --arg test_arguments_override "$xcode_16_2_test_arguments_override" \
224
+ --arg runner_pool "$runner_pool" \
225
+ '.config[.config| length] |= . + { "name": "Xcode 16.2", "xcode_version": "16.2", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }')
226
+ fi
227
+
228
+ if [[ "$xcode_16_3_enabled" == "true" ]]; then
229
+ matrix=$(echo "$matrix" | jq -c \
230
+ --arg setup_command "$xcode_16_3_setup_command" \
231
+ --arg build_arguments_override "$xcode_16_3_build_arguments_override" \
232
+ --arg test_arguments_override "$xcode_16_3_test_arguments_override" \
233
+ --arg runner_pool "$runner_pool" \
234
+ '.config[.config| length] |= . + { "name": "Xcode 16.3", "xcode_version": "16.3", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }')
235
+ fi
236
+
237
+ if [[ "$xcode_26_beta_1_enabled" == "true" ]]; then
238
+ matrix=$(echo "$matrix" | jq -c \
239
+ --arg setup_command "$xcode_26_beta_1_setup_command" \
240
+ --arg build_arguments_override "$xcode_26_beta_1_build_arguments_override" \
241
+ --arg test_arguments_override "$xcode_26_beta_1_test_arguments_override" \
242
+ --arg runner_pool "$runner_pool" \
243
+ '.config[.config| length] |= . + { "name": "Xcode 26 beta 1", "xcode_version": "26.b1", "setup_command": $setup_command, "build_arguments_override": $build_arguments_override, "test_arguments_override": $test_arguments_override, "os": "sequoia", "arch": "ARM64", "pool": $runner_pool }')
244
+ fi
245
+
246
+ echo "$matrix" | jq -c
247
+ )"
248
+ EOM
249
+ env :
250
+ MATRIX_RUNNER_POOL : ${{ inputs.runner_pool }}
251
+ MATRIX_MACOS_15_4_ENABLED : ${{ inputs.xcode_15_4_enabled }}
252
+ MATRIX_MACOS_15_4_BUILD_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_15_4_build_arguments_override }}
253
+ MATRIX_MACOS_15_4_TEST_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_15_4_test_arguments_override }}
254
+ MATRIX_MACOS_15_4_SETUP_COMMAND : ${{ inputs.xcode_15_4_setup_command }}
255
+ MATRIX_MACOS_16_0_ENABLED : ${{ inputs.xcode_16_0_enabled }}
256
+ MATRIX_MACOS_16_0_BUILD_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_0_build_arguments_override }}
257
+ MATRIX_MACOS_16_0_TEST_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_0_test_arguments_override }}
258
+ MATRIX_MACOS_16_0_SETUP_COMMAND : ${{ inputs.xcode_16_0_setup_command }}
259
+ MATRIX_MACOS_16_1_ENABLED : ${{ inputs.xcode_16_1_enabled }}
260
+ MATRIX_MACOS_16_1_BUILD_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_1_build_arguments_override }}
261
+ MATRIX_MACOS_16_1_TEST_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_1_test_arguments_override }}
262
+ MATRIX_MACOS_16_1_SETUP_COMMAND : ${{ inputs.xcode_16_1_setup_command }}
263
+ MATRIX_MACOS_16_2_ENABLED : ${{ inputs.xcode_16_2_enabled }}
264
+ MATRIX_MACOS_16_2_BUILD_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_2_build_arguments_override }}
265
+ MATRIX_MACOS_16_2_TEST_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_2_test_arguments_override }}
266
+ MATRIX_MACOS_16_2_SETUP_COMMAND : ${{ inputs.xcode_16_2_setup_command }}
267
+ MATRIX_MACOS_16_3_ENABLED : ${{ inputs.xcode_16_3_enabled }}
268
+ MATRIX_MACOS_16_3_BUILD_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_3_build_arguments_override }}
269
+ MATRIX_MACOS_16_3_TEST_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_16_3_test_arguments_override }}
270
+ MATRIX_MACOS_16_3_SETUP_COMMAND : ${{ inputs.xcode_16_3_setup_command }}
271
+ MATRIX_MACOS_26_BETA_1_ENABLED : ${{ inputs.xcode_26_beta_1_enabled }}
272
+ MATRIX_MACOS_26_BETA_1_BUILD_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_26_beta_1_build_arguments_override }}
273
+ MATRIX_MACOS_26_BETA_1_TEST_ARGUMENTS_OVERRIDE : ${{ inputs.xcode_26_beta_1_test_arguments_override }}
274
+ MATRIX_MACOS_26_BETA_1_SETUP_COMMAND : ${{ inputs.xcode_26_beta_1_setup_command }}
275
+
276
+ darwin-job :
277
+ name : ${{ matrix.config.name }}
278
+ needs : construct-matrix
279
+ runs-on : [self-hosted, macos, "${{ matrix.config.os }}", "${{ matrix.config.arch }}", "${{ matrix.config.pool }}"]
280
+ timeout-minutes : 30
281
+ strategy :
282
+ fail-fast : false
283
+ matrix : ${{ fromJson(needs.construct-matrix.outputs.darwin-matrix) }}
284
+ steps :
285
+ - name : Checkout repository
286
+ uses : actions/checkout@v4
287
+ with :
288
+ persist-credentials : false
289
+ submodules : true
290
+ - name : Setup command
291
+ run : |
292
+ if [ -n "${{ matrix.config.setup_command }}" ]; then
293
+ bash -c "${{ matrix.config.setup_command }}"
294
+ fi
295
+ - name : Swift build
296
+ run : |
297
+ if [ -n "${{ matrix.config.build_arguments_override }}" ]; then
298
+ swift build ${{ matrix.config.build_arguments_override }}
299
+ else
300
+ swift build --build-tests
301
+ fi
302
+ - name : Swift test
303
+ if : ' inputs.swift_test_enabled'
304
+ run : |
305
+ if [ -n "${{ matrix.config.test_arguments_override }}" ]; then
306
+ swift test ${{ matrix.config.test_arguments_override }}
307
+ else
308
+ swift test
309
+ fi
310
+ # see `xcodebuild -list` for schemes, `simctl list` for destinations
311
+ - name : macOS build
312
+ if : ' !cancelled() && inputs.macos_xcode_build_enabled'
313
+ run : /usr/bin/xcodebuild -quiet -scheme ${BUILD_SCHEME} -destination "generic/platform=macos" build
314
+ - name : macOS test
315
+ if : ' !cancelled() && inputs.macos_xcode_test_enabled'
316
+ run : /usr/bin/xcodebuild -quiet -scheme ${BUILD_SCHEME} -destination "name=My Mac" test
317
+ env :
318
+ XCODE_VERSION : ${{ matrix.config.xcode_version }}
319
+ DEVELOPER_DIR : " /Applications/Xcode_${{ matrix.config.xcode_version }}.app"
320
+ BUILD_SCHEME : ${{ inputs.build_scheme }}
0 commit comments