The deployment area#

The deployment area is the directory tree that deploy-tools writes into. It is normally a shared filesystem location that end users put on their MODULEPATH, so its layout is important to the end user. This page explains what lives where, and why.

Layout#

Everything below is created and maintained by deploy-tools; nothing in the area is meant to be edited by hand.

<deployment root>/
├── deployment.yaml          # snapshot of the deployed configuration
├── modules/                 # Modules Area — the built files for every Module
│   └── <name>/<version>/
│       ├── modulefile        # the Environment Modules (Tcl) file
│       ├── entrypoints/      # the executables added to PATH on module load
│       ├── module.yaml       # this Module's configuration snapshot
│       └── sif_files/        # Apptainer images, when the Module uses any
├── modulefiles/             # Modulefiles Folder — placed on MODULEPATH
│   └── <name>/
│       ├── <version>         # absolute symlink into modules/<name>/<version>/modulefile
│       └── .version          # records the default version (see below)
├── deprecated/
│   └── modulefiles/         # Deprecated Folder — optionally on MODULEPATH
│       └── <name>/<version>  # symlink for a deprecated Module version
└── build/                   # transient build area (default location)

The split between the Modules Area (modules/) and the Modulefiles Folder (modulefiles/) is the central design choice. The Modules Area holds the real files for every version that has been deployed and not removed, both live and deprecated. The Modulefiles Folder holds only a thin tree of symlinks, one per version, pointing at the corresponding modulefile. Users put only the modulefiles directories on their MODULEPATH, making each Module visible to module avail and module load.

Deprecation is therefore cheap and reversible: the built files never move, only the symlink moves between modulefiles/ and deprecated/modulefiles/. See the release lifecycle for the full set of transitions.

The build area#

Modules are first assembled under the build area (build/ by default), then moved into the Modules Area. The move is a filesystem rename, which is atomic only when source and destination are on the same filesystem — hence the default build area sits inside the deployment root. Building and deploying separately means a half-built Module is never visible: either the rename succeeds and the whole version appears, or nothing changes.

The transient build/ directory and the large Apptainer sif_files/ images are deliberately kept out of the deployment area’s git history (see snapshots and the compare safety net). They are reference-only data used by the compare command, not something to revert to.

Why modulefiles embed absolute paths#

A generated modulefile adds its Module’s executables to the user’s path with one line:

prepend-path PATH "<deployment root>/modules/<name>/<version>/entrypoints"

That path is absolute, so a deployment area cannot be relocated after the fact. This is a deliberate trade-off.

A path relative to the modulefile does not work. Environment Modules sources the file through the symlink under modulefiles/ without resolving it first ([info script] / ModulesCurrentModulefile report the link path). A relative path would be interpreted relative to the link’s location — which changes when a Module is deprecated and the link moves to a different location in the tree, silently breaking it.

This allows us to use two separate modulefiles/ folders, corresponding to live and deprecated modules, without needing to edit modulefiles after initial creation.