Release
This page is for the maintainers who cut Vortex releases. It covers the version numbers, the branches, and the tags, and it walks through the checklist that ends with a published release. A project built from Vortex has its own release flow; see Releasing.
Versioning strategy
Vortex uses Semantic Versioning for releases, in
the form MAJOR.MINOR.PATCH.
Semantic version (MAJOR.MINOR.PATCH)
Each part of the version marks a kind of change:
- MAJOR: Breaking changes that require migration or significant updates
- MINOR: New features, backward compatible
- PATCH: Bug fixes, backward compatible
Version examples
These versions show how the parts change:
1.0.0- First major release1.1.0- New features added1.1.1- Bug fix release2.0.0- Breaking changes
Version numbering guidelines
When you create a new release, pick the part to bump from the changes it contains:
- For incompatible breaking changes, bump MAJOR:
- Removing features or configuration options
- Changing default behavior that breaks existing projects
- Updating to new major versions of services or dependencies that require migration
- For features added in a backward compatible manner, bump MINOR:
- Adding new optional features
- Adding new scripts or commands
- Enhancing existing features without breaking changes
- For backward compatible bug fixes, bump PATCH:
- Fixing bugs or errors
- Security patches
- Documentation updates
- Minor improvements that don't change what a feature does
Branch strategy
The repository uses these branches:
main- the current major version under active development, the one that theVORTEX_CURRENT_MAJORrepository variable names2.x- a development branch for an upcoming major version, ahead ofmain(future majors follow the same pattern:3.x,4.x, and so on)1.x- a maintenance branch for a superseded major version, behindmain(for example1.xaftermainholds2.x)
On the publishing side, promoting a new major version is a single action:
set the VORTEX_CURRENT_MAJOR repository variable to its number. It's a
GitHub Actions variable on the drevops/vortex repository, under
Settings > Secrets and variables > Actions, on the Variables tab.
The documentation default and the installer's bare /install URL both
follow it, while the per-major docs and the /v{N}/install pins are always
published.
The workflows read the variable when they run, so changing it doesn't
republish anything. The next Vortex - Release docs run applies it to the
live site and /install; run that workflow by hand to publish straight
away.
When main advances to a new major version, the branches change like this:
- The upcoming major's branch, for example
2.x, merges intomain. - The superseded major continues on its own branch, for example
1.x, for maintenance.
Vortex uses GitHub Flow, with the main branch always holding the
current major version.
Consumer projects created from Vortex should continue to use Git Flow.
Tagging
A release always produces a Vortex tag, and also a
drevops/vortex-tooling tag when the tooling changed. When you create both,
their order is fixed: tag the tooling first, then tag Vortex.
The 2 tags belong to these parts:
drevops/vortex-tooling- the shipped tooling package, split from.vortex/tooling/. A workflow mirrors its branches to the package repository automatically, but you create its tags by hand as part of cutting a release.- Vortex - the template itself.
The following rules apply to every release:
- A release always creates the Vortex tag, with or without tooling changes.
- The
drevops/vortex-toolingrequirement in Vortex's rootcomposer.jsonmust always point at a published tag, never a branch or a development alias. - When
.vortex/tooling/has changed since the previous Vortex release, create and publish the newdrevops/vortex-toolingtag before tagging Vortex. - Vortex pins its tooling requirement to the tagged version's minor.
When you tag the tooling for a release, require that freshly tagged
drevops/vortex-toolingversion in rootcomposer.jsonwith a tilde constraint (for example~1.3.0). The tagged version is the lower bound and the next minor is the exclusive upper bound. Later patch releases within the same minor are still accepted, but the requirement can't float onto a newer minor that was never published with the release.
Release process
The release checklist takes the template from its previous release to a published tag. Follow it in order: later steps regenerate files from the changes that earlier steps make.
Before you begin
Make sure you have the following:
- Push access to
drevops/vortex, and todrevops/vortex-toolingwhen the tooling changed - The Renovate CLI, with a GitHub token that can write to
drevops/vortex - Ahoy, Git, Composer, Node.js with npm and Yarn, and curl on your
PATH, because the steps run them on your machine - PHP 8.3 or later on your machine, for Composer and the PHP scripts that the steps run
- Docker, for the
clicontainer,ahoy update-docs, the snapshot run, and the video recordings - The
.vortex/dependencies, installed withahoy installfrom.vortex/ - The recording tools that Documentation > Documentation videos lists
Cut the release
To release a new version of Vortex, follow these steps:
-
To update all dependencies outside of the schedule, run Renovate locally:
renovate --schedule= --force-cli=true drevops/vortex -
Update the container images to their latest versions.
- After bumping the
uselagoon/solr-9-drupalimage, updatesolr.luceneMatchVersionin.docker/config/solr/config-set/solrcore.propertiesto match the Lucene version bundled in that image (shown by thelucene-core-*.jarfilename inside the image). The value insearch_api_solr's jump-start config-set lags the image, so don't copy it verbatim.
- After bumping the
-
Check that the
@seelinks are working. -
Get the PHP version and the PHP version ID that the
clicontainer runs:docker compose run --rm cli php -r "echo PHP_VERSION . PHP_EOL;"docker compose run --rm cli php -r "echo PHP_VERSION_ID . PHP_EOL;"The commands print the version and its ID, for example
8.4.25and80425. -
In
composer.json, setconfig.platform.phpto the PHP version. -
In
phpcs.xml, settestVersionto the major and minor PHP version, for example8.4. -
In
phpstan.neon, setphpVersionto the PHP version ID. -
If
.vortex/tooling/changed since the previous release, create and publish a newdrevops/vortex-toolingtag now, before the Vortex tag (see Tagging). To check for changes, rungit log PREVIOUS_VERSION..HEAD -- .vortex/tooling, wherePREVIOUS_VERSIONis the previous Vortex tag. The command prints nothing when the tooling didn't change. -
Increment the minor version of all packages in
composer.json: runcomposer update -W && composer bump. -
If you tagged the tooling in step 8, set its version in the 4 places that pin it:
- The
requireconstraint in rootcomposer.json, as a tilde constraint, for example~1.3.0(see Tagging) - The
versionsentry of thepathrepository in rootcomposer.json - The
versionsentry inscripts/vortex-tooling.sh - The
versionsentry in.vortex/tests/phpunit/Traits/SutTrait.php
Then search the repository for the previous tooling version, to catch a pin that this list misses. Without a new tooling tag, keep the existing tag constraint.
- The
-
In
web/themes/custom/your_site_theme/, update the minor versions of the dependencies inpackage.json. Use npm, not Yarn: the theme keeps apackage-lock.json. -
Update
drevops/ci-runnerto its latest version, both the tag and the digest, in every file that pins it by hand:.circleci/config.yml.github/workflows/build-test-deploy.yml.github/workflows/audit.yml.github/workflows/vortex-test-common.yml
-
Update the database cache version in
.circleci/config.ymland.github/workflows/build-test-deploy.yml. The version follows the tag of theuselagoon/*container images, with avprefix:- If this release bumped those images, set it to their new tag, for
example
v26.9.0foruselagoon/php-8.4-cli-drupal:26.9.0. - Otherwise, increment its last segment, for example from
v26.8.0tov26.8.1, to force a cache reset.
- If this release bumped those images, set it to their new tag, for
example
-
Run
cd .vortex && ahoy lint-ci-fixto regenerate.circleci/vortex-test-common.ymland.github/workflows/vortex-test-didi.yml, which carry copies of the runner image and the cache version from.circleci/config.ymland.github/workflows/build-test-deploy.yml. -
Update the documentation with
cd .vortex && ahoy update-docs. -
Commit the changes.
-
Regenerate the installer snapshots with
cd .vortex && ahoy update-snapshots. If the Docker Compose fixtures in.vortex/tests/phpunit/Fixtures/change, the command stops before the installer step: commit them and run it again. It commits the installer fixtures itself. -
Re-record the demo videos with
cd .vortex && ahoy update-videos. -
Commit the recorded videos under
.vortex/docs/static/img/. -
Tag the Vortex release. Pushing the tag runs the
Vortex - Release docsworkflow, which publishes the documentation and the installer. -
Publish the GitHub release, with the following template as its body:
## [VERSION] - [SHORT TITLE]
[Very short summary, 1-3 sentences. E.g. "This release updates the base template to Drupal X.Y, improves the installer UX, and expands documentation for local dev."]
---
## 🔍 Highlights
- [1-3 top-level items that matter most to users]
- [Optional: link to detailed docs if relevant]
---
## 💥 Breaking changes
- [Describe any breaking changes and upgrade steps]
- [If none] None.
---
## What's new since [PREVIOUS_VERSION]
### 🌀 Template
- ✨ **New**
- [New features or major additions in the project template]
- 🛠 **Changed**
- [Improvements, refactors, behavior changes (but not fully breaking)]
- 🐞 **Fixed**
- [Bug fixes]
- ⬆️ **Updated**
- [Dependency bumps, version updates, etc.]
---
### 🧰 Tooling
- [Changes to the `drevops/vortex-tooling` scripts package, with the tag released with this version]
- [If none] None.
---
### 🎛 Installer
- ✨ **New**
- [New installer options, flows, flags]
- 🛠 **Changed**
- [Improved UX, default choices, messages]
- 🐞 **Fixed**
- [Installer bugs, edge cases]
---
### 📖 Documentation
- ✨ **New**
- [New pages, guides, sections]
- 🛠 **Changed**
- [Rewrites, restructuring, clarifications]
- 🐞 **Fixed**
- [Typos, incorrect examples, broken links]
---
## 📋 Release checklist
- [ ] Updated all dependencies outside of the schedule.
- [ ] Updated container images to the latest versions and checked that `@see` links are working.
- [ ] Updated PHP version in `composer.json` for `config.platform`.
- [ ] Updated PHP version in `phpcs.xml` for `testVersion`.
- [ ] Updated PHP version in `phpstan.neon` for `phpVersion`.
- [ ] Tagged `drevops/vortex-tooling` before the Vortex tag when the tooling changed, and required the freshly tagged version with a tilde constraint in `composer.json` so the requirement stays within that version's minor.
- [ ] Updated minor version of all packages in `composer.json`.
- [ ] Updated minor version of dependencies in theme's `package.json`.
- [ ] Updated `drevops/ci-runner` to the latest version in `.circleci/config.yml` and `.github/workflows/build-test-deploy.yml`.
- [ ] Incremented the database cache version in `.circleci/config.yml` and `.github/workflows/build-test-deploy.yml`.
- [ ] Updated documentation.
- [ ] Regenerated the installer snapshots.
- [ ] Re-recorded the demo videos.
- [ ] Tagged the Vortex release.
---
**Full Changelog**: https://github.com/drevops/vortex/compare/[PREVIOUS_VERSION]...[NEW_VERSION]
[CONTRIBUTORS]
Confirm that the release is live: the Vortex - Release docs workflow run
for the tag succeeds, and the published installer reports the new version.
To check the installer, run these commands:
curl -SsL https://www.vortextemplate.com/install > installer.php
php installer.php --version
The second command prints Vortex Installer followed by the tag, for
example Vortex Installer 1.42.0.