From 1caac95d2c60fdc98347d1fbc5179640255c2742 Mon Sep 17 00:00:00 2001 From: Seungpyo1007 Date: Tue, 8 Sep 2026 13:35:33 +0900 Subject: [PATCH] fix(ci): stop weekly-refresh dying at the 6h ceiling before it dumps Every run since at least 2026-08-03 has ended at 6:00:2x, always in "Enrich benchmarks (all sources)". GitHub reports a job that hits its 6h ceiling as *cancelled* rather than failed, so nothing ever appeared in the failed-run list while validate, integrity, the static dump and the refresh PR were skipped every single week. The cost is not theoretical: the published dump has drifted away from data/ because the dump step never ran. 565 of 2,030 gpu pages, and 93 more across soc/watch/pda/brand, currently advertise a `verified` value the record no longer has. Give collection a 200-minute budget it checks between sources, so the remainder of the pipeline always gets to run, and rotate the starting point by ISO week so sources at the tail of the list are not starved once the budget starts biting. Add a 330-minute job timeout so this can never again be silently truncated by the platform ceiling. Refs #1 --- .github/workflows/weekly-refresh.yml | 33 +++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/.github/workflows/weekly-refresh.yml b/.github/workflows/weekly-refresh.yml index 9f4d94d..c915f26 100644 --- a/.github/workflows/weekly-refresh.yml +++ b/.github/workflows/weekly-refresh.yml @@ -33,6 +33,9 @@ concurrency: jobs: refresh: runs-on: ubuntu-latest + # A job that runs into GitHub's 6h ceiling is reported as *cancelled*, + # not failed, so it never surfaces as a broken run. Stop short of it. + timeout-minutes: 330 env: SLEEP: ${{ inputs.sleep || '1.0' }} TECHAPI_TOKEN: ${{ secrets.TECHAPI_TOKEN }} @@ -80,11 +83,35 @@ jobs: fi echo "::endgroup::" } - for s in passmark cinebench-legacy cinebench-r23 cinebench-2024 \ - cinebench-nbc geekbench-nbc spec-cpu2006 topcpu-cpu; do + # The scrape grew past GitHub's 6h job ceiling, and an over-running + # job is reported as "cancelled" rather than failed — so nothing looked + # broken while validate, the static dump and the refresh PR were being + # skipped every week. Give collection a budget it cannot exceed and + # leave the remainder to the rest of the pipeline. + BUDGET_S=$(( 200 * 60 )) + DEADLINE=$(( $(date +%s) + BUDGET_S )) + budget_left() { + if [ "$(date +%s)" -ge "$DEADLINE" ]; then + echo "::warning::collection budget spent; remaining sources deferred to the next run" + return 1 + fi + } + # Rotate where the list starts each week: with a fixed order the tail + # is starved forever once the budget begins to bite. + rotate() { + local -n _a="$1" + local n=${#_a[@]} off=$(( 10#$(date -u +%V) % ${#_a[@]} )) + printf '%s\n' "${_a[@]:off}" "${_a[@]:0:off}" + } + CPU_SOURCES=(passmark cinebench-legacy cinebench-r23 cinebench-2024 + cinebench-nbc geekbench-nbc spec-cpu2006 topcpu-cpu) + GPU_SOURCES=(blender timespy passmark-gpu topcpu-gpu) + for s in $(rotate CPU_SOURCES); do + budget_left || break run_enrich cpu "$s" done - for s in blender timespy passmark-gpu topcpu-gpu; do + for s in $(rotate GPU_SOURCES); do + budget_left || break run_enrich gpu "$s" done