From 9d16a15e19a77eee83f04f3ee8628dd5aba55705 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Tue, 9 Jun 2026 17:57:43 -0400 Subject: [PATCH 1/4] Canonical CI: grouped-tests.yml + root test/test_groups.toml Convert the root Tests.yml matrix test job into a thin caller of the canonical SciML/.github grouped-tests.yml@v1 reusable workflow, with the group x version (x os) matrix declared once in test/test_groups.toml. - Tests.yml: replace the 3-version x 3-OS matrix job with the thin grouped-tests.yml@v1 caller (on: + concurrency: preserved verbatim). - test/test_groups.toml: [Core] on [lts, 1, pre] x [ubuntu, macos, windows] (reproduces the old functional matrix); [QA] on [lts, 1]. - Category B refactor: Aqua had been running inline under GROUP Core/All. Move Aqua (and the previously-unwired JET checks) into an isolated QA group gated on GROUP=="QA", with test/qa/Project.toml (Aqua + JET + Test, package via [sources] path="../..", julia 1.10) and test/qa/qa.jl. runtests.jl now activates test/qa for GROUP=="QA". - Functional basictests.jl stays under GROUP Core/All. - Remove the old test/qa.jl (Aqua) and test/jet/ (JET now in QA env). GPU.yml, Downstream.yml, Downgrade.yml, Documentation.yml and the other workflows are left untouched. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/Tests.yml | 17 +---------------- test/jet/Project.toml | 6 ------ test/qa.jl | 14 -------------- test/qa/Project.toml | 14 ++++++++++++++ test/{jet/jet.jl => qa/qa.jl} | 19 +++++++++++++++---- test/runtests.jl | 23 ++++++++--------------- test/test_groups.toml | 14 ++++++++++++++ 7 files changed, 52 insertions(+), 55 deletions(-) delete mode 100644 test/jet/Project.toml delete mode 100644 test/qa.jl create mode 100644 test/qa/Project.toml rename test/{jet/jet.jl => qa/qa.jl} (68%) create mode 100644 test/test_groups.toml diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 554dc120..93eca998 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -18,20 +18,5 @@ concurrency: jobs: tests: - name: "Tests" - strategy: - fail-fast: false - matrix: - version: - - "1" - - "lts" - - "pre" - os: - - "ubuntu-latest" - - "macos-latest" - - "windows-latest" - uses: "SciML/.github/.github/workflows/tests.yml@v1" - with: - julia-version: "${{ matrix.version }}" - os: "${{ matrix.os }}" + uses: "SciML/.github/.github/workflows/grouped-tests.yml@v1" secrets: "inherit" diff --git a/test/jet/Project.toml b/test/jet/Project.toml deleted file mode 100644 index 0cf8f6e9..00000000 --- a/test/jet/Project.toml +++ /dev/null @@ -1,6 +0,0 @@ -[deps] -JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[compat] -JET = "0.9, 0.10, 0.11" diff --git a/test/qa.jl b/test/qa.jl deleted file mode 100644 index cfa2c442..00000000 --- a/test/qa.jl +++ /dev/null @@ -1,14 +0,0 @@ -using ExponentialUtilities, Aqua -@testset "Aqua" begin - Aqua.find_persistent_tasks_deps(ExponentialUtilities) - Aqua.test_ambiguities(ExponentialUtilities, recursive = false) - Aqua.test_deps_compat( - ExponentialUtilities, - ignore = [:libblastrampoline_jll] - ) - Aqua.test_piracies(ExponentialUtilities) - Aqua.test_project_extras(ExponentialUtilities) - Aqua.test_stale_deps(ExponentialUtilities) - Aqua.test_unbound_args(ExponentialUtilities) - Aqua.test_undefined_exports(ExponentialUtilities) -end diff --git a/test/qa/Project.toml b/test/qa/Project.toml new file mode 100644 index 00000000..089f2ba6 --- /dev/null +++ b/test/qa/Project.toml @@ -0,0 +1,14 @@ +[deps] +Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" +ExponentialUtilities = "d4d017d3-3776-5f7e-afef-a10c40355c18" +JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[sources] +ExponentialUtilities = {path = "../.."} + +[compat] +Aqua = "0.8" +JET = "0.9, 0.10, 0.11" +Test = "1" +julia = "1.10" diff --git a/test/jet/jet.jl b/test/qa/qa.jl similarity index 68% rename from test/jet/jet.jl rename to test/qa/qa.jl index fcc3a428..dcc58f5c 100644 --- a/test/jet/jet.jl +++ b/test/qa/qa.jl @@ -1,9 +1,20 @@ -using ExponentialUtilities, JET, Test +using ExponentialUtilities, Aqua, JET, Test + +@testset "Aqua" begin + Aqua.find_persistent_tasks_deps(ExponentialUtilities) + Aqua.test_ambiguities(ExponentialUtilities, recursive = false) + Aqua.test_deps_compat( + ExponentialUtilities, + ignore = [:libblastrampoline_jll] + ) + Aqua.test_piracies(ExponentialUtilities) + Aqua.test_project_extras(ExponentialUtilities) + Aqua.test_stale_deps(ExponentialUtilities) + Aqua.test_unbound_args(ExponentialUtilities) + Aqua.test_undefined_exports(ExponentialUtilities) +end @testset "JET static analysis" begin - # Test key entry points for type stability and correctness - # Using report_call to check for runtime errors - @testset "expv" begin rep = JET.report_call(expv, (Float64, Matrix{Float64}, Vector{Float64})) @test length(JET.get_reports(rep)) == 0 diff --git a/test/runtests.jl b/test/runtests.jl index 68fc7ea6..41b07ad1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -4,31 +4,24 @@ const LONGER_TESTS = false const GROUP = get(ENV, "GROUP", "All") -function activate_gpu_env() - Pkg.activate("gpu") - Pkg.develop(PackageSpec(path = dirname(@__DIR__))) - return Pkg.instantiate() -end - -function activate_jet_env() - Pkg.activate("jet") +function activate_env(name) + Pkg.activate(name) Pkg.develop(PackageSpec(path = dirname(@__DIR__))) return Pkg.instantiate() end @time begin if GROUP == "All" || GROUP == "Core" - @time @safetestset "Quality Assurance" include("qa.jl") @time @safetestset "Basic Tests" include("basictests.jl") end - if GROUP == "GPU" - activate_gpu_env() - @time @safetestset "GPU Tests" include("gpu/gputests.jl") + if GROUP == "QA" + activate_env("qa") + @time @safetestset "Quality Assurance" include("qa/qa.jl") end - if GROUP == "JET" - activate_jet_env() - @time @safetestset "JET Tests" include("jet/jet.jl") + if GROUP == "GPU" + activate_env("gpu") + @time @safetestset "GPU Tests" include("gpu/gputests.jl") end end diff --git a/test/test_groups.toml b/test/test_groups.toml new file mode 100644 index 00000000..318909b1 --- /dev/null +++ b/test/test_groups.toml @@ -0,0 +1,14 @@ +# Test-group matrix for ExponentialUtilities (consumed by the reusable +# SciML/.github grouped-tests.yml@v1 workflow via +# scripts/compute_affected_sublibraries.jl --root-matrix). +# +# Core runs the functional suite (basictests.jl) on every Julia version and OS. +# QA runs the metadata/static-analysis checks (Aqua + JET) in the isolated +# test/qa environment. + +[Core] +versions = ["lts", "1", "pre"] +os = ["ubuntu-latest", "macos-latest", "windows-latest"] + +[QA] +versions = ["lts", "1"] From 805c9d872e8436b87f4aab5bb7424ff5dd57741f Mon Sep 17 00:00:00 2001 From: "Chris Rackauckas (Claude)" Date: Wed, 10 Jun 2026 05:21:50 -0400 Subject: [PATCH 2/4] Restore dropped GPU test group in test_groups.toml The grouped-tests test_groups.toml only listed Core and QA, but test/runtests.jl dispatches on GROUP == "GPU" and the pre-conversion CI ran a separate GPU.yml job (GROUP: "GPU") on a self-hosted GPU runner. As a result the GPU functional group never ran under the new grouped-tests CI. Re-add it as its own group matching the old GPU.yml: self-hosted Linux/X64/gpu runner, 60-minute timeout, Julia "1". Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- test/test_groups.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/test_groups.toml b/test/test_groups.toml index 318909b1..97ac5aed 100644 --- a/test/test_groups.toml +++ b/test/test_groups.toml @@ -5,6 +5,8 @@ # Core runs the functional suite (basictests.jl) on every Julia version and OS. # QA runs the metadata/static-analysis checks (Aqua + JET) in the isolated # test/qa environment. +# GPU runs the CUDA tests in the isolated test/gpu environment on a self-hosted +# GPU runner (matching the pre-conversion GPU.yml workflow). [Core] versions = ["lts", "1", "pre"] @@ -12,3 +14,8 @@ os = ["ubuntu-latest", "macos-latest", "windows-latest"] [QA] versions = ["lts", "1"] + +[GPU] +versions = ["1"] +runner = ["self-hosted", "Linux", "X64", "gpu"] +timeout = 60 From 93c032efa1a668faffa3fde7b759bf43220afc20 Mon Sep 17 00:00:00 2001 From: "Chris Rackauckas (Claude)" Date: Wed, 10 Jun 2026 06:27:19 -0400 Subject: [PATCH 3/4] Remove redundant GPU.yml and restore Intel-mac Core coverage The GPU group in test/test_groups.toml supersedes the standalone GPU.yml workflow; keeping both ran the GPU tests twice on the same self-hosted runner. Also add macOS-15-intel to the Core os list, which the conversion's os array had dropped from the old matrix. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/GPU.yml | 38 -------------------------------------- test/test_groups.toml | 2 +- 2 files changed, 1 insertion(+), 39 deletions(-) delete mode 100644 .github/workflows/GPU.yml diff --git a/.github/workflows/GPU.yml b/.github/workflows/GPU.yml deleted file mode 100644 index 027f1502..00000000 --- a/.github/workflows/GPU.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "GPU Tests" - -on: - pull_request: - branches: - - master - paths-ignore: - - 'docs/**' - push: - branches: - - master - paths-ignore: - - 'docs/**' - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: ${{ github.ref_name != github.event.repository.default_branch || github.ref != 'refs/tags/v*' }} - -jobs: - gpu-tests: - name: "GPU Tests" - runs-on: [self-hosted, Linux, X64, gpu] - timeout-minutes: 60 - steps: - - uses: actions/checkout@v6 - - uses: julia-actions/setup-julia@v3 - with: - version: "1" - - uses: julia-actions/julia-buildpkg@v1 - - uses: julia-actions/julia-runtest@v1 - env: - GROUP: "GPU" - - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v6 - with: - files: lcov.info - token: ${{ secrets.CODECOV_TOKEN }} - fail_ci_if_error: false diff --git a/test/test_groups.toml b/test/test_groups.toml index 97ac5aed..9fbb711a 100644 --- a/test/test_groups.toml +++ b/test/test_groups.toml @@ -10,7 +10,7 @@ [Core] versions = ["lts", "1", "pre"] -os = ["ubuntu-latest", "macos-latest", "windows-latest"] +os = ["ubuntu-latest", "macos-latest", "windows-latest", "macOS-15-intel"] [QA] versions = ["lts", "1"] From de53908dba5ccc954d35e6c7819063ee8ec4700a Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Sun, 14 Jun 2026 19:53:14 -0400 Subject: [PATCH 4/4] Adopt SciMLTesting v1.2 folder-based run_tests (on top of grouped-tests conversion) Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.8 (1M context) --- Project.toml | 8 ++++---- test/gpu/Project.toml | 6 ++++++ test/qa/Project.toml | 4 ++++ test/runtests.jl | 28 ++-------------------------- 4 files changed, 16 insertions(+), 30 deletions(-) diff --git a/Project.toml b/Project.toml index 6016219a..0d115690 100644 --- a/Project.toml +++ b/Project.toml @@ -29,11 +29,11 @@ ForwardDiff = "0.10.13" GPUArraysCore = "0.1, 0.2" GenericSchur = "0.5.3" LinearAlgebra = "1.10" -Pkg = "1" PrecompileTools = "1" Printf = "1.10" Random = "1" -SafeTestsets = "0.1" +SafeTestsets = "0.1, 1" +SciMLTesting = "1" SparseArrays = "1.10" StaticArrays = "1.9.8" Test = "1" @@ -43,11 +43,11 @@ julia = "1.10" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" DoubleFloats = "497a8b3b-efae-58df-a0af-a86822472b78" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" -Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Aqua", "DoubleFloats", "ForwardDiff", "Pkg", "Test", "SafeTestsets", "StaticArrays", "Random"] +test = ["Aqua", "DoubleFloats", "ForwardDiff", "Test", "SafeTestsets", "SciMLTesting", "StaticArrays", "Random"] diff --git a/test/gpu/Project.toml b/test/gpu/Project.toml index 18ce094b..9e862ac0 100644 --- a/test/gpu/Project.toml +++ b/test/gpu/Project.toml @@ -1,5 +1,11 @@ [deps] CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" +SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [compat] CUDA = "3.12, 4, 5" +SafeTestsets = "0.1, 1" +SciMLTesting = "1" +Test = "1" diff --git a/test/qa/Project.toml b/test/qa/Project.toml index 089f2ba6..1eb4dc29 100644 --- a/test/qa/Project.toml +++ b/test/qa/Project.toml @@ -2,6 +2,8 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" ExponentialUtilities = "d4d017d3-3776-5f7e-afef-a10c40355c18" JET = "c3a54625-cd67-489e-a8e7-0a5a0ff4e31b" +SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [sources] @@ -10,5 +12,7 @@ ExponentialUtilities = {path = "../.."} [compat] Aqua = "0.8" JET = "0.9, 0.10, 0.11" +SafeTestsets = "0.1, 1" +SciMLTesting = "1" Test = "1" julia = "1.10" diff --git a/test/runtests.jl b/test/runtests.jl index 41b07ad1..80ba0993 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,27 +1,3 @@ -using Pkg -using SafeTestsets, Test -const LONGER_TESTS = false +using SciMLTesting -const GROUP = get(ENV, "GROUP", "All") - -function activate_env(name) - Pkg.activate(name) - Pkg.develop(PackageSpec(path = dirname(@__DIR__))) - return Pkg.instantiate() -end - -@time begin - if GROUP == "All" || GROUP == "Core" - @time @safetestset "Basic Tests" include("basictests.jl") - end - - if GROUP == "QA" - activate_env("qa") - @time @safetestset "Quality Assurance" include("qa/qa.jl") - end - - if GROUP == "GPU" - activate_env("gpu") - @time @safetestset "GPU Tests" include("gpu/gputests.jl") - end -end +run_tests()