Per-PR reverse-dependency gate against downstream codes#278
Open
krystophny wants to merge 6 commits into
Open
Conversation
krystophny
added a commit
that referenced
this pull request
May 29, 2026
The `build_test_golden_record_odeint` job on `main` was red. `fetch_golden_record.sh` read `src/odeint_allroutines.f90` from the latest tag, but odeint moved to `src/odeint/odeint_allroutines.f90` before v2026.04.13. The old top-level path is gone from the tag, so `git show "$LATEST_TAG:src/odeint_allroutines.f90"` produced an empty golden file and the regression comparison broke. This was the first `main.yml` run since the move surfaced it. One-line fix: read the post-move path. v2026.04.13 contains `src/odeint/odeint_allroutines.f90`, and the module names still match the script's seds, so the golden-record comparison keeps doing its job. Split out of #278 so it can merge first and unbreak `main` independently of the release-gate change. ## Verification Failing before, on `main` (golden file empty, comparison fails): ``` $ git show v2026.04.13:src/odeint_allroutines.f90 fatal: path 'src/odeint_allroutines.f90' does not exist in 'v2026.04.13' ``` Passing after (post-move path exists in the tag): ``` $ git show v2026.04.13:src/odeint/odeint_allroutines.f90 | head -1 !> High-Performance ODE Integration Module ``` The identical commit on #278 turned `build_test_golden_record_odeint` green (full CI: build+test, Sphinx docs, dashboard, Pages deploy). CI on this branch is running.
4ca6a7c to
9f170c3
Compare
5e21c1c to
b9dc9ca
Compare
On every libneo PR, dispatch each downstream's CI (ci/downstreams) to build and fast-test against the PR's libneo commit, and gate on green. Keeps main working with the downstreams and attributes breakage to the PR. Label the PR 'full-ci' to also run each downstream's slow suite (golden/performance/PAR) before merge. Needs RELEASE_BOT_TOKEN with actions:write on the downstreams.
b9dc9ca to
6a86833
Compare
This was referenced Jun 10, 2026
A downstream workflow without a workflow_dispatch trigger returns HTTP 422, which killed the entire gate mid-run. Guard the dispatch call so the failure is reported as a named ::error:: and the loop continues to the remaining repos. The gate still exits non-zero. Part of #293
…pt-out NEO-2 split its CI: unit-tests.yml is the always-on fast tier, the golden-record/performance/PAR suite stays on NEO-2's own PRs. Point the gate at unit-tests.yml and add a fourth 'full' column to ci/downstreams so full-ci only dispatches -f full=true to downstreams whose workflow accepts it. NEO-2 is full=no, so its fast workflow is never sent an input it does not declare.
Member
Author
|
Merge order: merge itpplasma/NEO-2#87 first, then this PR. The gate dispatches NEO-2's |
rabe's dispatchable workflow is test.yml, not ci.yml. blocking=no rows are now dispatched and their status reported as a warning instead of skipped, so a report-only downstream (NEO-RT) still runs against the candidate libneo without failing the gate.
The full column was a boolean assuming one shape (re-dispatch the single workflow with -f full=true). Generalize it: no = fast-only, yes = that self-escalating shape, or a comma-list of extra workflows to dispatch on full-ci. The gate factors dispatch+watch into run_wf and runs the list. rabe keeps its slow suite in its own golden.yml rather than a full tier in test.yml, so rabe is full=golden.yml. No downstream is forced into one CI shape.
Header described the old boolean full model; update it to the per-downstream convention and state the contract: add a downstream by appending one row to ci/downstreams, no workflow edit.
Member
Author
|
Made the gate per-downstream so each code keeps its own CI convention; no downstream is forced into one shape. What changed:
Modularity: Dispatch dry-run against the manifest (run_wf stubbed):
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces the release-branch gate with a per-PR reverse-dependency gate.
On every libneo PR, dispatch each downstream's CI to build and fast-test against this PR's libneo commit (
-f libneo_ref=<sha>), and gate the PR on green. This keeps libneomaincontinuously working with the downstream codes, and attributes any break to the PR that caused it..github/workflows/downstream-gate.yml: runs onpull_request(same-repo, non-draft). Dispatches, polls, and gates on each downstream's run.blocking=norows are dispatched and reported as a warning but never fail the gate.ci/downstreams: the gated set, withblockingandfullcolumns. NEO-RT is report-only (transitive through NEO-2; its own build does not yet compile the candidate libneo). NEO-2 isfull=no: it splits its CI, so the gate triggers only its fastunit-tests.ymland its slow suite stays on NEO-2 PRs.The dispatched runs use each downstream's fast tests. Label the libneo PR
full-cito also dispatch the slow suite (golden records, performance, PAR) of each downstream whosefullcolumn isyes, with-f full=true.Required secret
The gate authenticates as
secrets.RELEASE_BOT_TOKEN. The repo or org must define this secret as a fine-grained PAT or GitHub App installation token scoped to the six downstream repositories —itpplasma/SIMPLE,itpplasma/NEO-2,itpplasma/MEPHIT,itpplasma/KAMEL,itpplasma/NEO-RT,itpplasma/rabe— with these repository permissions:workflow_dispatchand read the resulting runs)The default
GITHUB_TOKENcannot dispatch workflows in other repositories, so this dedicated token is mandatory.Per-downstream dispatch workflows must land first
The gate dispatches each downstream's workflow on its default branch, so the
workflow_dispatchtrigger (with thelibneo_ref, and wherefull=yesthefull, input) must already be merged to that downstream's default branch before this gate can dispatch it. Merge each downstream's CI-wiring PR before merging this one:main.ymlmainunit-tests.ymlmain.ymlci.ymltest.ymlmaintest.ymlUntil a downstream's PR lands, its gate step fails to dispatch (for a
blocking=yesrow that turns the libneo PR red).Closes #293