Skip to content

Commit 9657cb9

Browse files
committed
Fix: move continue-on-error inside reusable workflows
`continue-on-error` is not a supported key for reusable workflow callers (jobs with `uses`). Move the retry logic inside the reusable workflows instead: - Test step uses step-level `continue-on-error: true` so the job always succeeds (setup failures still propagate normally) - Report job checks the test step outcome and exposes it as output - New `fail-on-error` input: when true, the report job fails if tests failed — used by retry_2 to make the workflow go red when all 3 attempts fail - Callers no longer need `continue-on-error`
1 parent fd54ee6 commit 9657cb9

6 files changed

Lines changed: 90 additions & 15 deletions

File tree

.github/workflows/e2e-android-rntester.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ permissions:
55

66
on:
77
workflow_call:
8+
inputs:
9+
fail-on-error:
10+
type: boolean
11+
default: false
812
outputs:
913
status:
1014
description: "The result of the E2E tests (success or failure)"
@@ -13,6 +17,8 @@ on:
1317
jobs:
1418
test:
1519
runs-on: 4-core-ubuntu
20+
outputs:
21+
status: ${{ steps.report-status.outputs.status }}
1622
strategy:
1723
fail-fast: false
1824
matrix:
@@ -32,13 +38,19 @@ jobs:
3238
- name: Print folder structure
3339
run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
3440
- name: Run E2E Tests
41+
id: run-tests
42+
continue-on-error: true
3543
uses: ./.github/actions/maestro-android
3644
timeout-minutes: 60
3745
with:
3846
app-path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/app-x86-${{ matrix.flavor }}.apk
3947
app-id: com.facebook.react.uiapp
4048
maestro-flow: ./packages/rn-tester/.maestro
4149
flavor: ${{ matrix.flavor }}
50+
- name: Report status
51+
id: report-status
52+
if: ${{ always() && steps.run-tests.outcome == 'failure' }}
53+
run: echo "status=failure" >> $GITHUB_OUTPUT
4254

4355
report:
4456
needs: test
@@ -49,8 +61,11 @@ jobs:
4961
steps:
5062
- id: check
5163
run: |
52-
if [[ "${{ needs.test.result }}" == "failure" ]]; then
64+
if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
5365
echo "status=failure" >> $GITHUB_OUTPUT
5466
else
5567
echo "status=success" >> $GITHUB_OUTPUT
5668
fi
69+
- name: Fail if needed
70+
if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
71+
run: exit 1

.github/workflows/e2e-android-templateapp.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ permissions:
55

66
on:
77
workflow_call:
8+
inputs:
9+
fail-on-error:
10+
type: boolean
11+
default: false
812
outputs:
913
status:
1014
description: "The result of the E2E tests (success or failure)"
@@ -13,6 +17,8 @@ on:
1317
jobs:
1418
test:
1519
runs-on: 4-core-ubuntu
20+
outputs:
21+
status: ${{ steps.report-status.outputs.status }}
1622
strategy:
1723
fail-fast: false
1824
matrix:
@@ -68,6 +74,8 @@ jobs:
6874
./gradlew assemble$CAPITALIZED_FLAVOR --no-daemon -PreactNativeArchitectures=x86
6975
7076
- name: Run E2E Tests
77+
id: run-tests
78+
continue-on-error: true
7179
uses: ./.github/actions/maestro-android
7280
timeout-minutes: 60
7381
with:
@@ -77,6 +85,10 @@ jobs:
7785
install-java: 'false'
7886
flavor: ${{ matrix.flavor }}
7987
working-directory: /tmp/RNTestProject
88+
- name: Report status
89+
id: report-status
90+
if: ${{ always() && steps.run-tests.outcome == 'failure' }}
91+
run: echo "status=failure" >> $GITHUB_OUTPUT
8092

8193
report:
8294
needs: test
@@ -87,8 +99,11 @@ jobs:
8799
steps:
88100
- id: check
89101
run: |
90-
if [[ "${{ needs.test.result }}" == "failure" ]]; then
102+
if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
91103
echo "status=failure" >> $GITHUB_OUTPUT
92104
else
93105
echo "status=success" >> $GITHUB_OUTPUT
94106
fi
107+
- name: Fail if needed
108+
if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
109+
run: exit 1

.github/workflows/e2e-ios-rntester.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ permissions:
55

