You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@burr.apache.org by eb...@apache.org on 2026/05/11 20:19:57 UTC
(burr) branch main updated: ci: gate merging on a single Release Validation summary job (#775)
This is an automated email from the ASF dual-hosted git repository.
elijahbenizzy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/burr.git
The following commit(s) were added to refs/heads/main by this push:
new 56dcfd47 ci: gate merging on a single Release Validation summary job (#775)
56dcfd47 is described below
commit 56dcfd4735f8d39555aa9259818b0cb7e0207e8a
Author: Elijah ben Izzy <el...@users.noreply.github.com>
AuthorDate: Mon May 11 13:19:52 2026 -0700
ci: gate merging on a single Release Validation summary job (#775)
* ci: gate merging on a single Release Validation summary job
Adds a "summary" job to release-validation.yml that depends on
check-paths, build-artifacts, and install-and-smoke and runs
with if: always(). It translates the upstream conclusions into
a single binary verdict — success/skipped → pass, failure or
cancelled → fail — so the required check has a stable name and
a definite state regardless of whether upstream jobs ran or
were path-filtered out.
In .asf.yaml the required contexts drop from two matrix-suffixed
names ("Release Validation / build-artifacts", "Release Validation
/ install-and-smoke (3.12)") to one: "Release Validation / summary".
Why this is needed:
- PRs that only touch docs/ or website/ trigger check-paths to
set should_run=false, which skips the heavy jobs.
- GitHub treats SKIPPED jobs as non-passing for required-status-
checks, so those PRs were stuck in BLOCKED state forever
(see commit a655edf2 for the previous attempt that didn't
work for this exact reason).
- The summary job sidesteps the SKIPPED ambiguity because it
always runs and always produces a definite SUCCESS or FAILURE.
Real code PRs are unaffected: if any release-validation job
fails, the summary fails, and merging is blocked.
* style: run black on burr/core/graph.py
Drive-by fix — `f7a1750d` (rename shadowed `format` builtin)
left this file black-non-compliant for line-length=100. Caught
by pre-commit on this branch.
---
.asf.yaml | 9 ++++++---
.github/workflows/release-validation.yml | 30 ++++++++++++++++++++++++++++++
burr/core/graph.py | 4 +---
3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/.asf.yaml b/.asf.yaml
index 1c342d43..344bbcf6 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -62,10 +62,13 @@ github:
required_status_checks:
# strict means "Require branches to be up to date before merging".
strict: false
- # contexts are the names of checks that must pass
+ # The Release Validation workflow ends in a single "summary" job that
+ # runs with if: always() and translates upstream SUCCESS or SKIPPED
+ # into a definite SUCCESS, FAILURE into FAILURE. That gives us one
+ # stable required check name regardless of whether the upstream jobs
+ # ran (real code PR) or were path-filtered out (docs/website PR).
contexts:
- - "Release Validation / build-artifacts"
- - "Release Validation / install-and-smoke (3.12)"
+ - "Release Validation / summary"
required_pull_request_reviews:
dismiss_stale_reviews: false
require_code_owner_reviews: false
diff --git a/.github/workflows/release-validation.yml b/.github/workflows/release-validation.yml
index 6271cd80..a1872db3 100644
--- a/.github/workflows/release-validation.yml
+++ b/.github/workflows/release-validation.yml
@@ -193,3 +193,33 @@ jobs:
path: /tmp/burr-smoke-*
retention-days: 7
if-no-files-found: ignore
+
+ # Single stable required-check name. Always runs (if: always()) so it produces
+ # a definite SUCCESS or FAILURE — never SKIPPED. Branch protection in
+ # .asf.yaml requires this context, not the underlying jobs, so path-filtered
+ # docs/website PRs (where the upstream jobs are skipped) still go green here.
+ summary:
+ name: "Release Validation / summary"
+ needs: [check-paths, build-artifacts, install-and-smoke]
+ if: always()
+ runs-on: ubuntu-latest
+ timeout-minutes: 2
+ steps:
+ - name: Verdict
+ env:
+ CHECK_PATHS: ${{ needs.check-paths.result }}
+ BUILD_ARTIFACTS: ${{ needs.build-artifacts.result }}
+ INSTALL_AND_SMOKE: ${{ needs.install-and-smoke.result }}
+ run: |
+ echo "check-paths: $CHECK_PATHS"
+ echo "build-artifacts: $BUILD_ARTIFACTS"
+ echo "install-and-smoke: $INSTALL_AND_SMOKE"
+ # Pass if every needed job is success or skipped; fail if any
+ # failed or was cancelled.
+ for r in "$CHECK_PATHS" "$BUILD_ARTIFACTS" "$INSTALL_AND_SMOKE"; do
+ case "$r" in
+ success|skipped) ;;
+ *) echo "::error::Release Validation failed (one or more jobs not success/skipped)"; exit 1 ;;
+ esac
+ done
+ echo "Release Validation: all upstream jobs success or skipped."
diff --git a/burr/core/graph.py b/burr/core/graph.py
index b31e1cab..c5c4dfaa 100644
--- a/burr/core/graph.py
+++ b/burr/core/graph.py
@@ -107,9 +107,7 @@ def _render_graphviz(
graphviz_obj.render(path_without_suffix, format=fmt, view=view)
else:
# `.pipe()` doesn't append the format to the filename, so we do it explicitly
- pathlib.Path(f"{path_without_suffix}.{fmt}").write_bytes(
- graphviz_obj.pipe(format=fmt)
- )
+ pathlib.Path(f"{path_without_suffix}.{fmt}").write_bytes(graphviz_obj.pipe(format=fmt))
@dataclasses.dataclass