Skip to content

GitHub Actions CI: CPU compilers with ECT validation - #1524

Open
cenamiller wants to merge 10 commits into
MPAS-Dev:developfrom
NCAR:feature/ci-cpu-testing
Open

cenamiller wants to merge 10 commits into
MPAS-Dev:developfrom
NCAR:feature/ci-cpu-testing

Conversation

@cenamiller

Copy link
Copy Markdown

Replaces #1469 (closed prematurely).

This PR adds some initial GitHub Actions continuous integration (CI) for MPAS-A. These workflows do automated build and correctness testing for Intel OneAPI, NVHPC, and GNU compilers on CPU.

This is a subset of the testing that's been developed on the github.com/NCAR/MPAS-Model-CI fork.

The goal of this testing is to catch build issues and validate that the model output remains within the bounds of internal variability using the Ensemble Consistency Test (ECT/PyCECT; Price-Broncucia et al. 2025, doi:10.5194/gmd-18-2349-2025).

These workflows:

  • Build MPAS-A in double precision with SMIOL I/O inside NCAR hpcdev Docker containers on GitHub-hosted runners. (PIO testing is available on the MPAS-Model-CI fork and will be included in future PRs)
  • Test three compiler families (GNU, Intel OneAPI, NVHPC) with MPICH. (OpenMPI testing is available on the MPAS-Model-CI fork and will be included in future PRs)
  • Run on new PRs against develop (or when someone pushes a new commit to an open PR) and on push to master. Only the GNU + MPICH test also runs on push to develop.
  • Validate correctness by running 3 perturbed ensemble members and comparing against a previously generated 200-member PyCECT ensemble summary

README CI status badges are not included and can be added as a future feature.

Test case data and ECT ensemble summaries are still hosted as GitHub release assets on NCAR/MPAS-Model-CI. The DATA_REPOSITORY variable in .github/ci-config.env controls where data is downloaded from.

File descriptions:

  • .github/ci-config.env — central CI configuration
  • .github/actions/ — 8 composite actions (build-mpas, download-testdata, resolve-container, run-perturb-mpas, validate-ect, mpas-version, print-mpas-logs, ect-summary)
  • .github/workflows/_test-compiler.yml — reusable CPU build + ECT validation workflow
  • .github/workflows/test-{gcc,intel,nvhpc}-mpich.yml — 3 caller workflows
  • .github/data/ect_excluded_vars.txt — ECT variable exclusion list

Developed in NCAR/MPAS-Model-CI. Claude assistance.

cenamiller and others added 10 commits September 11, 2026 15:26
Add the GitHub Actions CI infrastructure for
MPAS-Atmosphere CPU testing. This includes:

- ci-config.env: central configuration for container
  images, compiler mappings, MPI flags, test data release
  tags, and ECT parameters. Test data is hosted on
  NCAR/MPAS-Model-CI GitHub releases.
- Composite actions for building MPAS (build-mpas),
  downloading test data archives (download-testdata),
  resolving container images (resolve-container), running
  MPAS (run-mpas), running perturbed ensemble members for
  ECT (run-perturb-mpas), validating with PyCECT
  (validate-ect), extracting the MPAS version from
  Registry.xml (mpas-version), printing per-rank log files
  (print-mpas-logs), and generating consolidated ECT
  summary tables (ect-summary).
- ECT variable exclusion list.

Developed in NCAR/MPAS-Model-CI. Cursor assistance.
Add GitHub Actions workflows that build MPAS-Atmosphere
and validate correctness using the Ensemble Consistency
Test (PyCECT) across three compiler families and two MPI
implementations:

- _test-compiler.yml: reusable workflow (build ->
  3 perturbed ensemble members in parallel -> PyCECT
  validation -> artifact cleanup)
- Per-compiler callers: GCC+MPICH, GCC+OpenMPI,
  Intel+MPICH, Intel+OpenMPI, NVHPC+MPICH, NVHPC+OpenMPI

All callers run automatically on push/PR to master,
develop, and feature/ci-cpu-testing.

All builds run on GitHub-hosted ubuntu-latest runners
inside NCAR hpcdev Docker containers. Test data and ECT
ensemble summaries are downloaded from NCAR/MPAS-Model-CI
GitHub releases.

ECT reference: Price-Broncucia et al. (2025),
doi:10.5194/gmd-18-2349-2025

Developed in NCAR/MPAS-Model-CI. Cursor assistance.
Add a CI Status section to the top of README.md showing
ECT validation badges for all six compiler+MPI
combinations (GCC, Intel, NVHPC x MPICH, OpenMPI).
Badges link to the GitHub Actions workflow runs.

Cursor assistance.
Prevent GITHUB_TOKEN from persisting in .git/config
after checkout. Only the build job's checkouts had this
set; add it to config, ect-run, and ect-validate jobs.

Cursor assistance.
Move actions:write from workflow-level to the cleanup
job, which is the only job that needs it (for deleting
temporary artifacts). Other jobs now run with only
contents:read.