66
on:
77
workflow_call:
8+
inputs:
9+
fail-on-error:
10+
type: boolean
11+
default: false
812
outputs:
913
status:
1014
description: "The result of the E2E tests (success or failure)"
@@ -13,6 +17,8 @@ on:
1317
jobs:
1418
test:
1519
runs-on: macos-15-large
20+
outputs:
21+
status: ${{ steps.report-status.outputs.status }}
1622
strategy:
1723
fail-fast: false
1824
matrix:
@@ -32,12 +38,18 @@ jobs:
3238
- name: Setup xcode
3339
uses: ./.github/actions/setup-xcode
3440
- name: Run E2E Tests
41+
id: run-tests
42+
continue-on-error: true
3543
uses: ./.github/actions/maestro-ios
3644
with:
3745
app-path: "/tmp/RNTesterBuild/RNTester.app"
3846
app-id: com.meta.RNTester.localDevelopment
3947
maestro-flow: ./packages/rn-tester/.maestro/
4048
flavor: ${{ matrix.flavor }}
49+
- name: Report status
50+
id: report-status
51+
if: ${{ always() && steps.run-tests.outcome == 'failure' }}
52+
run: echo "status=failure" >> $GITHUB_OUTPUT
4153

4254
report:
4355
needs: test
@@ -48,8 +60,11 @@ jobs:
4860
steps:
4961
- id: check
5062
run: |
51-
if [[ "${{ needs.test.result }}" == "failure" ]]; then
63+
if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
5264
echo "status=failure" >> $GITHUB_OUTPUT
5365
else
5466
echo "status=success" >> $GITHUB_OUTPUT
5567
fi
68+
- name: Fail if needed
69+
if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
70+
run: exit 1

.github/workflows/e2e-ios-templateapp.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ permissions:
55

66
on:
77
workflow_call:
8+
inputs:
9+
fail-on-error:
10+
type: boolean
11+
default: false
812
outputs:
913
status:
1014
description: "The result of the E2E tests (success or failure)"
@@ -13,6 +17,8 @@ on:
1317
jobs:
1418
test:
1519
runs-on: macos-15-large
20+
outputs:
21+
status: ${{ steps.report-status.outputs.status }}
1622
strategy:
1723
fail-fast: false
1824
matrix:
@@ -89,13 +95,19 @@ jobs:
8995
-destination "generic/platform=iOS Simulator" \
9096
-derivedDataPath "/tmp/RNTestProject"
9197
- name: Run E2E Tests
98+
id: run-tests
99+
continue-on-error: true
92100
uses: ./.github/actions/maestro-ios
93101
with:
94102
app-path: "/tmp/RNTestProject/Build/Products/${{ matrix.flavor }}-iphonesimulator/RNTestProject.app"
95103
app-id: org.reactjs.native.example.RNTestProject
96104
maestro-flow: ./scripts/e2e/.maestro/
97105
flavor: ${{ matrix.flavor }}
98106
working-directory: /tmp/RNTestProject
107+
- name: Report status
108+
id: report-status
109+
if: ${{ always() && steps.run-tests.outcome == 'failure' }}
110+
run: echo "status=failure" >> $GITHUB_OUTPUT
99111

100112
report:
101113
needs: test
@@ -106,8 +118,11 @@ jobs:
106118
steps:
107119
- id: check
108120
run: |
109-
if [[ "${{ needs.test.result }}" == "failure" ]]; then
121+
if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
110122
echo "status=failure" >> $GITHUB_OUTPUT
111123
else
112124
echo "status=success" >> $GITHUB_OUTPUT
113125
fi
126+
- name: Fail if needed
127+
if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
128+
run: exit 1

.github/workflows/fantom-tests.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ permissions:
55

66
on:
77
workflow_call:
8+
inputs:
9+
fail-on-error:
10+
type: boolean
11+
default: false
812
outputs:
913
status:
1014
description: "The result of the Fantom tests (success or failure)"
@@ -13,6 +17,8 @@ on:
1317
jobs:
1418
test:
1519
runs-on: 8-core-ubuntu
20+
outputs:
21+
status: ${{ steps.report-status.outputs.status }}
1622
container:
1723
image: reactnativecommunity/react-native-android:latest
1824
env:
@@ -21,7 +27,13 @@ jobs:
2127
- name: Checkout
2228
uses: actions/checkout@v6
2329
- name: Run Fantom Tests
30+
id: run-tests
31+
continue-on-error: true
2432
uses: ./.github/actions/run-fantom-tests
33+
- name: Report status
34+
id: report-status
35+
if: ${{ always() && steps.run-tests.outcome == 'failure' }}
36+
run: echo "status=failure" >> $GITHUB_OUTPUT
2537

2638
report:
2739
needs: test
@@ -32,8 +44,11 @@ jobs:
3244
steps:
3345
- id: check
3446
run: |
35-
if [[ "${{ needs.test.result }}" == "failure" ]]; then
47+
if [[ "${{ needs.test.outputs.status }}" == "failure" ]]; then
3648
echo "status=failure" >> $GITHUB_OUTPUT
3749
else
3850
echo "status=success" >> $GITHUB_OUTPUT
3951
fi
52+
- name: Fail if needed
53+
if: ${{ inputs.fail-on-error && steps.check.outputs.status == 'failure' }}
54+
run: exit 1

.github/workflows/test-all.yml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,58 +159,58 @@ jobs:
159159
test_e2e_ios_rntester:
160160
needs: test_ios_rntester
161161
uses: ./.github/workflows/e2e-ios-rntester.yml
162-
continue-on-error: true
163162
secrets: inherit
164163

165164
test_e2e_ios_rntester_retry_1:
166165
needs: test_e2e_ios_rntester
167166
if: ${{ always() && needs.test_e2e_ios_rntester.outputs.status == 'failure' }}
168167
uses: ./.github/workflows/e2e-ios-rntester.yml
169-
continue-on-error: true
170168
secrets: inherit
171169

172170
test_e2e_ios_rntester_retry_2:
173171
needs: test_e2e_ios_rntester_retry_1
174172
if: ${{ always() && needs.test_e2e_ios_rntester_retry_1.outputs.status == 'failure' }}
175173
uses: ./.github/workflows/e2e-ios-rntester.yml
174+
with:
175+
fail-on-error: true
176176
secrets: inherit
177177

178178
test_e2e_ios_templateapp:
179179
needs: [build_npm_package, prebuild_apple_dependencies]
180180
uses: ./.github/workflows/e2e-ios-templateapp.yml
181-
continue-on-error: true
182181
secrets: inherit
183182

184183
test_e2e_ios_templateapp_retry_1:
185184
needs: test_e2e_ios_templateapp
186185
if: ${{ always() && needs.test_e2e_ios_templateapp.outputs.status == 'failure' }}
187186
uses: ./.github/workflows/e2e-ios-templateapp.yml
188-
continue-on-error: true
189187
secrets: inherit
190188

191189
test_e2e_ios_templateapp_retry_2:
192190
needs: test_e2e_ios_templateapp_retry_1
193191
if: ${{ always() && needs.test_e2e_ios_templateapp_retry_1.outputs.status == 'failure' }}
194192
uses: ./.github/workflows/e2e-ios-templateapp.yml
193+
with:
194+
fail-on-error: true
195195
secrets: inherit
196196

197197
test_e2e_android_templateapp:
198198
needs: build_npm_package
199199
uses: ./.github/workflows/e2e-android-templateapp.yml
200-
continue-on-error: true
201200
secrets: inherit
202201

203202
test_e2e_android_templateapp_retry_1:
204203
needs: test_e2e_android_templateapp
205204
if: ${{ always() && needs.test_e2e_android_templateapp.outputs.status == 'failure' }}
206205
uses: ./.github/workflows/e2e-android-templateapp.yml
207-
continue-on-error: true
208206
secrets: inherit
209207

210208
test_e2e_android_templateapp_retry_2:
211209
needs: test_e2e_android_templateapp_retry_1
212210
if: ${{ always() && needs.test_e2e_android_templateapp_retry_1.outputs.status == 'failure' }}
213211
uses: ./.github/workflows/e2e-android-templateapp.yml
212+
with:
213+
fail-on-error: true
214214
secrets: inherit
215215

216216
build_fantom_runner:
@@ -240,20 +240,20 @@ jobs:
240240
run_fantom_tests:
241241
needs: build_fantom_runner
242242
uses: ./.github/workflows/fantom-tests.yml
243-
continue-on-error: true
244243
secrets: inherit
245244

246245
run_fantom_tests_retry_1:
247246
needs: run_fantom_tests
248247
if: ${{ always() && needs.run_fantom_tests.outputs.status == 'failure' }}
249248
uses: ./.github/workflows/fantom-tests.yml
250-
continue-on-error: true
251249
secrets: inherit
252250

253251
run_fantom_tests_retry_2:
254252
needs: run_fantom_tests_retry_1
255253
if: ${{ always() && needs.run_fantom_tests_retry_1.outputs.status == 'failure' }}
256254
uses: ./.github/workflows/fantom-tests.yml
255+
with:
256+
fail-on-error: true
257257
secrets: inherit
258258

259259
build_android:
@@ -285,20 +285,20 @@ jobs:
285285
test_e2e_android_rntester:
286286
needs: build_android
287287
uses: ./.github/workflows/e2e-android-rntester.yml
288-
continue-on-error: true
289288
secrets: inherit
290289

291290
test_e2e_android_rntester_retry_1:
292291
needs: test_e2e_android_rntester
293292
if: ${{ always() && needs.test_e2e_android_rntester.outputs.status == 'failure' }}
294293
uses: ./.github/workflows/e2e-android-rntester.yml
295-
continue-on-error: true
296294
secrets: inherit
297295

298296
test_e2e_android_rntester_retry_2:
299297
needs: test_e2e_android_rntester_retry_1
300298
if: ${{ always() && needs.test_e2e_android_rntester_retry_1.outputs.status == 'failure' }}
301299
uses: ./.github/workflows/e2e-android-rntester.yml
300+
with:
301+
fail-on-error: true
302302
secrets: inherit
303303

304304
build_npm_package:

0 commit comments

Comments
 (0)