diff --git a/.github/workflows/desktop-bundle-smoke.yml b/.github/workflows/desktop-bundle-smoke.yml index 92cd2a7753..fa9ac8743b 100644 --- a/.github/workflows/desktop-bundle-smoke.yml +++ b/.github/workflows/desktop-bundle-smoke.yml @@ -193,6 +193,8 @@ jobs: - name: Stop screen recording if: always() + # Evidence only. A failed stop must not fail a chat that already passed. + continue-on-error: true uses: ./.github/actions/e2e-screen-record with: mode: stop @@ -209,6 +211,8 @@ jobs: - name: Upload smoke diagnostics if: always() + # Evidence only. A 403 from the artifact store must not fail the smoke. + continue-on-error: true uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: desktop-smoke-${{ inputs.platform }}-${{ inputs.arch }}-${{ inputs.format }}-${{ github.run_id }}-${{ github.run_attempt }} diff --git a/tests/ci/test_desktop_bundle_smoke.py b/tests/ci/test_desktop_bundle_smoke.py index bfb9226d1d..1afc3098d3 100644 --- a/tests/ci/test_desktop_bundle_smoke.py +++ b/tests/ci/test_desktop_bundle_smoke.py @@ -173,6 +173,14 @@ def test_smoke_matrix_native_routes_and_driver_only_dependencies(): assert 'save-cache' not in recording['with'] upload = next(step for step in job['steps'] if 'actions/upload-artifact@' in step.get('uses', '')) assert upload['if'] == 'always()' and upload['with']['path'].endswith('/out') + # The chat steps are the smoke verdict. Recording stop and artifact + # upload run after that and are evidence; a 403 there must not fail + # the job or skip channel publication. + stop = next(step for step in job['steps'] if step.get('name') == 'Stop screen recording') + assert stop['continue-on-error'] is True and upload['continue-on-error'] is True + for verdict in ('Install and chat on macOS', 'Install and chat on Windows'): + chat = next(step for step in job['steps'] if step.get('name') == verdict) + assert 'continue-on-error' not in chat recorder = hermes_yaml.safe_load((ROOT / '.github/actions/e2e-screen-record/action.yml').read_text()) assert all(not step.get('uses', '').startswith('actions/cache') for step in recorder['runs']['steps'])