1313# back clean one day and flagged the next, which is precisely why finding out
1414# during a dry run is worth the wait.
1515#
16- # Two independent skips, because they answer different questions:
17- # skip_builds no artifacts at all — "do lint and tests pass?"
18- # skip_virustotal build + smoke + soak, no scan — "do the archives pass CI?"
19- # The second exists because the scan costs API quota and polls for up to two
20- # hours, which is pure noise while iterating on a build or smoke failure.
16+ # The skips are independent because they answer different questions:
17+ # skip_builds no artifacts at all "do lint and tests pass?"
18+ # skip_smoke build + scan, no smoke "does this diff scan red?"
19+ # skip_virustotal build + smoke + soak, no scan "do the archives pass CI?"
20+ #
21+ # skip_virustotal exists because the scan costs API quota and polls for up to
22+ # two hours, which is pure noise while iterating on a build or smoke failure.
23+ #
24+ # skip_smoke is the opposite trip: go straight from build to VirusTotal when the
25+ # question is only whether a diff turns the scan red. Smoke is in the VirusTotal
26+ # job's needs, so without this a smoke failure would withhold exactly the answer
27+ # such a run was dispatched to get.
2128name : Dry Run
2229
2330on :
3542 description : ' Skip build + smoke (also skips VirusTotal — nothing to scan)'
3643 type : boolean
3744 default : false
45+ skip_smoke :
46+ description : ' Skip smoke (build straight to VirusTotal)'
47+ type : boolean
48+ default : false
3849 skip_virustotal :
3950 description : ' Skip VirusTotal scan (still builds + smokes the archives)'
4051 type : boolean
8697 # (including the macos-15-intel darwin-amd64 binary) is blocking now, so a
8798 # failed/missing platform binary correctly stops smoke — see _build.yml.
8899 smoke :
89- if : ${{ inputs.skip_builds != true && !cancelled() && needs.build.result != 'failure' && needs.build.result != 'skipped' }}
100+ if : ${{ inputs.skip_builds != true && inputs.skip_smoke != true && !cancelled() && needs.build.result != 'failure' && needs.build.result != 'skipped' }}
90101 needs : [build]
91102 uses : ./.github/workflows/_smoke.yml
92103 with :
@@ -112,6 +123,11 @@ jobs:
112123 # take up to two hours) and the one most likely to be waiting on someone
113124 # else's queue, so it must not delay the feedback that is actually about our
114125 # code.
126+ #
127+ # It needs smoke and soak only so it runs LAST, not because it depends on
128+ # them: a skipped smoke or soak leaves the scan reachable (result 'skipped',
129+ # which is not 'failure'), while a FAILED one withholds it — if the artifacts
130+ # are broken, a verdict on them is not worth two hours of polling.
115131 virustotal :
116132 if : ${{ inputs.skip_builds != true && inputs.skip_virustotal != true && !cancelled() && needs.build.result == 'success' && needs.smoke.result != 'failure' && needs.soak.result != 'failure' }}
117133 needs : [build, smoke, soak]
0 commit comments