Cursor assistance.
Pin all GitHub Actions (checkout, upload-artifact,
download-artifact, cache, setup-python) to full commit
SHAs instead of mutable version tags.

Pin PyCECT clone to a verified commit SHA (3.3.1 tag)
and add a commit verification check in validate-ect.

Cursor assistance.
Derive ECT release tags from the MPAS major/minor version so compatible patch releases use the same ensemble summary and spin-up restart.

Assisted-by: Claude
Resolve ECT versions from the source under test, fail when required artifacts or restart data are missing, and retain failed ECT summaries.

Guard optional container setup, verify NVHPC Makefile edits, and remove the unused run-mpas action.

Assisted-by: Claude
@cenamiller

Copy link
Copy Markdown
Author

Depending on what science changes have been merged into develop at the same time, we shouldn't expect the ect to pass until I generate a new summary file. But let's see!

@mgduda

mgduda commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

@cenamiller Thanks for this new PR!

@mgduda
mgduda requested review from abishekg7 and mgduda October 5, 2026 22:04
@mgduda mgduda added Atmosphere CI only Changes only affect CI, not the code or documentation labels Oct 5, 2026
@mgduda

mgduda commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

@cenamiller @abishekg7 Following up on the comments from PR #1469 (which this PR replaces), I agree with most of them, and I'm fine with addressing some of them (e.g., adding build tests for the init_atmosphere core, and adding a CMake build test) with a future PR.

Is it the case as of now that all of the tests will run with every push to a PR branch?

@abishekg7

Copy link
Copy Markdown
Collaborator

@cenamiller @abishekg7 Following up on the comments from PR #1469 (which this PR replaces), I agree with most of them, and I'm fine with addressing some of them (e.g., adding build tests for the init_atmosphere core, and adding a CMake build test) with a future PR.

Is it the case as of now that all of the tests will run with every push to a PR branch?

It is now a pared down set of tests, but yes, they will be triggered with every push to a PR branch.

@cenamiller

Copy link
Copy Markdown
Author

Hi, yes, agreed with Abishek. I've been thinking about this. It may be nice to have the "runs on every push to a PR" branch feature for a bit, because it makes it easier to trigger tests on old PRs, with just a push. Otherwise, contributors would need to close/reopen the PR in order to trigger tests. But once we've run them on some old PRs, we can very easily turn that trigger off. And anyway, if the tests make it to the default branch, you'll be able to manually dispatch tests when you think it's appropriate and we won't be so beholden to an automatic trigger.

@mgduda

mgduda commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

@cenamiller @abishekg7 What do you all think about (1) removing the ECT tests from this PR, and (2) adding build tests for the init_atmosphere core to this PR? My thinking is that build tests for both the init_atmosphere and atmosphere cores are probably of greatest value right now, and omitting the ECT tests would help to reduce the amount of time all of the checks will typically take to complete.

@cenamiller

Copy link
Copy Markdown
Author

@mgduda Yes, we can do that! It won't take very long to set up, but I don't have those tests ready as stand-alones. I can submit them before lunch tomorrow though. Would you like them to run on the same triggers as these? And which compilers for each? The options for 'just build' would be GNU, Intel OneAPI, NVHPC (for CPU) and NVHPC+OpenACC. And for sides we have PIO/SMIOL and MPICH/OpenMPI.

@mgduda

mgduda commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

@mgduda Yes, we can do that! It won't take very long to set up, but I don't have those tests ready as stand-alones. I can submit them before lunch tomorrow though. Would you like them to run on the same triggers as these? And which compilers for each? The options for 'just build' would be GNU, Intel OneAPI, NVHPC (for CPU) and NVHPC+OpenACC. And for sides we have PIO/SMIOL and MPICH/OpenMPI.

In the interest of keeping everything as simple as possible for now, would it be reasonable to add an extra step to the build workflows to compile the init_atmosphere core before or after we compile the atmosphere core? When building a second core within an MPAS-Model source tree that already has another core (along with the shared infrastructure) compiled, the incremental cost of building the second core is not so bad. Going this route would suggest we use the same build matrix as for the atmosphere core: GNU+MPICH for Intel oneAPI, NVHPC, and GNU.

@abishekg7

Copy link
Copy Markdown
Collaborator

I think keeping the existing build matrix and triggers, and just adding the build of init_atmosphere core as a step sounds good. Perhaps init_atmosphere core can be built before the build of atmosphere?

@mgduda

mgduda commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

I think keeping the existing build matrix and triggers, and just adding the build of init_atmosphere core as a step sounds good. Perhaps init_atmosphere core can be built before the build of atmosphere?

Adding a build of the init_atmosphere core before the build of the atmosphere core sounds fine to me. (Perhaps it's over-optimizing, but my suspicion is that more code is changed in the atmosphere core than in the init_atmosphere core, so building the atmosphere core first may help us to catch build errors introduced by a PR a bit sooner. Ultimately, though, the time savings either way may not be significant enough to influence our decision on which core to build first.)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Atmosphere CI only Changes only affect CI, not the code or documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants