Repository navigation
Conversation
|
I’ve revised this PR to align with #301’s move to manual-only Full GI testing. The automatic path detection and CI dispatch changes have been removed from the proposed scope. The remaining work improves reporting in Full GI stays manual-only and outside Local validation passed: 648 non-integration tests, including 42 focused tests for this change, plus workflow lint and documentation checks. Hosted Full GI workflow validation is still pending. The description now reflects this narrower scope and replaces the outdated draft and default-branch rollout notes. Updated head: |
|
Reviewed in an isolated worktree at head Claimed: Verified — holds: the PR touches 5 files and Claimed: pytest and log-writing exit codes are captured separately, and the original test failure is preserved. Verified — holds, and the tests catch a regression: the suite step now reads Claimed: a follow-up summary job reports setup, pytest, log capture, runtime and artifact separately, including after integration failures. Verified — holds (by reading the code and running the unit tests): Claimed: there's a bounded attempt to upload logs after failure or cancellation. Verified — holds as written: the upload step is Not independently re-verified: a hosted Full GI run, as the PR also says. Outputs flowing from the job into Non-blocking observations:
Every checkable claim held up. No closing keywords (the body says "Related to … closes neither issue"; the commit messages have none). Mergeable as-is. |
Files changed (5) — as of
|
| Field | Value |
|---|---|
| Change | Modified |
| Lines | +52/-8 |
| Diff (what exactly is in this PR) | Adds job outputs (setup/suite/upload outcomes, pytest/log exit codes, elapsed time, artifact URL), an Integration setup complete marker step (id: ready), and id: suite with a PIPESTATUS-based exit capture. The upload step becomes failure() || cancelled() with a 3-min timeout. Adds a new integration-summary job. The suite's own GITHUB_STEP_SUMMARY line is removed (the summary job replaces it). |
| Functionality — how & why | How: the suite step runs pytest piped into tee under set +e, records both pipeline exit codes and the elapsed time in GITHUB_OUTPUT, then exits with pytest's code, else tee's, else the output-write code. The marker step only succeeds once setup has finished, which lets the summary tell "setup failed" apart from "suite failed". integration-summary (needs: integration, if: always()) checks out the repo and runs the summary script with toJSON(needs) passed in through an env var. Why: before this, a failed manual Full GI run reported only one exit line, and a log-capture failure or a cancelled run couldn't be told apart from a test failure. |
Diff vs current develop HEAD |
None (develop is the merge-base). |
| Recommended merge proposal | Merged as-is. The exit-code logic is break-tested (5 tests fail when pytest's exit is dropped). Observation No. 1 (the step timeout no longer leaves room for the upload) is a possible follow-up. |
| Actual merge proposal | Merged as-is through the merge queue in 8f291c11. |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
.github/scripts/full_gi_summary.py + tests/test_full_gi_summary.py
| Field | Value |
|---|---|
| Change | New (both) |
| Lines | +117/-0 · +281/-0 |
| Diff (what exactly is in this PR) | A summary renderer: summary(needs) maps the integration job's result and outputs to a 6-row Markdown table, and main() appends it to GITHUB_STEP_SUMMARY. The tests cover each outcome mapping, malformed or missing outputs, the artifact-URL allowlist, the real step script run under bash (both pipeline exits, plus an output-write failure that must not hide a pytest failure), the workflow structure (manual-only, independent summary job), and the CLI. |
| Functionality — how & why | How: pure string mapping. Digits-only parsing means any missing or odd value reads as "unknown". The artifact link is rendered only for the canonical actions/runs/<id>/artifacts/<id> URL. Why: missing evidence must never look like a passing suite, and the summary must not render untrusted outputs as Markdown. |
Diff vs current develop HEAD |
None (new files). |
| Recommended merge proposal | Merged as-is. 42 passed locally; CI's Python job ran them (648 passed, 133 deselected). |
| Actual merge proposal | Merged as-is through the merge queue in 8f291c11. |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
Developer/CONTRIBUTING.md + Documentation/technical/testing/dincli-testing-guide.md
| Field | Value |
|---|---|
| Change | Modified (both) |
| Lines | +1/-1 · +21/-4 |
| Diff (what exactly is in this PR) | The integration-suite paragraph and the guide's "CI integration job" section now describe the summary job, the best-effort upload after failure or cancellation, and the timeout limits. The local reproduction snippet gains set -o pipefail. |
| Functionality — how & why | How: documentation only. Why: keeps the contributor docs in line with the workflow's new reporting. |
Diff vs current develop HEAD |
None. |
| Recommended merge proposal | Merged as-is. Docs CI green. Observation No. 2 (pipefail stays on in the reader's shell) is trivial. |
| Actual merge proposal | Merged as-is through the merge queue in 8f291c11. |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
Verification
See the verification comment above: CI run 41465774312 is green, the 42 focused tests pass locally, and the break-then-restore check failed 5 tests then passed 42. A hosted Full GI run is still pending; the first manual dispatch after merge covers it.
Local vs. GitHub agree: yes. Both report a clean merge.
|
Reviewed against Claimed: 42 focused reporting, shell failure-propagation and workflow tests passed. Verified: reproduced locally — Claimed: Full non-integration suite: 648 passed, 133 integration tests deselected. Verified: CI Python check green at Claimed: Workflow lint, Python lint/formatting, documentation links and whitespace checks passed. Verified: CI Docs and Python checks green at Claimed: ci.yml is unchanged from the current base, preserving PR No. 308's merge-queue support. Verified: Claimed: Verified: Claimed: Artifact URL is validated before being rendered as a Markdown link — arbitrary output cannot inject table rows. Verified: Claimed: Shell failure propagation preserves both pytest and tee PIPESTATUS exits; evidence-write failure cannot hide pytest failure. Verified: Claimed: Upload runs on Verified: Claimed: Hosted execution of the revised Full GI workflow remains pending. Not independently re-verified: live Full GI execution requires an active network and is outside CI. The PR author explicitly notes it as pending. This is expected for a manual-only workflow. All checkable claims hold up. No |
Files changed (5) — as of
|
| Field | Value |
|---|---|
| Change | New |
| Lines | +117/-0 |
| Diff (what exactly is in this PR) | New Python script: number(value) for safe int parsing, summary(needs) to generate a 6-column Markdown table from the workflow's needs context, main() to read INTEGRATION_NEEDS from env, call summary(), and append the result to GITHUB_STEP_SUMMARY. Artifact URL is validated with re.fullmatch(r"https://github\.com/[\w.-]+/[\w.-]+/actions/runs/[0-9]+/artifacts/[0-9]+", ...) before being rendered as a link. |
| Functionality — how & why | How: The integration-summary job (new job, below) passes toJSON(needs) as the INTEGRATION_NEEDS env var, which this script reads and parses. summary() inspects keys result, outputs.setup_outcome, outputs.suite_outcome, outputs.pytest_exit, outputs.elapsed_seconds, outputs.upload_outcome, outputs.artifact_url on the integration entry and maps them to a human-readable markdown table row per field; missing or malformed values become explicit "unknown"/"no recorded…" strings rather than silently claiming success. Why: Before this PR the Full GI workflow produced no structured job summary on failure or cancellation, leaving maintainers with nothing but raw log links to triage a run. |
Diff vs current develop HEAD |
None — new file, not present on develop |
| Recommended merge proposal | Merged as-is — 42/42 tests pass locally, CI Python check green at 785f452f, URL injection guard in place |
| Actual merge proposal | Soon |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
.github/workflows/full-gi.yml
| Field | Value |
|---|---|
| Change | Modified |
| Lines | +52/-8 |
| Diff (what exactly is in this PR) | Adds 7 outputs: to the integration job (setup_outcome, suite_outcome, pytest_exit, log_exit, elapsed_seconds, upload_outcome, artifact_url). Adds id: ready to the Set up environment step. Replaces simple status=$? in the main pytest step with PIPESTATUS capture (set +e; pytest … | tee …; pipeline_status=("${PIPESTATUS[@]}"); set -e; pytest_exit=…; log_exit=…). Extends upload step from if: failure() to if: failure() || cancelled(), adds id: upload and timeout-minutes: 3. Adds new integration-summary job (needs: integration, if: always(), timeout-minutes: 5, checkout fetch-depth: 1, runs full_gi_summary.py with INTEGRATION_NEEDS: ${{ toJSON(needs) }}). |
| Functionality — how & why | How: The integration job now exports granular exit status via job outputs (using per-step id: + echo "key=val" >> $GITHUB_OUTPUT). PIPESTATUS captures pytest and tee exits independently, preventing tee's exit masking pytest's. The upload step runs on both failure and cancellation now. The new integration-summary job reads needs.integration.outputs via toJSON(needs) and drives full_gi_summary.py. Why: Before this PR, a cancelled or failed run gave no structured output — maintainers couldn't distinguish "pytest failed" from "log capture failed" from "artifact upload failed" from a cancelled workflow. The if: always() on the summary job ensures the report appears even when the integration job is cancelled. |
Diff vs current develop HEAD |
None — the only develop-side change to full-gi.yml in the merge window came from develop itself (no other PRs touched it); ci.yml overlap with PR No. 308 is the only overlap, and that file is identical. |
| Recommended merge proposal | Merged as-is — workflow structural test (test_workflow_keeps_manual_policy_and_independent_reporting) passes; if: failure() || cancelled() and output keys verified in test; PIPESTATUS propagation verified by shell subprocess test |
| Actual merge proposal | Soon |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
Developer/CONTRIBUTING.md
| Field | Value |
|---|---|
| Change | Modified |
| Lines | +1/-1 |
| Diff (what exactly is in this PR) | Single line updated in the "Running the integration tests" section to describe the new Full GI outcome reporting (reference to the Step Summary table). |
| Functionality — how & why | How: Documentation update only — tells contributors where to find the structured outcome report when a Full GI run produces one. Why: Keeps the contributing guide accurate now that Step Summary output exists. |
Diff vs current develop HEAD |
None — CONTRIBUTING.md not touched on develop in the merge window |
| Recommended merge proposal | Merged as-is |
| Actual merge proposal | Soon |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
Documentation/technical/testing/dincli-testing-guide.md
| Field | Value |
|---|---|
| Change | Modified |
| Lines | +24/-12 |
| Diff (what exactly is in this PR) | Updates the Full GI section of the testing guide: describes the 7 new outputs the integration job exposes, explains the Step Summary table and what each column means, and notes the PIPESTATUS capture for exit-code preservation. |
| Functionality — how & why | How: Documentation update only — adds a reference table for the 7 job outputs and a brief explanation of how the summary job consumes them. Why: Without updated docs, contributors wouldn't know what the new Step Summary fields mean or how to interpret exit-code combinations in the table. |
Diff vs current develop HEAD |
None — not touched on develop in the merge window |
| Recommended merge proposal | Merged as-is |
| Actual merge proposal | Soon |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
tests/test_full_gi_summary.py
| Field | Value |
|---|---|
| Change | New |
| Lines | +281/-0 |
| Diff (what exactly is in this PR) | New test file: 16 test functions covering the reporter (test_missing_outputs_never_claim_suite_or_setup_success, test_missing_integration_is_unknown, test_nonzero_pytest_exit_propagated, etc.), shell failure-propagation (test_actual_suite_shell_preserves_both_pipeline_exits — spins up fake pytest/tee binaries and runs the real bash step), workflow structure (test_workflow_keeps_manual_policy_and_independent_reporting), and injection guard (test_unexpected_artifact_output_is_not_rendered_as_markdown). |
| Functionality — how & why | How: Pytest parametrize expands the file to 42 test cases. Shell tests use subprocess.run with a PATH prepended with a temp bin dir containing fake pytest and tee scripts with configurable exit codes; the real suite-step bash script is extracted from the workflow YAML at test time. The workflow-structure test reads full-gi.yml directly with yaml.safe_load and asserts on-event triggers, continue-on-error absence, output key names, and summary-job shape. Why: The PIPESTATUS capture and artifact URL guard are subtle bash/regex behaviours that could silently regress — a unit test of the Python logic alone wouldn't catch them. The shell subprocess test provides the strongest evidence that the bash step actually preserves both exits. |
Diff vs current develop HEAD |
None — new file, not present on develop |
| Recommended merge proposal | Merged as-is — 42/42 pass locally and CI Python check green |
| Actual merge proposal | Soon |
| Pending proposal | None |
| Local merge conflict | No |
| GitHub merge conflict | No |
Verification
Deep verification detail in the separate verification comment. Summary: python3 -m pytest tests/test_full_gi_summary.py -v — 42 passed in the review worktree. CI Python check green at 785f452f. All 4 CI checks pass.
Local vs. GitHub agree: git merge-tree --write-tree exit 0 (no file list) matches GitHub mergeable: MERGEABLE.
robertocarlous
left a comment
There was a problem hiding this comment.
Verified at 785f452: 42/42 tests pass locally, CI all green (Python, Docs, Solidity, CI OK), clean merge, PIPESTATUS capture and artifact URL guard confirmed by shell subprocess and regex tests respectively.
8f291c1
Actual outcome — PR No. 296 merged as-is through the merge queueThis replaces the predictions in the pre-merge review comment with what actually happened when the PR landed. One commit on
Files unchanged from the PR (5 of 5)
Verification
Local vs. GitHub agree: yes. Both predicted a clean merge, and that's what happened. |
PR #301 moved Full GI to a manual-only workflow. This PR adds a summary that makes those runs easier to investigate by reporting setup completion, pytest results, log capture, runtime and artifact availability separately.
Changes
full-gi.yml, including reporting after integration failures.Full GI remains manual-only and outside
CI OK. Integration, logging, upload and reporting failures retain their real failure status.ci.ymlis unchanged from the current base, preserving #308’s merge-queue support.This replaces the original automatic input-detection and CI dispatch proposal, which was superseded by #301.
Reporting and uploads are best effort: cancellation, timeouts or runner loss can prevent collection. This PR does not repair the Full GI suite or add #241’s harness diagnostics.
Validation
Head:
785f452fe60d86c34f1838b33ad3f5f4603d6af2. Its file tree is identical to the locally tested revision,54f1d43; the merge preserves the existing PR history and incorporates currentdevelop.Related to #270 and #228; closes neither issue.