FSL release management
This page describes release management procedures for the FMRIB Software Library (FSL). Release management procedures for individual projects within FSL are described separately.
FSL versioning scheme
FSL releases are given a version number containing three or four numbers, e.g. 6.0.6, 6.0.6.2 etc. Each of the numbers in this X.Y.Z[.W] scheme are referred to as follows:
X: Major versionY: Minor versionZ: Patch versionW: Hotfix version
Due to licensing restrictions, the major and minor versions are only changed when substantial scientific additions or changes are made to the FSL code base. So for many FSL versions, only the patch and hotfix versions are updated.
Semantically, the patch and hotfix version numbers are used as follows:
- The patch version is updated when substantial non-scientific additions or enhancements are made to the code base, or when major updates are made to the underlying dependencies of the FSL code base.
- The hotfix version is updated for releases involving minor changes and bugfixes.
FSL releases
FSL releases are managed at the fsl/conda/manifest repository.
The fsl-release.yml file contains a list of all FSL projects and version numbers which comprise a FSL installation. As new versions of individual FSL projects are released, the entries for those projects are updated in the fsl-release.yml file.
The fsl/conda/manifest repository contains two primary branches, main and external, and may periodically contain development/release-candidate branches. These branches are used to create three different types of FSL release:
- Public FSL releases (e.g. FSL 6.0.6) may be created from tags on the
externalbranch. - Development releases (development versions of public releases) may be created from commits on any branch.
- Internal FSL releases (for internal use only) may be created from commits on the
mainbranch
A new version of FSL can be released by creating a tag on the external branch of the fsl/conda/manifest repository. This will trigger a CI job which generates a manifest.json file, and a set of conda environment.yml files (one for each supported platform) from the information in the fsl-release.yml file. These are then published to the FSL release web page, and so will be available to the fslinstaller.py script.
Note that there are two types of manifest and environment file:
-
The official release manifest, containing information about past and present public FSL releases - this is always called
manifest.json, and is re-generated on new public releases -
Development manifests, containing information about one internal or development FSL release. Development manifests are generated for every internal or development release. Development manifests are named according to a standard convention described in the Internal/development FSL releases section, below.
Development manifest and environment files can be published from any branch, but the official release manifest can only be generated/published from tags.
The CI jobs for generating and publishing the manifest.json and environment.yml files comprising a FSL release are defined in the fsl/conda/manifest-rules repository.
fslinstaller.py and getfsl.sh release management
FSL is installed with a Python script called fslinstaller.py, and may optionally be installed via a shell script called getfsl.sh, which simply installs Python, and then runs fslinstaller.py.
The fslinstaller.py script is maintained at the fsl/conda/installer GitLab repository. A new version of the fslinstaller.py script can be released by running a CI / CD job at that repository called release-new-version. This job is only available on tags.
The
fslinstaller.pyscript is also published as a conda package, and installed as part of FSL. This is managed in the same way as other FSL conda packages - the conda recipe is at thefsl/conda/fsl-installerrepository.
The getfsl.sh script is maintained at the fsl/conda/manifest-rules repository. New versions of getfsl.sh can be released via the publish-getfsl-script CI / CD job on the fsl/conda/manifest repository.
FSL release management procedure
Summary:
- New public FSL release are created by adding a tag to the
externalbranch of thefsl/conda/manifestrepository. - The
publish-releasejob, on the CI pipeline for the new tag, must be manually started in order to publish the new release.
A new version of FSL is released like so:
-
A release candidate is prepared on a separate branch (see below).
-
The
fsl-release.ymlfile on theexternalbranch of thefsl/conda/manifestrepository is updated with versions of all packages that are to be included in the new release. -
A new tag is created on the
fsl/conda/manifestrepository; the tag must be the version number of the new FSL release, e.g.6.0.7. -
In response to the new tag, a series of jobs are automatically executed on the
fsl/conda/manifestrepository using GitLab CI / CD:a) A set of conda
environment.ymlfiles are generated, one for each supported platform/OS. These files are namedfsl-<tag>_<platform>.yml, e.g.fsl-6.0.7_macos-64.yml.b) A file called
manifest.jsonis generated - this file contains all of the metadata needed to install FSL on a target system - it is used by thefslinstaller.pyscript when FSL is installed. Themanifest.jsonfile contains information about all available FSL releases - it is re-generated every time a new version is released. A copy of this file calledmanifest-<tag>.jsonis also created, for archival/recovery purposes.c) After the environment and manifest files have been generated, a test installation of the new release on each supported platform is performed.
d) The
environment.ymlandmanifest.jsonfiles are published to the FSL release page. This step must be invoked manually, by starting thepublish-releaseCI job. -
The release changelog must be added to the FSL documentation as described below.
Release candidates
When preparing for a new FSL release or internal installation, it is recommended to publish a release candidate (RC) for testing and evaluation purposes. A release candidate can be published like so:
-
Create a release candidate (RC) branch starting from the
externalbranch of thefsl/conda/manifestrepository, e.g.rel/6.0.7. -
Merge changes from the
mainbranch into the RC branch. Resolve any conflicts that arise, making sure that internal-only FSL packages are not included in the package lists. A good idea is to compare your branch with themainbranch - usually the only difference should be that your branch does not contain any internal-only packages: -
Publish the
environment.ymlandmanifest.jsonfiles that are generated from that branch. Themanifest.jsonfile will be named and published asmanifest-<last-tag>.<YYYYMMDD>.<commit>.<branch>.json, e.g.manifest-6.0.6.3.20230325.5ab3fe2.rel-6-0-7.json -
Use the
fslinstaller.pyscript to install the release candidate, e.g.:wget https://fsl.fmrib.ox.ac.uk/fsldownloads/fslconda/releases/manifest-6.0.6.3.20230325.5ab3fe2.rel-6-0-7.json python fslinstaller.py --manifest manifest-6.0.6.3.20230325.5ab3fe2.rel-6-0-7.jsonOr use
conda/mambadirectly with the correspondingenvironment.ymlfiles, e.g.: -
Test the installation.
-
If any changes are required, make them via a separate MR into the
mainbranch with the changes. -
Repeat steps 2-6 as needed.
-
When you are happy with the RC, merge the release candidate branch into the
externalbranch, and tag the new release. -
Publish the
environment.ymlandmanifest.jsonfiles that are generated from the tag.
The process described above is used for the following reasons:
- All changes to the manifest should occur via the
mainbranch, to ensure that themainbranch is always ahead of, and in sync with, theexternalbranch.- The final state of the RC branch, before it is merged into
externalshould be in exactly the same state as (what will become) the tagged release; this is to ensure that the FSL release which undergoes testing is identical to that which is to be released.- Every merge into the
externalbranch should correspond to a tagged release; this is so that the commit and branching history of thefsl/conda/manifestrepository remains easy to reason about.
Release changelog
As part of the CI pipeline executed when a new FSL release is tagged, a changelog is automatically generated by the generate-changelog job. This changelog contains the merge request and commit history of the FSL projects which were updated in the releese.
Once the FSL release has been published, the generated changelog should be added to the FSL release history section:
- Navigate to the
generate-changelogjob for the relevant CI pipeline in the GitLab web interface at thefsl/conda/manifestrepository. - Download and unzip the
artifacts.zipfile which contains the generated changelog. The file will be calledFSL-<tag>-changelog.md, e.g.FSL-6.0.7-changelog.md. - Edit this file - in particular, a description of newly added or removed packages may need to be manually written.
- Add the changelog to the
docs/development/history/folder in the FSL documentation, and an entry to theindex.mdfile in that directory.
Internal/development FSL releases
Summary:
- New internal FSL releases may be created by adding commits to the
mainbranch of thefsl/conda/manifestrepository - New development releases may be created by adding commits to any branch of the
fsl/conda/manifestrepository - In both cases, the
publish-releasejob on the associated CI pipelines must be started manually.
When commits are added to any branch of this repository, separate manifest.json and environment.yml files are generated from the contents of fsl-release.yml and made available for download. These files are assigned a version identifier of the form <tag>.<date>.<commit>.<branch>, where:
where:
- <tag> is the most recent public FSL release version identifier (e.g 6.0.7).
- <date> is the date of the commit that the files are generated from, in the form YYYYMMDD.
- <commit> is the short hash of the git commit that the files are generated from.
- <branchname> is the name of the branch.
The released files are then named as follows, where:
manifest-<tag>.<date>.<commit>.<branch>.json- the development release manifest filefsl-<tag>.<date>.<commit>.<branch>_<platform>.yml- FSL environment file for platform<platform>.
After they have been generated, the manifest and environment files may be published. As with public releases, the process of publishing the manifest and environment files must be manually triggered through the GitLab web interface, via the publish-release job.
The fslinstaller.py script can be used to install an internal or development release by pointing it towards the relevant manifest file, e.g.:
python fslinstaller.py --manifest https://fsl.fmrib.ox.ac.uk/fsldownloads/fslconda/releases/manifest-6.0.7.20230712.c0942018.6.0.7-release-candidate.json
Associating FSL project versions with FSL release versions
To identify the version of a specific FSL project that was released as part of a specific FSL version:
- Go to the
fsl/conda/manifestrepository. - Select the FSL version tag of interest, and open the
fsl-release.ymlfile. - Look up the version for the project.
FSL release management before FSL 6.0.6
Prior to FSL 6.0.6, FSL releases were managed at the fsl/FslBuildManifests repository. The FSL_SourceManifest.yaml file contained a list of source code repositories and revisions of all FSL projects which comprised a FSL installation. New FSL releases were denoted by a tag on the fsl/FslBuildManifests repository.
The bulk of FSL was built monolithically by hand, using scripts located in the fsl/distbase and mwebster/FslBuilds repositories.
FSL projects and dependencies installed into the embedded fslpython conda environment were built and released independently to the https://fsl.fmrib.ox.ac.uk/fsldownloads/fslconda/channel/ conda channel, or to conda-forge. The versions of these packages were managed at the fsl/post_install repository, in the fslpython_environment.yml file.
For FSL versions prior to 6.0.6, the process followed to identify the version of a specific FSL project that was released as part of a specific FSL version differs depending on whether the project was part of the "core" FSL release, or whether the project was part of the embedded fslpython conda environment. For "core" projects, the process is similar to that described above:
- Go to the
fsl/FslBuildManifestsrepository. - Select the FSL version tag of interest, and open the
FSL_SourceManifest.ymlfile. - Look up the version for the project of interest.
For projects installed in the fslpython environment, follow the above steps for the fsl/post_install project, and then:
- Go to the
fsl/post_installrepository. - Select the
fsl/post_installversion tag of interest, and open thefslpython_environment.ymlfile. - Look up the version for the project of interest.