11name : App Smoke Tests
22
3+ # On the nightly schedule all `inputs.*` are empty, so job conditions use
4+ # `inputs.x || '<nightly value>'` fallbacks: platforms=all, tests=all.
35on :
46 workflow_dispatch :
57 inputs :
911 type : choice
1012 options :
1113 - all
14+ - android
1215 - linux
1316 - macos
1417 - windows
1518 default : all
19+ tests :
20+ description : " Which test suites to run on the selected platforms"
21+ required : false
22+ type : choice
23+ options :
24+ - vpn-smoke # connect/disconnect smoke only (validates the public IP changes) — the fast confidence check
25+ - all # every suite the platform supports
26+ default : vpn-smoke
1627 linux_arch :
1728 description : " Linux arch to test"
1829 required : false
2233 - arm64
2334 - all
2435 default : amd64
25- windows_connect_smoke :
26- description : " Run Windows connect/disconnect smoke"
27- required : false
28- type : boolean
29- default : true
30- windows_payment_checkout_smoke :
31- description : " Verify staging Stripe Checkout renders on Windows"
32- required : false
33- type : boolean
34- default : true
35- macos_connect_smoke :
36- description : " Include macOS connect/disconnect smoke when platforms=all (requires self-hosted runner with approved system extension)"
37- required : false
38- type : boolean
39- default : false
40- macos_payment_checkout_smoke :
41- description : " Verify staging Stripe Checkout renders on macOS"
42- required : false
43- type : boolean
44- default : true
45- windows_split_tunnel_website_smoke :
46- description : " Run Windows split-tunneling website smoke"
47- required : false
48- type : boolean
49- default : false
50- auth_smoke :
51- description : " Run existing auth smoke tests"
52- required : false
53- type : boolean
54- default : false
55- enable_ip_check :
56- description : " Validate public IP change during VPN connect smoke"
57- required : false
58- type : boolean
59- default : false
60- force_full_tunnel_smoke :
61- description : " Force full-tunnel mode during VPN connect smoke"
62- required : false
63- type : boolean
64- default : true
36+ schedule :
37+ # Nightly full sweep (platforms=all, tests=all) at 03:00 UTC so
38+ # regressions surface within a day without anyone dispatching manually.
39+ - cron : " 0 3 * * *"
6540
6641permissions :
6742 contents : read
@@ -72,6 +47,26 @@ concurrency:
7247 cancel-in-progress : false
7348
7449jobs :
50+ # Android builds its own versioned APKs and runs on Firebase Test Lab, so it
51+ # doesn't need the desktop version stamping from `prepare`. The vpn-smoke
52+ # tier builds only the VPN suite and runs it on one virtual device with no
53+ # retries; `all` builds the full aggregator on the script's two-device
54+ # matrix (physical Pixel 8 + Arm virtual) with retries for flaky tests.
55+ android :
56+ if : ${{ contains(fromJSON('["all", "android", ""]'), inputs.platforms) }}
57+ uses : ./.github/workflows/firebase-test-lab.yml
58+ secrets : inherit
59+ with :
60+ test_target : >-
61+ ${{ (inputs.tests || 'all') == 'vpn-smoke'
62+ && 'integration_test/vpn/android_vpn_smoke_test.dart'
63+ || 'integration_test/android_all_e2e_test.dart' }}
64+ devices : >-
65+ ${{ (inputs.tests || 'all') == 'vpn-smoke'
66+ && 'model=MediumPhone.arm,version=33,locale=en,orientation=portrait'
67+ || '' }}
68+ flaky_attempts : ${{ (inputs.tests || 'all') == 'all' && '2' || '' }}
69+
7570 prepare :
7671 runs-on : ubuntu-latest
7772 outputs :
@@ -106,58 +101,50 @@ jobs:
106101 name : pubspec
107102 path : pubspec.yaml
108103
104+ # Remaining suite toggles (IP check, config-url, …) are no longer umbrella
105+ # inputs: each build-*.yml declares smoke-appropriate defaults, and anything
106+ # exotic can be dispatched on that workflow directly. The `tests` tier maps
107+ # to the optional suites: vpn-smoke leaves them off, `all` turns them on.
109108 linux :
110109 needs : prepare
111- if : ${{ inputs.platforms == ' all' || inputs.platforms == 'linux' }}
110+ if : ${{ contains(fromJSON('[" all", "linux", ""]'), inputs.platforms) }}
112111 uses : ./.github/workflows/build-linux.yml
113- secrets :
114- APP_ENV : ${{ secrets.APP_ENV }}
112+ secrets : inherit
115113 with :
116114 version : ${{ needs.prepare.outputs.version }}
117115 build_type : nightly
118116 installer_base_name : ${{ needs.prepare.outputs.installer_base_name }}
119- linux_arch : ${{ inputs.linux_arch }}
120- enable_ip_check : ${{ inputs.enable_ip_check }}
121- force_full_tunnel_smoke : ${{ inputs.force_full_tunnel_smoke }}
122- run_auth_smoke : ${{ inputs.auth_smoke }}
117+ linux_arch : ${{ inputs.linux_arch || 'amd64' }}
118+ force_full_tunnel_smoke : true
119+ run_auth_smoke : ${{ (inputs.tests || 'all') == 'all' }}
123120
121+ # Not part of platforms=all (and so not the nightly): the connect smoke
122+ # needs the self-hosted runner with the approved system extension, so macOS
123+ # runs only when asked for explicitly.
124124 macos :
125125 needs : prepare
126- if : ${{ inputs.platforms == 'macos' || (inputs.platforms == 'all' && (inputs.macos_connect_smoke || inputs.macos_payment_checkout_smoke)) }}
126+ if : ${{ inputs.platforms == 'macos' }}
127127 uses : ./.github/workflows/build-macos.yml
128- secrets :
129- AC_USERNAME : ${{ secrets.AC_USERNAME }}
130- AC_PASSWORD : ${{ secrets.AC_PASSWORD }}
131- APP_ENV : ${{ secrets.APP_ENV }}
132- MACOS_BNS_CERT : ${{ secrets.MACOS_BNS_CERT }}
133- MACOS_BNS_CERT_PASS : ${{ secrets.MACOS_BNS_CERT_PASS }}
134- MACOS_PROVISION_PROFILE_BASE64 : ${{ secrets.MACOS_PROVISION_PROFILE_BASE64 }}
135- MACOS_PROVISION_TUNNEL_BASE64 : ${{ secrets.MACOS_PROVISION_TUNNEL_BASE64 }}
128+ secrets : inherit
136129 with :
137130 version : ${{ needs.prepare.outputs.version }}
138131 build_type : nightly
139132 installer_base_name : ${{ needs.prepare.outputs.installer_base_name }}
140133 runner_label : lantern-macos-smoke
141- run_connect_smoke : ${{ inputs.macos_connect_smoke }}
142- run_payment_checkout_smoke : ${{ inputs.macos_payment_checkout_smoke }}
143- enable_ip_check : ${{ inputs.enable_ip_check }}
144- force_full_tunnel_smoke : ${{ inputs.force_full_tunnel_smoke }}
134+ run_connect_smoke : true
135+ run_payment_checkout_smoke : ${{ (inputs.tests || 'all') == 'all' }}
145136
146137 windows :
147138 needs : prepare
148- if : ${{ inputs.platforms == ' all' || inputs.platforms == 'windows' }}
139+ if : ${{ contains(fromJSON('[" all", "windows", ""]'), inputs.platforms) }}
149140 uses : ./.github/workflows/build-windows.yml
150- secrets :
151- APP_ENV : ${{ secrets.APP_ENV }}
141+ secrets : inherit
152142 with :
153143 version : ${{ needs.prepare.outputs.version }}
154144 build_type : nightly
155145 installer_base_name : ${{ needs.prepare.outputs.installer_base_name }}
156146 skip_signing : true
157- enable_ip_check : ${{ inputs.enable_ip_check }}
158- run_connect_smoke : ${{ inputs.windows_connect_smoke }}
159- run_payment_checkout_smoke : ${{ inputs.windows_payment_checkout_smoke }}
160- run_split_tunnel_website_smoke : ${{ inputs.windows_split_tunnel_website_smoke }}
161- run_config_url_smoke : false
162- force_full_tunnel_smoke : ${{ inputs.force_full_tunnel_smoke }}
163- run_auth_smoke : ${{ inputs.auth_smoke }}
147+ force_full_tunnel_smoke : true
148+ run_auth_smoke : ${{ (inputs.tests || 'all') == 'all' }}
149+ run_split_tunnel_website_smoke : ${{ (inputs.tests || 'all') == 'all' }}
150+ run_payment_checkout_smoke : ${{ (inputs.tests || 'all') == 'all' }}
0 commit comments