Skip to content

Commit 360330d

Browse files
committed
fixup! fixup! fixup! fixup! Add CI that builds and runs every example against wolfSSL master and stable
1 parent 7850926 commit 360330d

2 files changed

Lines changed: 23 additions & 3 deletions

File tree

.github/scripts/ci_triage.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,13 @@ def classify(run_id, attempt, retry_note):
224224
for r in merged_results(run_id, attempt):
225225
if r["status"] == "fail":
226226
fail_refs[r["id"]].add(r.get("ref") or "unknown")
227+
# A flake has no failing ref in the final attempt by definition, so without
228+
# this its issue would name no ref at all. The ref that failed first is the
229+
# whole point of the report.
230+
a1_refs = defaultdict(set)
231+
for r in fetch_results(run_id, 1):
232+
if r["status"] == "fail":
233+
a1_refs[r["id"]].add(r.get("ref") or "unknown")
227234

228235
obs = {}
229236
for eid in set(a1) | set(final):
@@ -233,6 +240,7 @@ def classify(run_id, attempt, retry_note):
233240
obs[eid] = store.UNCONFIRMED if retry_note else store.REAL
234241
elif failed_before and attempt >= 2:
235242
obs[eid] = store.FLAKE_ONLY
243+
fail_refs[eid] |= a1_refs.get(eid, set())
236244
else:
237245
obs[eid] = store.PASS
238246
# every host dir came from examples.yml, which nightly.yml calls as `host`
@@ -310,6 +318,8 @@ def by_unit(jobs):
310318
refs[t] = {r for c, r in final[t] if c == "failure"}
311319
elif failed_before and attempt >= 2:
312320
obs[t] = store.FLAKE_ONLY
321+
# nothing failed in the final attempt, so name the ref that failed first
322+
refs[t] = {r for c, r in a1[t] if c == "failure"}
313323
else:
314324
obs[t] = store.PASS
315325
targets[t] = t

.github/scripts/issue_store.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,16 +198,26 @@ def decide(observation, issue, close_allowed=True):
198198
# Absence of evidence is not recovery. Only an observed pass closes.
199199
return "noop", "absent from this run"
200200

201-
if observation == PASS or observation == FLAKE_ONLY:
201+
if observation == PASS:
202202
if issue and issue.get("state") == "open":
203203
if not close_allowed:
204204
return "update", "circuit breaker: refusing to close"
205205
if parse_state(issue.get("body", "")).get("sticky"):
206206
return "update", "sticky (flaky): human closes"
207-
why = "recovered on retry (flake)" if observation == FLAKE_ONLY else "passing again"
208-
return "close", why
207+
return "close", "passing again"
209208
return "noop", "passing"
210209

210+
if observation == FLAKE_ONLY:
211+
# A flake is a failure a retry hid, not a pass. It used to fall in with
212+
# PASS above, so a dir that flaked every night closed its own issue every
213+
# night and left no trace -- which is how the dtls resume flake stayed
214+
# invisible until two runs were diffed by hand. Only a clean night closes.
215+
if not issue:
216+
return "open", "flaked and recovered on retry"
217+
if issue.get("state") == "closed":
218+
return "reopen", "flaked again"
219+
return "update", "flaked and recovered on retry"
220+
211221
# REAL or UNCONFIRMED
212222
if not issue:
213223
return "open", "first failure"

0 commit comments

Comments
 (0)