Planning Package Updates

Before each release of E3SM-Unified, the Infrastructure Team works with the broader E3SM community to decide which packages and versions should be included. This planning stage helps ensure compatibility across tools and supports evolving analysis and diagnostic workflows.

Note: Access to Confluence and Slack is limited to E3SM/BER collaborators.


Where Planning Happens

  • Confluence Discussion Page: Most planning takes place on the “Next Version” page in the internal E3SM Documentation space. For those with access, use this link

  • GitHub Issues/PRs: Occasionally, suggestions or discussions take place in issues or pull requests on the E3SM-Unified GitHub repository. This is the main avenue for community members without access to E3SM’s Confluence pages.

  • Slack (#e3sm-help-postproc): For quick suggestions or discussion prompts for those with access to E3SM’s or BER’s Slack spaces.


Types of Updates

✅ New Packages

  • Tools that have become important to E3SM workflows

  • Visualization, diagnostics, or file conversion utilities

⬆️ Version Updates

  • Upgrading packages already in the environment to more recent releases

  • Ensuring compatibility with latest E3SM output formats or Python versions

❌ Package Removal

  • Rare, but sometimes necessary for deprecated tools or packages no longer maintained


Making Suggestions

The best way to suggest a package or version change:

  1. Edit the Confluence table for the upcoming version (if you have access)

  2. If not, open an issue on GitHub with your suggestion and rationale

  3. Optional: Tag maintainers or post on Slack to coordinate

When requesting a new package, please include:

  • Package name and version

  • Maintainer or expert point of contact (if known)

  • Why it’s useful for E3SM workflows


Final Selection

The final list of packages is curated by the Infrastructure Team based on:

  • Compatibility

  • Stability of upstream packages

  • Success in testing

  • Community need and usage patterns

Once the list is mostly settled, the team begins creating release candidates using the Creating Release Candidates workflow.


📦 Managing Version Pins During Conda-Forge Migrations

E3SM-Unified often needs to coordinate with conda-forge’s centralized version pinning. Many packages used by E3SM-Unified are governed by global pins (exact required versions) in:

🔀 What Happens During a Migration?

Conda-forge frequently upgrades pinned versions of core libraries (e.g., hdf5, libnetcdf, proj) via version migrations. These are tracked under:

For example, the migration to hdf5 1.14.6 is described here:

⚠ Why This Matters

If your dependencies are built against different versions of a migrating library, you can end up with incompatible binary builds that silently fail or break at runtime — especially with low-level C/C++ or Fortran dependencies.

🧠 How to Handle It

During planning, for any core dependency that is pinned:

  1. Check if it’s listed in a migration YAML file.

  2. Determine how far the migration has progressed on the conda-forge status page:

    • If all of E3SM-Unified’s dependencies have adopted the new version, use it.

    • If none have, stick with the current version in conda_build_config.yaml.

    • If some have and some haven’t: ➔ You must freeze to the old version and manually rebuild any migrated packages against that version (typically merging to a branch on the conda-forge feedstock other than main).

Note: Some packages in E3SM-Unified directly depend on pinned libraries like hdf5 or libnetcdf — that is, these pinned packages are dependencies of E3SM-Unified’s dependencies.

If E3SM-Unified requires an older version of such a package (e.g., nco or moab), and that version has only been built on conda-forge with an older version of the pinned library, you may encounter compatibility issues during the build.

In these cases, it is often easier to upgrade the E3SM-Unified dependency to a newer version that was built against the newer pinned library — as long as that version is still compatible with the rest of the environment. This avoids the complexity of manually rebuilding older versions with newer core libraries.

🌀 Multiple Migrations

When multiple overlapping migrations are in progress (e.g., hdf5, libnetcdf), assess each separately but prioritize compatibility. This is often one of the trickiest parts of managing an E3SM-Unified release candidate.

📦 E3SM-Unified Dependencies Affected by Conda-Forge Pins

The ones in bold are those where we provide pins of our own and special care must be taken. The rest either are unconstrained in E3SM-Unified or use version constraints without strict pins (i.e., >= or < rather than an exact version), so less care is required.

  • ffmpeg

  • hdf5

  • libnetcdf

  • numpy

  • proj

  • python

  • scipy

This list may evolve from release to release as new packages are added or pinned more strictly.


🔄 Other Places That Require Updates

In addition to updating versions in meta.yaml and the conda-forge feedstocks, the following deployment-related files should also be kept in sync:

📦 e3sm_supported_machines/default.cfg

This file specifies the versions of key packages (both Spack-built and Conda-installed) used during deployment.

Best Practice: Package versions listed in default.cfg should typically match the versions in recipes/e3sm-unified/meta.yaml, unless there’s a clear technical reason to diverge (e.g., system module incompatibilities or build issues with a newer version).

ESMPy: We have found that ESMPy build with system compilers is not compatible with xesmf, which is used by xcdat and e3sm_diags. As a results, the current best practice is to set esmpy = None in default.cfg.

Maintainers should update these entries as part of planning and testing a new release candidate.

🛠️ e3sm_supported_machines/shared.py

The version of E3SM-Unified being deployed is hard-coded here:

parser.add_argument("--version", dest="version", default="1.11.1",
                    help="The version of E3SM-Unified to deploy")

This value should be updated manually for each new release candidate and final release to reflect the current version being tested or deployed.

🧩 Note: We plan to automate this step in the future, but for now it must be updated manually.