From 9b0cc2b395c592daea63da335820a80116b89212 Mon Sep 17 00:00:00 2001 From: Nils Andreas Svee Date: Fri, 5 Jun 2026 17:13:51 +0700 Subject: [PATCH] test(ci): split netem interop summaries into local and GitHub-specific reports Create separate markdown files for local browsing with relative links and GitHub Action summaries with artifact notices. This ensures the GitHub Step Summary remains readable and informative without broken links. --- .github/workflows/interop-netem.yml | 4 +-- scripts/run_netem_interop_ci.py | 47 +++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.github/workflows/interop-netem.yml b/.github/workflows/interop-netem.yml index a384568..42f207e 100644 --- a/.github/workflows/interop-netem.yml +++ b/.github/workflows/interop-netem.yml @@ -60,11 +60,11 @@ jobs: - name: Append netem interop summary if: always() run: | - latest_summary="$(find target/interop-netem -mindepth 2 -maxdepth 2 -name summary.md -type f -print 2>/dev/null | sort | tail -n 1)" + latest_summary="$(find target/interop-netem -mindepth 2 -maxdepth 2 -name github-step-summary.md -type f -print 2>/dev/null | sort | tail -n 1)" if [ -n "$latest_summary" ]; then cat "$latest_summary" >> "$GITHUB_STEP_SUMMARY" else - echo "No netem interop summary.md found." >> "$GITHUB_STEP_SUMMARY" + echo "No netem interop github-step-summary.md found." >> "$GITHUB_STEP_SUMMARY" fi - name: Upload netem interop artifacts diff --git a/scripts/run_netem_interop_ci.py b/scripts/run_netem_interop_ci.py index 185ba30..1775810 100755 --- a/scripts/run_netem_interop_ci.py +++ b/scripts/run_netem_interop_ci.py @@ -613,20 +613,50 @@ def format_optional(value: Any) -> str: def write_run_summary(run_dir: Path, results: list[dict[str, Any]]) -> None: write_json(run_dir / "netem-summary.json", {"results": results}) + (run_dir / "summary.md").write_text( + build_run_summary_markdown(results, link_scenarios=True, include_artifact_note=False), + encoding="utf-8", + ) + (run_dir / "github-step-summary.md").write_text( + build_run_summary_markdown(results, link_scenarios=False, include_artifact_note=True), + encoding="utf-8", + ) + + +def build_run_summary_markdown( + results: list[dict[str, Any]], + *, + link_scenarios: bool, + include_artifact_note: bool, +) -> str: lines = [ "# Netem IRTT Interop Run", "", - "| scenario | classification | expected RTT us | upstream median RTT us | irtt-rs median RTT us | upstream loss % | irtt-rs loss % | mean RTT delta us |", - "| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |", ] + if include_artifact_note: + lines.extend( + [ + "Detailed per-scenario files are available in the uploaded `interop-netem` artifact.", + "", + ] + ) + lines.extend( + [ + "| scenario | classification | expected RTT us | expected loss % | upstream median RTT us | irtt-rs median RTT us | upstream loss % | irtt-rs loss % | mean RTT delta us |", + "| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |", + ] + ) for result in results: scenario = result["scenario"] upstream = result["upstream"] rust = result["irtt_rs"] + scenario_name = scenario["name"] + scenario_cell = f"[{scenario_name}]({scenario_name}/summary.md)" if link_scenarios else scenario_name lines.append( - f"| [{scenario['name']}]({scenario['name']}/summary.md) | " + f"| {scenario_cell} | " f"{result['classification']} | " f"{format_optional(scenario.get('expected_rtt_us'))} | " + f"{format_optional(result.get('expected_loss_percent'))} | " f"{format_optional(upstream.get('rtt_median_us'))} | " f"{format_optional(rust.get('rtt_median_us'))} | " f"{format_optional(upstream.get('loss_percent'))} | " @@ -637,11 +667,16 @@ def write_run_summary(run_dir: Path, results: list[dict[str, Any]]) -> None: warnings = [(result["scenario"]["name"], item) for result in results for item in result["warnings"]] if failures: lines.extend(["", "## Failures"]) - lines.extend(f"- [{scenario}]({scenario}/summary.md): {item}" for scenario, item in failures) + lines.extend(format_run_summary_item(scenario, item, link_scenarios) for scenario, item in failures) if warnings: lines.extend(["", "## Warnings"]) - lines.extend(f"- [{scenario}]({scenario}/summary.md): {item}" for scenario, item in warnings) - (run_dir / "summary.md").write_text("\n".join(lines) + "\n", encoding="utf-8") + lines.extend(format_run_summary_item(scenario, item, link_scenarios) for scenario, item in warnings) + return "\n".join(lines) + "\n" + + +def format_run_summary_item(scenario: str, item: str, link_scenarios: bool) -> str: + scenario_label = f"[{scenario}]({scenario}/summary.md)" if link_scenarios else scenario + return f"- {scenario_label}: {item}" def stop_process(proc: subprocess.Popen[bytes]) -> None: