Skip to content

tests.yml: set group env via shell: bash so GROUP propagates on Windows#100

Draft
ChrisRackauckas-Claude wants to merge 1 commit into
SciML:masterfrom
ChrisRackauckas-Claude:fix-windows-group-env-shell-bash
Draft

tests.yml: set group env via shell: bash so GROUP propagates on Windows#100
ChrisRackauckas-Claude wants to merge 1 commit into
SciML:masterfrom
ChrisRackauckas-Claude:fix-windows-group-env-shell-bash

Conversation

@ChrisRackauckas-Claude

Copy link
Copy Markdown

Problem

The Set test group env step in tests.yml writes <group-env-name>=<group> to $GITHUB_ENV using bash $VAR syntax but declares no shell:. On windows runners the default shell is PowerShell, which does not expand "$GITHUB_ENV" the bash way — it writes to a file literally named $GITHUB_ENV rather than appending to the runner environment file. Result: the group env var (e.g. GROUP) is silently never set on Windows.

With GROUP unset, a package's runtests.jl falls back to its default group (SciMLTesting's run_tests() defaults to "All"). So a matrix entry scheduled as Core on windows-latest actually ran every group folder, including groups that carry their own test/<Group>/Project.toml (e.g. an AD group depending on SciMLSensitivity) — inside the main test environment. Activating that second project mid-session upgrades already-loaded packages and triggers precompile conflicts.

Observed in SciML/DiffEqCallbacks.jl

tests / Core (julia 1|lts, windows-latest) failed with:

invalid method definition in OrdinaryDiffEqCorePolyesterExt: exported function OrdinaryDiffEqCore._polyester_batch does not exist

because the Core job leaked into the AD group (Activating project at ...\test\AD, OrdinaryDiffEqCore v4.3.0 [loaded: v3.33.1]) and using SciMLSensitivity failed to precompile against the stale loaded OrdinaryDiffEqCore. Linux/macOS Core jobs (bash default) ran only the Core folder and passed.

Fix

Add shell: bash to the Set test group env step so $GITHUB_ENV expands on every OS and the group is set correctly on Windows. This is the same shell the adjacent GITHUB_ENV/GITHUB_OUTPUT steps already use.

downgrade.yml is unaffected: it sets GROUP via the runtest step's env: map (shell-independent).

This fixes Windows grouped-tests for every SciML repo that uses grouped-tests.yml/tests.yml, not just DiffEqCallbacks.jl. v1 will need to be retagged to this commit for callers pinned at @v1 to pick it up.

Please ignore until reviewed by @ChrisRackauckas

The "Set test group env" step writes `<group-env-name>=<group>` to
$GITHUB_ENV with bash syntax but declared no `shell:`, so it ran under the
windows runners' default shell (PowerShell). PowerShell does not expand the
bash-style "$GITHUB_ENV"; the step wrote to a file literally named
$GITHUB_ENV instead of appending to the runner's environment file, so the
group env var (e.g. GROUP) was silently never set on Windows.

With GROUP unset, a package's runtests.jl falls back to its default group
(SciMLTesting's run_tests defaults to "All"), so a matrix entry scheduled as
"Core" on windows-latest actually ran every group's folder -- including
groups with their own test/<Group>/Project.toml (e.g. an AD group pulling
SciMLSensitivity) -- inside the main test environment. That activated a second
project mid-session and upgraded already-loaded packages, producing precompile
conflicts (observed in DiffEqCallbacks.jl: OrdinaryDiffEqCorePolyesterExt
referencing OrdinaryDiffEqCore._polyester_batch against a stale loaded
OrdinaryDiffEqCore) and a windows-only red. Linux/macOS runners default to bash
and were unaffected.

Add `shell: bash` so $GITHUB_ENV expands on every OS and the group is set
correctly on Windows. downgrade.yml is unaffected (it sets GROUP via the step
`env:` map, which is shell-independent).

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisRackauckas added a commit to SciML/DiffEqCallbacks.jl that referenced this pull request Jun 26, 2026
…; Windows fixed via SciML/.github#100 (#318)

* Fix docs Euler import (OrdinaryDiffEq v7 split) and raise OrdinaryDiffEqBDF downgrade floor

Two master-CI failures, two independent fixes:

Documentation build (UndefVarError: `Euler` not defined): OrdinaryDiffEq
v7 split out the low-order RK solvers and no longer re-exports `Euler`
from the umbrella (verified: with OrdinaryDiffEq v7.0.1,
isdefined(OrdinaryDiffEq, :Euler) == false; `Euler` now lives in
OrdinaryDiffEqLowOrderRK). The docs examples in integrating.md and
uncertainty_quantification.md call `Euler()` with only `using
OrdinaryDiffEq`, so the @example blocks errored. Add
OrdinaryDiffEqLowOrderRK to docs/Project.toml and `using` it in both
pages. Higher-order solvers (Tsit5, Rodas5P, Rosenbrock23, Vern7) are
still re-exported by the umbrella and need no change.

Downgrade (Core) (MethodError: no method matching _initialize_dae! for
the NonlinearSolve-backed BrownFullBasicInit in saving_tests.jl's "fail
gracefully" DAE test): the `_initialize_dae!(..., BrownFullBasicInit{...,
GeneralizedFirstOrderAlgorithm})` dispatch is implemented in
OrdinaryDiffEqBDF and first appears in v1.7.0. The previous compat floor
"1.3.0" let the downgrade resolve OrdinaryDiffEqBDF v1.3.0, which lacks
the method, so the test errored instead of returning
ReturnCode.InitialFailure. Bisected locally on Julia 1.10: BDF 1.6.0
errors, BDF 1.7.0 passes; raise the floor to 1.7.0 (a lower-bound raise
is downgrade-safe and the repo already allows BDF v2). Verified locally
on Julia 1.10 that the fail-gracefully test returns InitialFailure with
the bumped floor, and on Julia 1.12 that the integrating.md example runs
with the docs env.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Raise DiffEqBase downgrade floor to 6.211.0 (fixes Downgrade Core)

The strict Downgrade (Core) job still failed after the OrdinaryDiffEqBDF
floor bump: the "fail gracefully" DAE test in saving_tests.jl errored with a
MethodError for _initialize_dae!(..., BrownFullBasicInit{..., GeneralizedFirstOrderAlgorithm}, ::Val{false}) even with OrdinaryDiffEqBDF
v1.8.0 resolved -- so the BDF floor was not the real cause.

Root cause (reproduced locally on Julia 1.10 with the CI-resolved downgrade
stack): DiffEqBase v6.190.2's DiffEqBaseChainRulesCoreExt defines
ChainRulesCore.rrule(::typeof(numargs), f), and SciMLBase v2.146.0's
SciMLBaseChainRulesCoreExt defines the same rrule for SciMLBase.numargs. With
both floors resolved together the duplicate definition raises "Method
overwriting is not permitted during Module precompilation" while loading
DiffEqBaseChainRulesCoreExt, which fails the extension and cascades so the
OrdinaryDiffEqNonlinearSolve _initialize_dae! methods for BrownFullBasicInit
are never available -- hence the MethodError (the listed candidates were only
the OrdinaryDiffEqCore CheckInit/OverrideInit/NoInit methods).

DiffEqBase removed rrule(numargs) from its ext in v6.211.0 (verified: present
in 6.210.0, absent from 6.211.0; SciMLBase owns it now). Raising the floor to
6.211.0 drops the version range that double-defines it; SciMLBase 2.146.0 still
provides the rrule, so nothing is lost. A lower-bound raise is downgrade-safe.

Verified locally on Julia 1.10: with DiffEqBase pinned to 6.211.0 against the
CI downgrade stack (SciMLBase 2.146.0, OrdinaryDiffEqBDF 1.8.0,
OrdinaryDiffEqNonlinearSolve 1.12.0, NonlinearSolveFirstOrder 1.9.0) the stack
precompiles with no method-overwriting error and the "fail gracefully"
testset passes 4/4 (sol.retcode == ReturnCode.InitialFailure).

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test_groups: exclude AD and QA from the "All" aggregate (in_all=false)

The AD group (SciMLSensitivity/Zygote/Enzyme) was folded into "All", so the
secondary-OS/aggregate legs globbed test/AD/ and failed on windows-latest
(Enzyme is unreliable off Linux): AD/integrating_sensitivity_tests.jl errored,
sinking the Core (windows) job. Mark [AD] in_all=false so it runs only as its
own Linux, non-prerelease group; mark [QA] in_all=false explicitly (QA is always
its own lane). All coverage is preserved — AD/QA still run as named groups.

Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: ChrisRackauckas-Claude <accounts@chrisrackauckas.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

2 participants