Repository navigation
ci(gfx1250): email a test report after every nightly - #13620
Conversation
Add a report job and .github/scripts/gfx1250_nightly_report.py. After every nightly (or a manual run with send_report), it builds an HTML report and POSTs it to the Power Automate flow in the GFX1250_BLAS_NIGHTLY_WEBHOOK_URL secret, which emails it. GFX1250_BLAS_SYSTEM_LABEL (optional) fills the System row. Without the webhook secret the job skips with a notice. - Contents: status banner and subject (✅/❌), run metadata, per-suite counts with failing tests, and a per-test comparison with the most recent nightly that has results (within 7 days): new, existing, fixed (fail -> pass) and skipped or removed. It warns when that nightly isn't last night's. - Runs on a GitHub-hosted runner from the test job's artifact and outputs, so a report goes out even if the test job failed, timed out or never started, and the secret never reaches the self-hosted runner. Follow-ups from the #12983 review and the first per-PR runs: - Gate: add cmake/ (in the sparse checkout; rocisa and stinkytofu include cmake/modules/default_amdclang.cmake). - One-GPU check: if the runner's .env doesn't set ROCR_VISIBLE_DEVICES, use N from the runner name's -gpuN suffix, with a warning. Drop HIP_VISIBLE_DEVICES, which is never forwarded into the container. - SDK pin 10.2.0a20261007 -> 10.2.0a20261013, whose compiler (amd-llvm c7ceccf9a5) matches per-PR CI's again. The pin moves to workflow-level env for both jobs. - upload-artifact v4.6.2 -> v7.0.2 (Node 20 is deprecated); runners report 2.337.0, above v7's 2.327.1 minimum. Co-Authored-By: Claude <noreply@anthropic.com>
❌ PR Check — Action Required
📖 Need help? See the Policy FAQ for details on every check and how to fix failures. |
Pre-commit check failed⛔ pre-commit failed Please run locally:
This repo uses |
|
🚫 Please fix the failed policies before requesting reviews. The following policy checks failed:
The |
A skipped "Nightly report" job showed on every gated PR. Move it to gfx1250_nightly_report.yml, which starts when a develop run of the test workflow finishes (workflow_run) and acts only on nightly runs, so PRs get no report check. It keeps the same guarantees: GitHub-hosted (the webhook secret never reaches the gfx1250 runner), and a report even when the test job failed, timed out or never started. - It reads the run's results by run ID and its runner and step results from the jobs API; the script takes REPORT_* overrides for the reported run's ID, commit, branch and event. - The test job records its SDK version in the artifact (test_results/rocm_sdk_version.txt). - Nightly runs only: no manual trigger (the send_report input is gone), so manual runs of the test workflow don't email. - The trigger matches the test workflow's name; a comment there says to rename both together. - Drop the test job's outputs and the step IDs only the report used. Co-Authored-By: Claude <noreply@anthropic.com>
Replace gfx1250_nightly_report.yml with a report job in gfx1250_hipblaslt_tensilelite_test.yml that calls a new reusable workflow, nightly_test_report.yml, after the test job. It runs for the nightly, however the test job ended, on a GitHub-hosted runner, and reads the artifact from the same run. A manual run with send_report (no tests needed) sends it too, to try the webhook; a follow-up commit removes that once tested. - nightly_test_report.yml inputs: title, test_job, artifact, suites, and optional meta and strip; secrets webhook_url (skips with a notice when unset) and system_label. - The script, renamed to nightly_test_report.py, takes everything project-specific from options. Suites are gtest log globs or the Nth pytest session of a log; --meta LABEL=@path reads a value from the results. It finds the previous nightly from the run's own workflow. - The report warns when the test job or the artifact isn't in the run, rather than silently dropping rows. Steps are listed by their names, so a renamed step can't vanish from the email. - It now fails when a listed suite didn't run or the test job was skipped; before, one suite with results was enough for PASSED. - Email layout: one heading per suite (no TensileLite group), and Architecture and ROCm SDK now follow Commit ID. Co-Authored-By: Claude <noreply@anthropic.com>
rocm is a source-only package, so pip builds it and stores the built wheel in the cache, which is mounted read-only outside the nightly. With the new SDK pin nothing was cached yet, and every PR and manual run failed at "Read-only file system: '/pip-cache/wheels/...'" (develop dispatch run 38544746130). Install rocm itself with --no-cache-dir and --no-deps, then the extras, whose multi-GB wheels still come from the cache. Co-Authored-By: Claude <noreply@anthropic.com>
Remove the send_report input now that a manual run has confirmed the email end to end: manual runs of the test workflow no longer email. The report job runs only for the nightly; re-running its "Nightly report" job re-sends a night's report. Co-Authored-By: Claude <noreply@anthropic.com>
The report job showed as a skipped check on every PR. The report is now the test job's last step before cleanup, calling the script directly; the reusable workflow is removed. It runs on the nightly, and on a manual run with send_report. continue-on-error: a send failure doesn't fail the tests. With --job-status the script reads this job's finished steps from the API (the container has no gh or jq); the webhook URL comes from WEBHOOK_URL, so it stays off the command line, and a failed send prints only the HTTP status. Nothing is sent when the job never gets a runner. The payload tells failures apart for the flow: outcome (passed / setup_failed / tests_failed / tests_incomplete / cancelled), failed_step, steps, and per-test status timeout or crashed. A gtest shard that stops in a test (the client's alarm timeout, or a crash) used to drop that test and the rest of the shard silently; that test is now listed. All test lists sit at the end of the email under Failures, tagged new / timeout / crashed. Cleanup: no global state (the timeout/crash tags are passed in), the unused --warn and --meta @path are gone (the SDK version comes from the job's environment), files are closed. Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
pls make this file name specific to blas, this is too generally sounding
There was a problem hiding this comment.
Done: renamed to .github/scripts/blas_nightly_report.py.
There was a problem hiding this comment.
seems mostly AI generated, and it's mostly html created. does it work?
There was a problem hiding this comment.
Yes, it works.
Run 38626703691, a manual run of this branch, sent the email through the flow with nightly comparison.
I ran the same script locally on last night's develop nightly, 38675731057 + compared it with 10-14's.
Reported 68,040 hipBLASLt, 111 TensileLite common and 264 rocisa passes.
It also flagged 8 hipBLASLt tests as removed, which #13214 did.
Setup flow (temporarily) to send you that email.
| sha_full[:6], | ||
| ) | ||
| kind = "Nightly" if env.get("GITHUB_EVENT_NAME") == "schedule" else "Manual" | ||
| run_url = f"{server}/{repo}/actions/runs/{env.get('GITHUB_RUN_ID', '')}" |
There was a problem hiding this comment.
not sure why we are scraping it. why can't we just use the data from previous workflow step?
There was a problem hiding this comment.
- Step results: agreed, done. They come from
steps.<id>.outcomeandjob.status; no more API calls. - Per-test results: steps only give pass/fail per step, so per-test lists need the test output. The logs are already scrubbed and uploaded, and last night's comparison reads them too. JUnit XML would need its own scrubbing of HW sensitive info, and a crashed shard writes none.
There was a problem hiding this comment.
a lot of these changes are not relevant to email. let's keep those out and add it as separate PR
…il only - Rename the script to .github/scripts/blas_nightly_report.py. - Step results come from the workflow (steps.<id>.outcome, job.status) through --steps; the script no longer reads them from the GitHub API. A step that never started counts as skipped. - Keep this PR to the email report. Co-Authored-By: Claude <noreply@anthropic.com>
…line The "latest nightly with results was N nights back" warning measured from when the report was sent, so a nightly that waited hours for a runner (or a report sent later) claimed 2 nights for last night's run. It now measures from this run's start and ignores later runs. The warning and the test lists put one item per line (<br>); some mail views ran the <ul> items together. Lists read "<suite>:" then "(failing)" etc., and the warning drops the "nightlies with no results" line. Co-Authored-By: Claude <noreply@anthropic.com>
The TensileLite log holds two pytest sessions (rocisa, then the common tests), picked by position. Sessions were split at their summary lines, so a session that died before its summary merged into the next one and its results were reported under the wrong suite. Sessions now start at pytest's "test session starts" line: an unfinished session keeps its place and is reported as not run. Co-Authored-By: Claude <noreply@anthropic.com>
geomin12
left a comment
There was a problem hiding this comment.
lgtm for temporary notification and efforts
this workflow and work is definitely pretty hacky. ideally, we can make this dynamic so when we get new architectures, we should not have to create these "one off" workflow to test
just to keep in mind. after this lands, we should re-work it. TheRock CI integrates quite well with this to be honest
There was a problem hiding this comment.
let's make this more generic in a future PR. same for email feature, i feel lots of identical features are in this repo and we should condense and re-use components when we can
There was a problem hiding this comment.
Posting for clarification:
We have this standalone workflow to address gfx1250-strict testing gap, necessary as TheRock wasn’t building strict artifacts and this was P1 to be enabled asap per-PR.
Will follow up on integrating to TheRock infra once this is available.
Emailing everyday isn’t already a feature, we only send emails on failures, hence the need for custom script.
@amd-shiraz
|
|
||
| # Before the hand-back, which also covers the previous results it downloads. | ||
| - name: Email the test report | ||
| if: ${{ always() && (github.event_name == 'schedule' || inputs.send_report) }} |
There was a problem hiding this comment.
if we somehow manually or re-trigger with run_hipblaslt=false (or run_tensilelite=false) but leave send_report=true, the skipped tests will show up as setup_failed in the report. This will cause a X FAILED email and ok=false in the webhook even though the run was intentionally partial.
…ite timeout; cleanup (#13771) JIRA ID : N/A ## Motivation Follow-ups from the #12983 and #13464 reviews, split out of #13620, plus a fix for hipBLASLt tests running ~7x slower since per-PR runs started. ## Technical Details - **hipBLASLt test speed:** `OMP_NUM_THREADS` and `OPENBLAS_NUM_THREADS` = host CPUs / (4 runners x 4 shards); `BLIS_NUM_THREADS` = the same, at most 8 (hipBLASLt's own BLIS default, which setting `OMP_NUM_THREADS` turns off). By default the CPU reference's OpenMP and OpenBLAS pools each start one thread per host CPU, so 4 runners x 4 shards oversubscribe the host 16x per pool: since per-PR runs started (10-12 to 10-15), the step took ~80 min when other runners were testing vs ~15 min alone, up to 110 min of its 120-min timeout. - **Gate:** add `cmake/` (rocisa and stinkytofu include `cmake/modules/default_amdclang.cmake`). - **One-GPU check:** runs first in its step, under `set -euo pipefail`. `ROCR_VISIBLE_DEVICES` comes from the runner's `.env`; if it is unset, N comes from the runner name's `-gpuN` (the pool registers runner N as `...-gpuN` with `ROCR_VISIBLE_DEVICES=N`), with a warning. It must be a single GPU index (`^[0-9]+$`), or the job fails before the build. Drop `HIP_VISIBLE_DEVICES` (never forwarded into the container). - SDK pinned to `10.2.0a20261013` (compiler `c7ceccf9a5`). Per-PR CI has since moved to compiler `bdc35841c9` (#13835, 10-19), so the workflow's compiler check now warns; re-pinning to `10.2.0a20261018` or later, which carries `bdc35841c9`, is a follow-up. - **upload-artifact:** v4.6.2 -> v7.0.2 (Node 20 deprecated). v7 needs Actions Runner >= 2.327.1; the gfx1250 runner is 2.337.0. - **TensileLite per-test timeout:** 600 -> 1200 s, this workflow only (FFM and TheRock keep their own). `decouple_pgr_tdm_fuse_gfx1250.yaml` has timed out at 600 s in most runs since #12825 grew its sweep 4.5x; before, it passed 41 of 41. - **Header:** the workflow is marked temporary, to be removed once TheRock's multi-arch builds produce gfx1250-strict artifacts (ROCm/TheRock#8350) and gfx1250-strict runners are available in TheRock CI. ## Test Plan - OpenMP cap: 4 jobs x 4 shards of a `*pre_checkin*` slice on a 128-core gfx942 host, default vs capped. - One-GPU check: 7 values under `bash -euo pipefail`. ## Test Result - [x] Run https://github.com/ROCm/rocm-libraries/actions/runs/38994215757: all steps green with no warnings on SDK 10.2.0a20261013 - hipBLASLt 68,925 tests, 0 failed, in 3.9 min (OpenMP/OpenBLAS capped, BLIS at most 8) while an uncapped run on the same host took 52 min - TensileLite 113 passed, including decouple_pgr_tdm_fuse_gfx1250.yaml under the 1200 s timeout. ## Submission Checklist - [x] Look over the contributing guidelines at https://github.com/ROCm/TheRock/blob/main/GOVERNANCE.md#pull-requests. ## Risk level Low: CI-only, gfx1250 workflow. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <noreply@anthropic.com>
TheRock Submodule Bump ActivityNewest first
|
JIRA ID : N/A
Motivation
Email a test report after every gfx1250-strict nightly.
Technical Details
.github/scripts/blas_nightly_report.py(standard library only) and emails through a Power Automate flow (secretGFX1250_BLAS_NIGHTLY_WEBHOOK_URL).send_report; never on PRs. A step, so PRs show no skipped check. No runner, no email; a failed send doesn't fail the job.steps.<id>.outcome,job.status); per-test results from the test logs.hipBLASLt:/(failing), one test per line; the comparison's age counts from this run's start, not from when the email is sent.outcome(passed/setup_failed/tests_failed/tests_incomplete/cancelled),failed_step,steps, per-teststatus(failing/timeout/crashed).send_reportinput,actions: read(previous nightly's results),.github/scriptsin the sparse checkout, step ids.Test Plan
send_report=true.--stepsas the workflow builds it, including steps that never started.Test Result
outcome,failed_stepand per-test status, e.g. "5 failing tests (2 timeout, 1 crashed)".Report not sent (ConnectionRefusedError), no URL.Submission Checklist
Risk level
Low: CI-only. The step runs only on the nightly or a manual run with
send_report.🤖 Generated with Claude Code