Skip to content

ci: publish what passed and retry failed parts in the release check - #354

Draft
tnazarew wants to merge 2 commits into
ci/pr-coveragefrom
ci/retry-failed-parts
Draft

tnazarew wants to merge 2 commits into
ci/pr-coveragefrom
ci/retry-failed-parts

Conversation

@tnazarew

@tnazarew tnazarew commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Stacked on #352 (base ci/pr-coverage, for the pytest setup); retarget to main after #352 merges. Independent of #353.

Why

Every job after the components runs with if: !failure(). One failed component (a Dataproc cluster that doesn't start, a jar staging error) blocks the report, releases.json and the site for everything else; the next scheduled run then re-runs everything that changed. The release check failed on 5 of its last 10 scheduled runs (4 in a row, 2026-10-28 → 31).

What

  • Parts: a part is a (component, component_version, openlineage_version) triple (dataplex/scenarios: empty versions).
  • Plan: initialize_workflow writes the parts it's going to test from the effective matrices (planned-parts artifact). Pairs without a valid scenario are left out, since they can never produce a report (e.g. dbt 1.12.6 today: csv_to_postgres is gated to 1.8.0).
  • Pending: collect-and-compare-reports (new input track-pending, release check only) marks planned parts without a report as pending in generated-files/pending_runs.json, with failed runs in a row and first/last failed run, and lists them in the job summary. A part that reports again is dropped.
  • Retry: get_release_matrices.sh adds pending parts to the next run's matrices, so a failed part is retried on every scheduled run until it passes, even when no new release appeared. Matrices are cross products, so this can re-run a few extra pairs.
  • Partial publishing: collect, notify, update-repo-files, tables and site run when their inputs succeeded (!cancelled() + needs.<job>.result == 'success') instead of only when nothing failed. A failed notification doesn't block publishing.
  • publish input (manual runs, default true): false skips issues, report and site, to test pipeline changes from a branch.
  • fail-fast: false on the Hive and dbt matrices (release, PR and spec-change workflows), so one failed pair doesn't cancel the others. Spark already set it.
  • Removes the update_repo_files move of updated-new-report.json, which collect never uploads.

The failed job itself still makes the run red (and is what the upcoming pipeline alarm reports); after 3 failed runs in a row a part will also be escalated (follow-up PR).

Verification

  • pytest scripts/tests → 43 passed: pending_runs.py plan/update/summary, and get_release_matrices.sh run against the repo's versions.json with a temporary pending file (4 of those failed before the script change).
  • Local smoke test: planned dbt 1.8.0 × {1.55.0, 1.55.99} + dataplex, reports only for dbt 1.55.0 and dataplex → pending dbt 1.8.0 × 1.55.99 (failures 1); the next run's matrix is exactly that pair; a second failure → failures 2, first run kept.
  • actionlint: no new findings.
  • Release check dispatched from this branch with publish=false, dbt only, dbt_matrix={"component_version":["1.8.0"],"openlineage_versions":["1.55.0","1.55.99"]} (1.55.99 isn't published, so that pair fails):
    • run 42217294534: the 1.55.99 failure cancelled the 1.55.0 job (default fail-fast), so both ended pending. That's what the fail-fast: false commit fixes.
    • run 42217693825, after the fix: dbt 1.55.0 and scenarios were collected; the pending list holds only dbt 1.8.0 × 1.55.99 (1 failed run); notify, update-repo-files and site were skipped.

🤖 Generated with Claude Code

tnazarew and others added 2 commits November 12, 2026 14:16
Every job after the components used if: !failure(), so one failed
component (e.g. a Dataproc cluster that didn't start) blocked the report,
releases.json and the site for everything else, and the next run re-ran
everything that had changed.

- A part is a (component, component version, OpenLineage version) triple.
  The release check writes the parts it plans (planned-parts artifact,
  pairs without a valid scenario left out); collect marks planned parts
  without a report as pending in generated-files/pending_runs.json, with
  the number of failed runs in a row and the first/last failed run, and
  lists them in the job summary.
- get_release_matrices.sh adds pending parts to the next run's matrices,
  so a failed part is retried on every scheduled run until it passes, even
  when no new release appeared.
- collect, notify, update-repo-files, tables and site run when their
  inputs succeeded (!cancelled() + result checks) instead of only when
  nothing failed; a failed notification doesn't block publishing.
- New workflow_dispatch input publish ('false' skips issues, report and
  site) to test pipeline changes from a branch.
- Drops the update_repo_files move of updated-new-report.json, which
  collect never uploads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: tnazarew <tomasz.nazarewicz@getindata.com>
…atrices

GitHub's default fail-fast cancels the remaining matrix jobs when one fails, so a broken pair
(e.g. an OpenLineage version that isn't published yet) also left its siblings without a result.
Spark already sets fail-fast: false in its own workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: tnazarew <tomasz.nazarewicz@getindata.com>
@tnazarew
tnazarew force-pushed the ci/retry-failed-parts branch from 7f65fa4 to 637a2b6 Compare November 12, 2026 13:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant