Release engineering
This page is for engineers who cut releases of the kernel or of an extension, and for those who need to know what a release guarantees. The rules come from Source control and releases and Compatibility, releases and deployment; the course for extension maintainers is Releasing.
Contents
Lines and versions
mainis the development line.composer.jsonaliases it as6.0.x-dev(extra.branch-alias), and CI runs on it.- The kernel version lives in
lib/version.php(VERSION_MAJOR,VERSION_MINOR,VERSION_RELEASE) and in the database rowezsite_dataezpublish-version, which the update SQL writes. The rootcomposer.jsonhas noversionfield; Composer takes the version from the tag. - Kernel releases are tagged
v6.0.<n>. Tagsv6.0.0tov6.0.14exist; 6.0.15 is the current line after them, released as the tagv6.0.15once it is published. - Extensions are separate Composer packages with their own versions.
Choosing a number: Version numbers and immutable tags.
Before you tag
A tag is cheap to get right and impossible to correct. Before tagging:
- To do: The working tree is clean.
- To do: Quality and PHPUnit are green on the commit you will tag (CI gates).
- To do: The version fields are bumped in the commit the tag points to.
- To do:
share/filelist.md5matches the files (php bin/php/checkmanifest.php --all). - To do: The changelog page for the version exists (Changelogs and upgrade notes).
- To do: Every upgrade-relevant change has its page in
doc/eng-us/bc/. - To do: Build artifacts committed to the repository match their sources.
Releasing an extension
Every release writes its number into the extension, in the commit the tag points to:
- Choose the number from what is already published.
- Set
'Version'inezinfo.phpand<metadata><version>inextension.xmlto it, without thevprefix (tagv1.8.4gives1.8.4). Never leave//autogentag//ordev-master. Both files also state the license and aninfo_urlon the extension's public repository. - Move any other version field the repository keeps (
versionin itscomposer.json, the header of its ownshare/filelist.md5) and refresh that manifest's checksums. - Check:
php -l ezinfo.phpandxmllint --noout extension.xml. - Commit, then tag that commit, then push both. Never tag first and bump afterwards.
Extensions shipped inside the kernel repository carry the kernel's version. The about page reads both files (About and package pages, Extension metadata).
Publishing
- GitHub release: made from the tag, with notes taken from the changelog (GitHub releases and release notes).
- Packagist: each
se7enxweb/*repository is a Composer package. A webhook on the GitHub repository tells Packagist about new tags; a package without it stays at an old version until updated by hand (The Packagist webhook). - Repinning the root: release the extension, see the version on Packagist, then commit the root's new constraint. The push gate refuses a constraint Packagist cannot satisfy yet, because CI's install would fail on every leg.
When a release is bad
Do not move, delete or re-cut the tag, and do not replace the release's assets. Publish the next version with the fix, and say plainly in its notes what was wrong with the previous one. Consumers who pin ranges pick up the new version; nobody is helped by a hole in the history.
Related pages
- The release checklist
- Versions and releases, for application creators
- Dependency management with Composer
- Free documentation: this page is free to copy, translate and improve under the GNU FDL 1.3.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.